mysql 中电话号码_类型-电话号码和地址的mysql数据类型

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

1个char(20)的电话= 20字节vs 8字节bigint(或者本地电话为10 vs 4字节int,最多9位数字),更少的条目可以输入索引块=>更多的块=>更多的搜索,请参见 更多信息(为Mysql编写,但对于其他关系数据库应该为true)。

这是电话表的示例:

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是最佳选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值