如何在MySQL数据库上存储电话号码? [重复]

问题描述 投票:70回答:11

可能重复: mysql datatype for telephne number and address

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

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

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

mysql string database-design formatting int
11个回答
148
投票
  • 全部为varchar(它们不是数字而是“数字集合”)
  • 国家+地区+号码分开
  • 并非所有国家/地区都有区号(例如我所在的马耳他)
  • 拨打内部时,某些国家/地区会从区号中删除前导零(例如英国)
  • 客户端代码中的格式

-2
投票

您可以使用varchar存储电话号码,因此无需删除格式


-4
投票

我会说将它们存储为一个大整数,因为电话号码本身只是一个数字。这也可以让您在以后根据自己的情况更灵活地显示电话号码。


28
投票

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

搜索具有混合格式的电话号码几乎是不可能的。

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

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

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

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


11
投票

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

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

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


9
投票

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


4
投票

我建议使用电话号码的varchar(因为已知电话号码具有前导0,这对于保持很重要)并且电话号码在两个字段中:

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

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

我认为没有一般的正确和错误的方法来做到这一点。这实际上取决于需求。


1
投票

我建议将这些数字存储在varchar类型的列中 - 每个“字段”一列(如contry code等)。

当您与用户交互时应该应用格式...这样可以更容易地考虑格式更改,例如并且有助于esp。当你的申请走向国际时......


1
投票

从我的观点来看,以下是我的建议:

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

1
投票

建议您将数字存储为由您希望接受的字符组成的扩展字母数字,并将其存储在varchar(32)或类似内容中。删除所有空格,短划线等。将电话号码的格式化放入单独的字段(可能从区域设置首选项中收集)如果您希望支持扩展,则应将它们添加到单独的字段中;


0
投票

我肯定会拆分它们。按区域代码和contry代码对数字进行排序很容易。但即使您不打算拆分,只需以特定格式将数字插入数据库即可。例如1-555-555-1212您的客户方将感谢您不重新格式化您的号码。

© www.soinside.com 2019 - 2024. All rights reserved.