MySQL – 如何存储电话号码?

可能重复:
电话号码和地址的mysql数据types

有关将电话号码存储在数据库中的最佳做法的build议? 考虑一个美国的电话号码:

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

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

  • 所有作为varchar(他们不是数字,但“数字集合”)
  • 国家+地区+号码分开
  • 并不是所有的国家都有区号(例如我在哪里的马耳他)
  • 有些国家在拨打内线(例如英国)时会从地区代码中删除前导零,
  • 在客户端代码中格式化

你不应该用格式存储值。 格式化应根据用户的喜好在视图中完成。

search混合格式的电话号码几乎是不可能的。

对于这种情况下,我将分割成字段和存储为整数。 数字比文本更快并且将它们分开并在其上放置索引使所有types的查询运行得更快。

领导0可能是一个问题,但可能不是。 在瑞典,所有地区代码都以0开头,如果拨打国家代码,也将被删除。 但是0并不是数字的一部分,它是一个用来表示我正在添加区号的指示符。 同样的国家代码,你加00说你使用县代码。

领导0不应该被存储,他们应该被添加在需要的时候。 假设您将00存储在数据库中,并且您使用的服务器只能与+一起使用,您必须将00replace为该应用程序的+。

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

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

您也可以考虑为电话号码所在的国家/地区另存字段,因为根据您所查看的电话号码可能很难计算出来。 英国使用11位数字,一些非洲国家使用7位数字。

也就是说,我曾经为一家英国电话公司工作,并根据他们是英国人还是国际人士,将电话号码存储在我们的数据库中。 所以英国的电话号码是02081234123,国际号码是001800300300。

varchar,不要存储分隔字符,你可能想为不同的用途格式化电话号码。 所以存储(619)123-4567作为6191234567我使用电话号码簿数据,并发现这是最好的做法。

我会build议一个电话号码的varchar(因为电话号码已知有前导0是重要的保留),并在两个领域的电话号码:

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

但是它可能是非常特定于应用程序的 例如,如果您只存储美国号码,并希望保持快速执行查询的能力,例如“从特定区域获取所有号码”,则可以进一步拆分电话号码字段(并丢弃国家代码字段冗余)

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

我build议将这些数据存储在types为varchar的列中 – 每个“字段”一列(如contry代码等)。

格式应该在与用户进行交互时应用……这样可以更轻松地考虑格式更改,例如,这将有助于esp。 当你的应用程序走向国际…

build议您将该号码存储为由您希望接受的字符组成的扩展字母数字,并将其存储在varchar(32)或类似的字符中。 去掉所有空格,破折号等。将电话号码的格式放入一个单独的字段(可能从语言环境首选项中获得)。如果您希望支持扩展名,则应将其添加到单独的字段中;

从我的观点来看,下面是我的build议:

  1. 将电话号码作为varchar存储在单个字段中,并且在相应地检索拆分后需要拆分。
  2. 如果存储为数字,则前面的0将截断,因此始终将其存储为varchar
  3. 在插入表格之前validation用户的电话号码。

我肯定会分裂他们。 按地区代码和代码对数字进行sorting很容易。 但即使你不打算拆分,只需要以一种特定的格式将数字插入到数据库中。 例如:1-555-555-1212您的客户端将不会重新格式化您的号码,感谢您。

你可以使用varchar来存储电话号码,所以你不需要删除格式

我会说,将它们存储为一个大整数,因为电话号码本身就是一个数字。 这也给了你更多的灵活性,在以后如何显示你的电话号码,这取决于你在什么情况下。