Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 最好将手机存储在三个字段中,还是作为一个字段?_Php_Mysql_Phone Number - Fatal编程技术网

Php 最好将手机存储在三个字段中,还是作为一个字段?

Php 最好将手机存储在三个字段中,还是作为一个字段?,php,mysql,phone-number,Php,Mysql,Phone Number,我很难决定将存储在MySQL数据库中的电话号码分开 一个学派的想法是将手机作为: 区号(123) 前缀(123) 后缀(1234) 另一种方法是简单地将文件放在一个字段中,使用任何适当的格式: 123456789 (123)123-4567 123-456-7890 我认为第一个更好的最初原因是,能够根据从我们的会员处收集的电话号码快速、轻松地收集统计数据(例如,X个会员的区号为123) 真的有“正确”的方法吗?我确实意识到,与PHP配合使用,我可以以任何方式检索和重新格式化,但我希望使

我很难决定将存储在MySQL数据库中的电话号码分开

一个学派的想法是将手机作为:

  • 区号(123)
  • 前缀(123)
  • 后缀(1234)
另一种方法是简单地将文件放在一个字段中,使用任何适当的格式:

  • 123456789
  • (123)123-4567
  • 123-456-7890
我认为第一个更好的最初原因是,能够根据从我们的会员处收集的电话号码快速、轻松地收集统计数据(例如,X个会员的区号为123)

真的有“正确”的方法吗?我确实意识到,与PHP配合使用,我可以以任何方式检索和重新格式化,但我希望使用最佳实践

谢谢你的建议

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

我选择一个字段,在您输入数据时对其进行处理,使其采用已知格式。我尝试了两种方法,单字段方法似乎总的来说生成的代码更少。

您希望以最有效的方式将其存储在数据库中,正是因为它很容易在PHP中重新格式化。选择全数字字段,不使用分隔符(1234),因为这是最好的方法。如果您有国际电话号码,请同时添加国家代码。然后在代码中,您可以使用正则表达式对其进行格式化,使其看起来像您想要的那样。

我将电话号码存储为字符串,而不是数字

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

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

这将允许以后使用统一的格式


对于我们来说,去掉前缀“1”数字(并根据字符串长度确定格式(对于我们来说是10位))。

一定要将它们作为文本字符串存储在一个字段中,并且只存储数字。这样想吧;不管电话号码是什么,都是一个电话号码。然而,数字的分段取决于许多因素(地区、提供多少数字,甚至个人偏好)。如果你想使用区号作为过滤器,我认为将数字分成3个字段是最好的选择,否则,你应该只使用1个字段


记住使用
ZEROFILL
是否计划将它们存储为数字;)

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

  • 你有可能有国际号码吗
  • 您将执行多少区号/城市代码搜索/操作
  • 不管怎样,我只存储数字,用MySQL或PHP格式化并添加括号和破折号都很容易

    除非我要做一个按区号搜索的日志,否则我只会将整个电话号码放在一个字段中,因为我假设大部分时间你都会检索整个电话号码

    如果您将来可能选择国际号码:


    不过,您可能需要添加一个国家字段,这样在处理数字时就不必猜测它们来自哪个国家

    您使用什么取决于您计划如何使用数据以及程序将在何处使用

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

    但是,请注意,格式为XXX-XXX-XXXX的电话号码仅在美国、加拿大和其他受NANPA系统管辖的较小加勒比地区使用。其他不同的世界地区(欧盟、非洲、东盟)有着非常不同的编号标准。在这种情况下,拆分出相当于“区号”的代码可能没有意义。此外,如果您只想向用户显示电话号码,那么只需将其存储为字符串即可


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

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

    基于电话号码输入的可变性(撇号、点、破折号和它们的组合),我构建了一个简单的函数来处理用户输入,除去号码本身之外的所有内容,还构建了一个“重建器”,将原始号码重新格式化成更具视觉吸引力的内容

    因为他们对我很有帮助,我写了以下内容:

    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应用程序,我们现在不想允许在美国以外的地方打电话),所以我并没有采取行动