数据库设计-电话号码长度

1.StackOverflow的建议

当我们设计电话号码在数据库中如何存储的时候,如果只是存储国内的电话号码,这个长度只需要11即可,考虑未来可能会变长或者加上横杠井号之类的内容,可以设置成varchar(15)。当然座机也可以包含在内。但是如果需要做到国际化,包含各个国家的电话号码,还要包含区号,就比较复杂了,需要慎重考虑。

根据What's the longest possible worldwide phone number I should consider in SQL varchar(length) for phone中的讨论,我们基本可以确定,如果存储除核心号码以外的其他内容,还是需要稳妥一点的。应该参照第一个答案:

2.关于核心号码长度

另外,为什么核心号码长度不会超过15,这个是参照一个规范的,这个规范叫:ITU-T recommendation E.164,这个名字有点怪,它还有一个名字叫:《The international public telecommunication numbering plan》。当然,这个规范是一种国际上的推荐,如果有一个地区就是不按照这个推荐的方式你也没有办法。 在这篇文档中,有一个表格总结了号码长度,如下:

3.总结

3.1.推荐值

如果不考虑很久远的未来的情况。一般来说,varchar(20),就够用(包括存储特殊字符:+ -)。为什么是20呢?,参照下面的分层结构图:

再参照国际长途如何拨号及常用国际字冠

在国内打国际电话,最长需要:国际冠码+国际区号+被叫城市区号+被叫电话。示例为:0011-86-768-6672211,其中的00只是从中国打去外国时,中国的国际字冠.假设我们存储这个冗长的号码为0011-86-768-6672211,其刚好为19位长,由于其核心号码长度为12,若核心号码达到了最长的15,则长度就到达了22。当然了,我们一般不存储国际冠码,所以一般这个串我们存储成86-768-6672211,依旧,其核心号码长度为12,若是达到了15,则长度为17。故20可以容纳。

当然,如果我们需要发送短信,可以暂时不考虑座机的情况,直接考虑国际字冠—国际长途区号—手机号码(移动电话)的格式,一般情况下,我们只存储国际长途区号和手机号码。即存储国际长途区号—手机号码(移动电话),此情况下,也只有16位长。故20也可以容纳。

至于为何选用20,只是方便座机增加一个不长的分机号,例如:86-768-6672211234#10,不过一般这样类型的座机电话不利于我们通知用户,只是由此考虑,才定为20.如果只考虑智能机,目前来看16位足矣。

3.2.只存储核心号码

您可以使用char(15),只存储核心号码。但是这是有风险的,请看下面这张图,我们的国际电报电话咨询委员会制定规则是有一个演化图的,这个规则可不是一成不变的:

3.3.更加稳妥的设计方案

若是您考虑到尽可能多的情况,甚至于一些不符合规范的情况。也许您还考虑到座机,后面可能出现冗长的分机号,需要存储井号。我们可以使用稳妥的方案,即varchar(30)。如您非常悲观,考虑到手机号码将会很长,选用varchar(50)吧。

                                                <div class="ad-wrap">
                                                    <div id="blog-title-ad">

                                    </div>
                                        </div>
发布了74 篇原创文章 · 获赞 23 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shenshaoming/article/details/102801719