我想在表格中输入电话号码,包括国家代码,分机号
create table if not exists employee( `
country_code_tel int(11),
tel_number int(10),
extension int(10),
mobile bigint(20)
);
如果tel_number大于15位,我可以使用哪种数据类型,我最好使用Bigint(20)
?
create table address(
address varchar(255),
city varchar(255),
country varchar(255),
post_code int(11)
);
例如,如果我有加拿大的国家代码,我可以使用+2或002.哪种处理更好?
感谢您的建议。
答案 0 :(得分:67)
好吧,我个人不使用数字数据类型来存储电话号码或相关信息。
你怎么存储一个数字说001234567?它最终会以1234567结束,失去领先的零。
当然,您可以随时将其填充,但这样可以确切地知道该数字应该是多少位数。
这不回答你的整个帖子,
只差我2美分
答案 1 :(得分:46)
实际上,您可以将varchar用于电话号码。你不需要int,因为你不打算对数字进行算术运算。
答案 2 :(得分:31)
将它们存储为电话号码的两个字段 - “{”和“掩码”为TinyText
类型,不需要超过255个项目。
在我们存储文件之前,我们解析电话号码以获取已使用的格式并创建掩码,然后我们将数字存储为仅数字。
输入:(0123) 456 7890
编号:01234567890
面具:(nnnn)_nnn_nnnn
理论上,这允许我们在Number字段上执行比较搜索,例如获取以特定区号开头的所有电话号码,而不必担心用户输入的方式
答案 3 :(得分:24)
我通常将电话号码存储为E164格式的BIGINT。
E164永远不会以0开头,前几位是国家代码。
+441234567890
+44 (0)1234 567890
01234 567890
等。将存储为441234567890
。
答案 4 :(得分:7)
我会使用varchar作为电话号码。这样你也可以存储+和(),有时可以在电话号码中看到(正如你自己提到的)。而且您不必担心使用整数中的所有位。
答案 5 :(得分:5)
我不确定使用整数是否是个好主意。某些数字可能包含特殊字符(例如,#作为扩展名的一部分),您也应该能够处理它们。所以我建议改用varchars。
答案 6 :(得分:3)
如果存储少于1密耳的记录,并且高性能不是问题,请去varchar(20)/ char(20),否则我发现即使存储100亿个全球商务电话或个人电话,int也是最好的。原因:小键 - >更高的读/写速度,格式化也可以允许重复。
1个电话在char(20)= 20个字节vs 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 Hash Codes。如果存储E164电话,bigint是最佳选择。
答案 7 :(得分:3)
考虑规范化为E.164格式。要获得完整的国际支持,您需要一个15位的VARCHAR。
有关电话号码本地化的详细信息,请参阅Twilio's recommendation。
答案 8 :(得分:2)
INT(10)不是指10位数字,它表示显示宽度为10位的整数。 MySQL中INT的最大值是2147483647(如果是无符号,则为4294967295)。
您可以使用BIGINT而不是INT将其存储为数字。运用 BIGINT将在VARCHAR(10)上为每行节省3个字节。
分别存储"国家+地区+号码"。您可以尝试使用VARCHAR(20),这样您就可以在需要时正确存储国际电话号码。
答案 9 :(得分:1)
我认为varchar或text应该是存储移动号码的最佳数据类型。