什么是我应该在SQL varchar(长度)手机中考虑的最长的全球电话号码

Shi*_*mmy 187 sql-server validation database-design data-modeling phone-number

什么是我在SQL varchar(length)手机中应该考虑的最长的全球电话号码.

注意事项:

  • +国家代码
  • ()用于区号
  • 扩展扩展的x + 6个数字(所以使其为8 {space})
  • 组之间的空格(即美国电话+ x xxx xxx xxxx = 3个空格)
  • 这是我需要你帮助的地方,我希望它能在全世界范围内使用

考虑到现在我的特殊情况,我不需要卡等.号码以国家代码开头,以扩展名结尾,没有传真/电话等评论,也不需要电话卡.

Mat*_*ght 156

假设你没有存储像'+','()',' - ',空格和你有什么的东西(为什么你会这些,它们是表现性的问题,根据当地习俗和网络分布而有所不同(无论如何),国际电话网络(大多数国家网络通过其连接)的ITU-T建议E.164规定了整个号码(包括国家代码,但不包括拨出所需的国际呼叫前缀等前缀,因国家/地区而异,也不包括后缀,如PBX分机号码,最多15个字符.

呼叫前缀取决于呼叫者,而不是被呼叫者,因此不应(在许多情况下)存储电话号码.如果数据库存储个人地址簿的数据(在这种情况下存储国际呼叫前缀是有意义的),在芬兰,您必须处理的最长国际前缀(根据维基百科)目前是5位数.

至于后缀,一些PBX支持多达11位数的扩展(同样,根据维基百科).由于PBX分机号码是不同拨号方案的一部分(PBX与电话公司的交换机是分开的),因此分机号码需要与电话号码区分开来,可以使用分隔符或将它们存储在不同的列中.

  • 底线:`15`字符.如果存储前缀和后缀,则底线为:5 + 15 + 11 =`31`. (29认同)
  • 如果您没有存储格式字符(例如'+','(',')',' - '和''),并且您要存储来自不同国家/地区的数字,则可能需要添加一列来指示格式显示数字时的数字类型. (5认同)
  • '+'不是表现性的https://en.wikipedia.org/wiki/List_of_international_call_prefixes (4认同)
  • @MattEnright,我想你应该更新AlikElzin的[评论](http://stackoverflow.com/questions/723587/whats-the-longest-possible-worldwide-phone-number-i-should-consider-in-sql-varc ?noredirect = 1#comment40058364_4729239)在你的回答中. (3认同)

cle*_*tus 72

好吧,考虑到varchar(30)和varchar(100)之间没有开销差异,如果你每个只存储20个字符,那么谨慎一点,只需要50.

  • 普遍的概括甚至更糟.设计一个考虑了优化的系统是**永远不会**_evil_ _per_ _se_ - 如果将过多的时间用于不必要的,不明显的和次要的效率,优化就变得邪恶. (64认同)
  • 只是为了知识:所以当IS有任何开销?请在答案中加入一个来源,以便我们继续学习它的基础知识. (21认同)
  • 过早优化是万恶之源. (14认同)
  • 两种色谱柱尺寸之间没有**存储大小**差异.很可能是开销,重要或其他,具体取决于您的特定数据库.例如,SQL Server失去了很多预测数据页面大小和优化访问和对齐的能力.一如既往,测试. (12认同)
  • 我知道应该是这样,但并非总是如此.在MySQL(例如)中,全长用于排序.最好至少应用一些最小的努力. (5认同)
  • 例如,使用CHAR时。SQL Server文档(亲自阅读)完全表明,实际上不使用varchar中未使用的大小,即,未使用的char的开销为0。 (2认同)

Kev*_*imm 17

在GSM规范3GPP TS 11.11中,在MSISDN EF(6F40)中为"拨号号码"留出了10个字节.由于这是电话号码的GSM表示,并且它的使用是半字节交换,(并且总是有括号的可能性)22个字符的数据应该是充足的.

根据我的经验,只有一个开/闭括号的例子,这是我对上述原因的推理.


web*_*ber 10

这有点糟糕,我使用国际电话的电话卡,所以它在美国的本地号码+帐号#(6位)+ pin(4位)+"暂停"+你上面描述的.

我怀疑可能还有其他情况

  • 但是,电话卡重拨不应该在数据库中 - 这是根据拨号规则拨号时添加的部分.存储的号码应采用ISO格式,不得有任何拨号相关信息. (9认同)
  • 您的观点很好。我在味精中添加了几行,请阅读 (2认同)

Gui*_*eim 6

至于“电话号码”,您应该真正考虑“订户号码”和“拨号号码”之间的区别以及它们可能的格式选项。

用户号码通常在国家编号计划中定义。这个问题本身通过提及许多国家没有的“区号”来表明与国家观点的关系。国际电联汇总了世界编号计划并发布了建议 E.164,其中发现国家编号最多有 12 位数字。对于由 1 到 3 位数字的国家/地区代码定义的国际直拨电话 (DDD),他们添加了最多 15 位数字......而无需格式化。

拨号号码是另一回事,因为有网络元素可以解释电话号码中的额外值。您可能会想到应答机和设置呼叫转移参数的号码代码。由于它可能包含另一个订户号码,因此它必须明显长于其基值。RFC 4715 预留了 20 个 bcd 编码字节用于“子寻址”。

如果您转向技术限制,那么情况会变得更加严重,因为在 3GPP 标准(如 GSM)和 ISDN 标准(如 DSS1)中,订户号码在 10 个 bcd 编码字节内有技术限制。它们有一个单独的 TON/NPI 字节作为前缀(号码类型/号码计划指示符),E.164 建议使用“+”编写,但许多号码计划将其定义为最多可拨打 4 个号码。

因此,如果您想面向未来(许多软件系统会意外地运行几十年),您需要考虑订阅者号码的 24 位数字和拨号号码的 64 位数字作为限制……而无需格式化。添加格式可能会为每个数字添加大约一个额外的字符。因此,最后的想法是,以任何方式限制数据库中的电话号码并为用户体验设计师留下较短的限制可能不是一个好主意。