50

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

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。哪个更适合处理?

谢谢你的建议。

4

11 回答 11

72

好吧,我个人不使用数字数据类型来存储电话号码或相关信息。

你如何存储一个数字,比如 001234567?它将以 1234567 结束,失去前导零。

当然,您可以随时将其填充,但前提是您确切知道该数字应该是多少位数。

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

于 2009-12-04T11:06:25.743 回答
51

实际上,您可以使用 varchar 作为电话号码。您不需要 int,因为您不会对数字执行算术运算。

于 2009-12-04T11:05:31.750 回答
31

将它们存储为电话号码的两个字段 - “数字”和“掩码”作为不需要超过 255 个项目TinyText的类型。

在我们存储文件之前,我们解析电话号码以获取已使用的格式并创建掩码,然后我们仅将数字存储为数字,例如

输入: (0123) 456 7890
数字:01234567890
掩码: (nnnn)_nnn_nnnn

从理论上讲,这允许我们在 Number 字段上执行比较搜索,例如获取以特定区号开头的所有电话号码,而不必担心用户是如何输入的

于 2009-12-04T11:44:21.653 回答
24

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

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

+441234567890
+44 (0)1234 567890
01234 567890

等将存储为441234567890.

于 2010-09-12T15:57:39.363 回答
7

我会使用 varchar 作为电话号码。这样您还可以存储 + 和 (),这有时会在电话号码中看到(正如您自己提到的)。而且您不必担心用完整数中的所有位。

于 2009-12-04T11:06:15.163 回答
5

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

于 2009-12-04T11:06:15.307 回答
3

如果存储少于 1 百万条记录,并且高性能不是问题,请使用 varchar(20)/char(20) 否则我发现即使存储 1 亿部全球商务电话或个人电话,int 也是最好的。原因:更小的键 -> 更高的读/写速度,格式化也可以允许重复。

char(20) 中的 1 个电话 = 20 字节 vs 8 字节bigint(或int本地电话 10 字节 vs 4 字节,最多 9 位),更少的条目可以进入索引块 => 更多块 => 更多搜索,请参阅了解更多信息(为 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 是最佳选择。

于 2013-02-24T14:28:22.913 回答
3

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

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

于 2016-02-06T02:09:16.823 回答
3

INT(10) 不是一个 10 位的数字,而是一个显示宽度为 10 位的整数。MySQL 中 INT 的最大值为 2147483647(如果无符号,则为 4294967295)。

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

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

于 2016-03-09T11:06:37.723 回答
1

我猜 varchar 或 text 应该是存储手机号码的最佳数据类型。

于 2015-08-04T05:37:03.177 回答
0

您可以使用KeyPress事件将输入限制为字段中的数字,然后在插入时在Insert Into Table命令中添加 +。

轻松修复

于 2021-10-26T21:57:51.677 回答