我想以表格形式输入电话号码,包括国家代码、分机号

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。哪个更适合加工?

谢谢你的建议。

有帮助吗?

解决方案

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

如何存储 001234567 这样的数字?最终结果为 1234567,丢失了前导零。

当然,您始终可以向左填充它,但前提是您确切知道该数字应该有多少位。

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

其他提示

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

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

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

输入: (0123) 456 7890
数字: 01234567890
面具: (nnnn)_nnn_nnnn

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

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

E164 永远不会以 0 开头,前几位数字是国家/地区代码。

+441234567890
+44 (0)1234 567890
01234 567890

ETC。将被存储为 441234567890.

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

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

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

1 个电话 in char(20) = 20 字节 vs 8 字节 bigint (或 10 与 4 字节 int 对于本地电话,最多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 是最好的选择。

考虑标准化为 E.164 格式。要获得完整的国际支持,您需要 15 位数字的 VARCHAR。

Twilio 的推荐 有关电话号码本地化的更多信息。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top