最好将手机存放在三个领域还是一个?

时间:2011-02-16 15:52:41

标签: php mysql phone-number

我正在努力决定分离存储在MySQL数据库中的电话号码。

有一种想法是打破电话:

  • 区号(123)
  • 前缀(123)
  • 后缀(1234)

另一种方法是简单地将文件放在一个字段中,并使用适当的格式:

  • 123456789
  • (123)123-4567
  • 123-456-7890

我认为第一个更好的最初原因是能够根据从我们的成员收集的电话号码快速轻松地收集统计数据(例如,X个成员有123个区号)。

真的有'正确'的方法吗?我确实意识到与PHP配对我可以以任何我想要的方式检索和重新格式化,但我想使用最佳实践。

感谢您的建议

修改

我暂时只存储北美电话号码

8 个答案:

答案 0 :(得分:7)

我为一个字段投票,在您放入数据时对其进行处理,使其处于已知格式。我尝试了两种方法,而且单场方法似乎总体上产生的代码更少。

答案 1 :(得分:2)

您希望以最有效的方式在数据库中存储它,正是因为它很容易在PHP中重新格式化。转到全数字字段,没有分隔符(1231231234),因为这是最好的方法。如果您有国际电话号码,也请添加国家/地区代码。然后在您的代码中,您可以使用正则表达式对其进行格式化以查找您想要的内容。

答案 2 :(得分:2)

我会将电话号码存储为字符串,而非数字。

电话号码是碰巧使用数字的标识符。 以零开头的电话号码有效,但可能被编程语言解释为八进制。

将电话号码剥离为仅数字,并将分机存储在单独的字段中。

这样可以在以后进行统一格式化。

对于美国,请删除前缀“1”数字(并根据字符串的长度确定格式(美国为10位数))。

答案 3 :(得分:2)

我正在构建一个callcenter应用程序(它管理一组分布式调用者联系人的联系信息队列),并且该体系结构指定了一个字段,没有空格,破折号等。经过相当多的分析,我同意这似乎是最好的。

基于电话号码(撇号,点,短划线和每个组合)的输入的可变性,我构建了一个简单的函数来处理用户输入,除了数字本身之外的所有数据,还有一个“重建者”将原始数字重新格式化为对用户更具视觉吸引力的内容。

因为他们对我很有帮助,所以这就是我到目前为止写的:

public static function cleanPhoneNumbers($input) {
        return preg_replace("/[^0-9]/", "", $input);
    }

public static function formatPhoneNumbers($phone_number) {
     if(strlen($phone_number) == 7) {
          return preg_replace("/([0-9]{3})([0-9]{4})/", "$1-$2", $phone_number);
     } elseif(strlen($phone_number) == 10) {
          return preg_replace("/([0-9]{3})([0-9]{3})([0-9]{4})/", "$1-$2-$3", $phone_number);
     } else {
          return $phone_number;
     }

}

一些警告:我的应用程序目前不适用于国际客户(内置了一个voip应用程序,我们现在不想允许在美国以外的地方打电话)所以我没有花时间去为国际可能性设置。此外,由于这正在进行中,我可能会在稍后返回重构并支持这些功能。

到目前为止,我发现了一个对我来说有点痛苦的弱点。在我的应用程序中,我不得不根据一天中的时间禁止通过时区拨打电话(例如,不允许西海岸的某人在东部时间早上6点在东部时间上午6点被呼叫)要做到这一点,我必须通过比较3位数区域代码来获取时区,将单独的区号表加入我的表格中。但我不能简单地将邮政编码与我的电话号码字段进行比较,因为它们永远不会匹配。因此,我必须处理额外的SQL才能获得该数字的前三位数字。不是改变游戏规则的人,而是更多的工作和困惑。

答案 4 :(得分:1)

绝对将它们作为文本字符串存储在一个字段中,并仅存储数字。这样想吧;无论数字是多少,它都是一个电话号码。但是,数字的分割取决于许多事物(地点,提供的数量,甚至个人偏好)。更容易存储并稍后通过文本操作进行更改。

答案 5 :(得分:1)

我认为如果你想使用区号作为过滤器,将3个字段中的数字拆分是最好的选择,否则你应该只使用1个字段。

请记住使用ZEROFILL您打算将它们存储为数字;)

答案 6 :(得分:1)

这实际上取决于几个因素:

  1. 你有可能拥有国际号码吗?
  2. 您将进行多少区号/城市代码搜索/操作?
  3. 无论如何,我只会存储数字,很容易在MySQL或PHP中格式化并添加括号和破折号。

    除非我打算按区号进行搜索记录,否则我会将整个电话号码放在一个字段中,因为我假设大部分时间你都会检索整个电话号码。

    如果您将来可能会使用国际号码:

    您可能想要添加一个国家/地区字段,这样您就不必猜测在处理该数字时它们来自哪个国家/地区。

答案 7 :(得分:1)

您使用的内容取决于您计划如何使用数据以及程序的使用位置。

如果您想通过区号有效地搜索记录,则拆分区号;当他们进行简单的字符串比较而不是完整电话号码的字符串操作来获取区号时,查询的执行速度会快得多。

但是,请注意,格式为XXX-XXX-XXXX的电话号码只能在美国,加拿大和其他受NANPA系统约束的较小的加勒比海地区找到。世界其他各个地区(欧盟,非洲,东盟)的编号标准差别很大。在这种情况下,拆分相当于“区号”可能没有意义。此外,如果您只想向用户显示电话号码,则只需将其存储为字符串。

是否存储具有格式的数字主要是个人偏好。存储原始数字可以轻松更改格式;您可以通过更改几行代码而不是重新格式化已有的1000万个数字,从XXX-XXX-XXXX转到(XXX)XXX-XXXX。从电话号码中删除特殊字符也是一个相对简单的正则表达式。无格式存储也可以为每个数字节省几个字节,并允许您使用固定长度字段(节省了varchars中固有的进一步数据开销)。这可能适用于存储空间非常宝贵的移动应用。但是,在您的服务器机房中,这个5 TB的分布式SQL群集可能不会注意到char(10)和varchar(15)之间的差异。将它们存储为格式化也可加快数据加载速度;你不必先将它格式化,只需将其从数据库中拉出来并将其贴在页面上即可。