MySQL - 如何存储电话号码?

Sta*_*bie 77 mysql string int formatting database-design

可能重复:
telephne号码和地址的mysql数据类型

有关在电子邮件中存储电话号码的最佳做法的建议吗?考虑一下美国电话号码:

  • 555 555 1212
  • 555-555-1212
  • (555)555 1212
  • 5555551212
  • 1-555-555-1212
  • 1(555)555-1212
  • 等等 ...

我应该删除格式并仅存储数字吗?我应该只使用一个字段 - 或将它们分成:国家代码,区号,电话号码等?建议?

gbn*_*gbn 152

  • 全部为varchar(它们不是数字而是"数字集合")
  • 国家+地区+号码分开
  • 并非所有国家/地区都有区号(例如我所在的马耳他)
  • 拨打内部时,某些国家/地区会从区号中删除前导零(例如英国)
  • 客户端代码中的格式

  • +1表示"他们不是数字". (79认同)
  • @Andreas Wederbrand:您是否添加或减去或舍入或模数电话号码?没有. (7认同)
  • @gbn这让我感到虚伪.如果您选择不对不突然使其不是数字的数字执行算术运算.这就像说一个自动递增的代理主键不是一个数字只是因为它的值没有算术意义,只有它的唯一性.最终它只是语义 - "数字"的给定定义是否适用于当前的情况或决策.是否将其定义为"数字"只是在表面上决定如何存储它. (6认同)
  • @Andreas手机中的所有电话号码都包含+号.+号不是数字.我的电话号码不是(555)123-4567,它是+15551234567,我父母的电话号码不是02134 123456,而是+492134123456.那些字段不是数字. (3认同)
  • @StefanKarlsson:你为什么要添加这个评论? (3认同)
  • 我们最近有一个与此类似的需求。经过分析,我们决定将其存储在 4 个不同的 varchar 字段中:州代码、区号、号码和分机号(长度为 5,可选)。如果您愿意,可以为国家/地区添加单独的字段。 (2认同)
  • 我的用例是使用 Twilio。他们建议使用称为 E.164 标准的 *标准* 存储方式,以便所有数字都采用相同的格式。 (2认同)

And*_*and 29

您永远不应该使用格式存储值.应根据用户首选项在视图中进行格式化.

搜索混合格式的手机nunbers几乎是不可能的.

对于这种情况,我将拆分为字段并存储为整数.数字比文本更快并且分割它们并且将索引放在它们上使得所有类型的查询都快速运行.

领先0可能是一个问题,但可能不是.在瑞典,所有区号都以0开头,如果拨打国家代码,也会删除.但是0并不是数字的一部分,它是一个指示器,用于表示我正在添加区号.对于国家/地区代码,您添加00表示您使用县代码.

不应存储前导0,应在需要时添加它们.假设您将00存储在数据库中,并且您使用的服务器仅适用于+,您必须将+替换为该应用程序的00.

所以,将数字存储为数字.

  • 这可能是真的,但它们是所有字符的非常明确的子集,即与10个数字对应的那些字符.布尔也不是0或1,但我们通常将它们存储为tinyint(1).无论哪种方式,我觉得我已经给出了我的意见,OP可能已经足够做出决定:) (4认同)
  • 当然这取决于应用程序,但数字应该存储为数字:)没有任何收获保持为varchar. (2认同)

Ste*_*uts 12

我建议将数字存储在varchar中而不进行格式化.然后,您可以恰当地重新格式化客户端上的数字.有些文化喜欢用不同的电话编号; 在法国,他们写的电话号码是01-22-33-44-55.

您可能还会考虑为电话号码所在的国家/地区存储另一个字段,因为根据您查看的数字很难确定.英国使用11位数的长数,一些非洲国家使用7位数的长数.

也就是说,我曾经为一家英国电话公司工作,我们根据英国或国际电话号码将电话号码存储在我们的数据库中.因此,英国的电话号码为02081234123,国际电话号码为001800300300.

  • 好吧,我们使用了VARCHAR(20).我们存储了世界上每个国家的数字,20个是公司的标准.255似乎比我建议的要大得多,特别是对于静态字段格式. (2认同)

Sur*_*Joe 9

varchar,不要存储您可能希望以不同用途格式化电话号码的分隔字符.所以商店(619)123-4567 as 6191234567我使用电话簿数据,并发现这是最好的做法.


apo*_*fos 5

我建议对电话号码使用 varchar (因为已知电话号码有前导 0,保留这一点很重要)并将电话号码放在两个字段中:

国家代码和电话号码,即004477789787您可以存储 CountryCode=44 和电话号码=77789787

然而,它可能是非常特定于应用的。例如,如果您只存储美国号码并希望保持快速执行查询(例如“获取特定区域的所有号码”)的能力,那么您可以进一步拆分电话号码字段(并删除国家/地区代码字段,因为它会是这样)多余的)

我不认为这样做有一个普遍的正确和错误的方法。这实际上取决于需求。