如果存储少于100万条记录,而高性能不是问题,那么就使用varchar(20)/ char(20),否则我发现对于存储甚至1亿部全球商务电话或个人电话,int都是最好的。 原因:较小的键->较高的读/写速度,格式化也可以允许重复。
1个char(20)的电话= 20字节vs 8字节bigint(或者本地电话为10 vs 4字节int,最多9位数字),更少的条目可以输入索引块=>更多的块=>更多的搜索,请参见 更多信息(为Mysql编写,但对于其他关系数据库应该为true)。
这是电话表的示例:
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是最佳选择。