mysql数据类型,用于电话号码和地址

时间:2009-12-04 11:00:50

标签: mysql types phone-number street-address

我想在表格中输入电话号码,包括国家代码,分机号

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.哪种处理更好?

感谢您的建议。

10 个答案:

答案 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应该是存储移动号码的最佳数据类型。