Php 最好将手机存储在三个字段中,还是作为一个字段?
我很难决定将存储在MySQL数据库中的电话号码分开 一个学派的想法是将手机作为:Php 最好将手机存储在三个字段中,还是作为一个字段?,php,mysql,phone-number,Php,Mysql,Phone Number,我很难决定将存储在MySQL数据库中的电话号码分开 一个学派的想法是将手机作为: 区号(123) 前缀(123) 后缀(1234) 另一种方法是简单地将文件放在一个字段中,使用任何适当的格式: 123456789 (123)123-4567 123-456-7890 我认为第一个更好的最初原因是,能够根据从我们的会员处收集的电话号码快速、轻松地收集统计数据(例如,X个会员的区号为123) 真的有“正确”的方法吗?我确实意识到,与PHP配合使用,我可以以任何方式检索和重新格式化,但我希望使
- 区号(123)
- 前缀(123)
- 后缀(1234)
- 123456789
- (123)123-4567
- 123-456-7890
我将暂时只存储北美电话号码我选择一个字段,在您输入数据时对其进行处理,使其采用已知格式。我尝试了两种方法,单字段方法似乎总的来说生成的代码更少。您希望以最有效的方式将其存储在数据库中,正是因为它很容易在PHP中重新格式化。选择全数字字段,不使用分隔符(1234),因为这是最好的方法。如果您有国际电话号码,请同时添加国家代码。然后在代码中,您可以使用正则表达式对其进行格式化,使其看起来像您想要的那样。我将电话号码存储为字符串,而不是数字 电话号码是碰巧使用数字的标识符。 以零开头的电话号码是有效的,但编程语言可能会将其解释为八进制 将电话号码拆分为数字,并将分机号码存储在单独的字段中 这将允许以后使用统一的格式
对于我们来说,去掉前缀“1”数字(并根据字符串长度确定格式(对于我们来说是10位))。一定要将它们作为文本字符串存储在一个字段中,并且只存储数字。这样想吧;不管电话号码是什么,都是一个电话号码。然而,数字的分段取决于许多因素(地区、提供多少数字,甚至个人偏好)。如果你想使用区号作为过滤器,我认为将数字分成3个字段是最好的选择,否则,你应该只使用1个字段
记住使用
ZEROFILL
是否计划将它们存储为数字;) 这实际上取决于几个因素:
不过,您可能需要添加一个国家字段,这样在处理数字时就不必猜测它们来自哪个国家 您使用什么取决于您计划如何使用数据以及程序将在何处使用 如果您想按区号高效地搜索记录,请拆分区号;当查询进行简单的字符串比较时,查询的执行速度要快得多,而不是通过字符串操纵完整的电话号码来获取区号 但是,请注意,格式为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应用程序,我们现在不想允许在美国以外的地方打电话),所以我并没有采取行动