Если хранится менее 1 млн. Записей, а высокая производительность не является проблемой, используйте varchar (20) / char (20), в противном случае я обнаружил, что для хранения даже 100 млн. Глобальных бизнес-телефонов или персональных телефонов лучше использовать int. , Причина: меньший ключ -> более высокая скорость чтения / записи, также форматирование может допускать дубликаты.
1 телефон в символе (20) = 20 байтов против 8 байтов bigint
(или 10 против 4 байтов int
для локальных телефонов, до 9 цифр), меньше записей может входить в индексный блок => больше блоков = > больше запросов, смотрите this для получения дополнительной информации (написано для Mysql, но это должно быть верно для других реляционных баз данных).
Вот пример телефонных таблиц:
CREATE TABLE `phoneNrs` (
`internationalTelNr` bigint(20) unsigned NOT NULL COMMENT 'full number, no leading 00 or +, up to 19 digits, E164 format',
`format` varchar(40) NOT NULL COMMENT 'ex: (+NN) NNN NNN NNN, optional',
PRIMARY KEY (`internationalTelNr`)
)
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin
или с обработкой / разбиением перед вставкой (2 + 2 + 4 + 1 = 9 байт)
CREATE TABLE `phoneNrs` (
`countryPrefix` SMALLINT unsigned NOT NULL COMMENT 'countryCode with no leading 00 or +, up to 4 digits',
`countyPrefix` SMALLINT unsigned NOT NULL COMMENT 'countyCode with no leading 0, could be missing for short number format, up to 4 digits',
`localTelNr` int unsigned NOT NULL COMMENT 'local number, up to 9 digits',
`localLeadingZeros` tinyint unsigned NOT NULL COMMENT 'used to reconstruct leading 0, IF(localLeadingZeros>0;LPAD(localTelNr,localLeadingZeros+LENGTH(localTelNr),'0');localTelNr)',
PRIMARY KEY (`countryPrefix`,`countyPrefix`,`localLeadingZeros`,`localTelNr`) -- ordered for fast inserts
)
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin
;
Также «номер телефона не является номером», по моему мнению, относительно типа телефонных номеров. Если мы говорим о внутренней телефонной книге для мобильных устройств, то все в порядке, поскольку пользователь может пожелать сохранить хэш-коды GSM . При хранении телефонов E164 лучшим вариантом является bigint.