在数据库字段中存储电话号码的好数据结构是什么?我正在寻找一个足够灵活的东西,可以处理国际号码,也可以让号码的不同部分被有效地查询。
varchar编辑:只是为了在这里澄清用例:我目前将数字存储在单个字段中,并且我将它们留在客户输入的位置。然后,当代码需要这个数字时,我会对其进行规范化。问题是,如果我想查询几百万行来查找匹配的电话号码,它涉及一个函数,比如
where dbo.f_normalizenum(num1) = dbo.f_normalizenum(num2)这是非常低效的。此外,当只有一个varchar字段时,查找区号之类的内容的查询也会变得非常棘手。
编辑
大家在这里提出了很多好的建议,谢谢!作为更新,我现在要做的是:我仍然在varchar字段中存储输入的数字,但不是在查询时规范化,而是在插入或更新记录时使用触发器来完成所有工作。因此,我对需要查询的任何部分都有int或bigint,并对这些字段进行索引以使查询运行得更快。
发布于 2008-09-03 15:54:44
首先,除了国家代码之外,没有真正的标准。你能做的最好的事情就是通过国家代码来识别一个特定的电话号码属于哪个国家,然后根据这个国家的格式来处理剩下的号码。
但是,电话设备等通常是标准化的,因此您几乎总是可以将给定的电话号码分成以下几个部分
<代码>F29
使用此方法,您可以潜在地分隔号码,例如,您可以找到可能彼此接近的人,因为他们具有相同的国家、地区和交换代码。有了手机,这就不再是你可以指望的东西了。
此外,每个国家都有不同的标准。在美国,您可以始终依赖(AAA) EEE-LLLL,但在另一个国家,您可以在城市(AAA) EE-LLL中交换,而在农村(AAA) LLLL中简单地使用线号。您必须从某种形式的树的顶部开始,并根据您拥有的信息对它们进行格式化。例如,国家代码0的其余部分具有已知的格式,但对于国家代码5432,您可能需要先检查区号,然后才能了解其余数字。
您可能还希望处理像(800) Lucky-Guy这样的vanity数字,这需要认识到,如果是美国数字,就会有多一个数字(为了广告或其他目的,您可能需要完整的表示形式),而且在美国,字母与数字的映射方式与在德国不同。
您可能还希望将整个数字单独存储为文本字段(具有国际化),以便以后可以返回并在情况发生变化时重新解析数字,或者作为备份,以防有人提交了错误的方法来解析特定国家的格式并丢失信息。
发布于 2008-09-03 15:32:31
KISS -我已经厌倦了很多美国的网站。他们有一些巧妙编写的代码来验证邮政编码和电话号码。当我输入我完美有效的挪威联系信息时,我发现它经常被拒绝。
保留一个字符串,除非您有一些更高级的特定需求。
发布于 2008-10-04 19:32:04
Wikipedia page on E.164应该会告诉你你需要知道的一切。
https://stackoverflow.com/questions/41925
复制相似问题