mysql数据types的电话号码和地址

我想用一个表格input电话号码,包括国家代码,分机号码

create table if not exists employee( ` country_code_tel int(11), tel_number int(10), extension int(10), mobile bigint(20) ); 

如果tel_number大于15位,我可以使用哪种数据types,我最好使用Bigint(20)

 create table address( address varchar(255), city varchar(255), country varchar(255), post_code int(11) ); 

例如,如果我有加拿大的国家代码,我可以使用+2或002.哪个更适合处理?

谢谢你的build议。

那么,我个人不使用数字数据types来存储电话号码或相关信息。

你怎么存储一个数字说001234567? 它将最终成为1234567,失去领先的零。

当然,你总是可以左键填充它,但是这提供了你确切的数字应该是多less个数字。

这不能回答你的整个post,
只是我2美分

其实你可以使用varchar作为电话号码。 你不需要int,因为你不打算对数字进行算术运算。

只需添加我的2p的真实世界的经验。

我们存储电话号码的2个字段 – “号码”和“掩码”。 这两个都存储为TinyTexttypes

在我们存储文件之前,我们parsing电话号码以获得已经使用的格式并创build掩码,然后我们将数字仅存储在数字中,例如

input: (0123) 456 7890
号码: 01234567890
掩码: (nnnn)_nnn_nnnn

理论上这允许我们在数字字段执行比较search,例如获得以特定区号开始的所有电话号码,而不必担心用户如何input

我通常将电话号码存储为E164格式的BIGINT。

E164从不以0开始,前几位是国家代码。

 +441234567890 +44 (0)1234 567890 01234 567890 

等等将被存储为441234567890

我会使用一个varchar电话号码。 这样你也可以存储+和(),有时在电话号码中可以看到(如你自己提到的)。 你不必担心用整数中的所有位。

我不确定使用整数是个好主意。 有些数字可能包含特殊字符(例如#作为扩展的一部分),您应该也可以处理这些字符。 所以我会build议使用varchars来代替。

如果存储less于1密尔的logging,高性能不是问题去varchar(20)/焦(20),否则我发现,即使存储甚至1万亿的全球商业电话或个人电话,int是最好的。 原因:更小的关键 – >更高的读写速度,也格式化可以允许重复。

1个电话在char(20)= 20个字节对8个字节bigint (或10对比4个字节int为本地电话,最多9个数字),较less的条目可以进入索引块=>更多块=>更多search更多信息(为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 ; 

另外“电话号码不是数字”,在我看来是相对于电话号码的types。 如果我们正在谈论一个内部手机电话簿,那么string是好的,因为用户可能希望存储GSM哈希码 。 如果存储E164手机,bigint是最好的select。

考虑正常化为E.164格式。 要获得全面的国际支持,您需要一个15位数的VARCHAR。

有关电话号码本地化的更多信息,请参阅Twilio的build议 。

INT(10)不是10位数字,而是10位数的整数。 MySQL中INT的最大值是2147483647(如果没有签名,则为4294967295)。

您可以使用BIGINT而不是INT将其存储为数字。 使用BIGINT将在VARCHAR(10)上每行节省3个字节。

分别存储“国家+地区+号码”。 您可以尝试使用VARCHAR(20),这样可以在需要时正确存储国际电话号码。

varchar或文本应该是最好的数据types来存储手机号码我猜。