在我工作的最后3家公司中,电话号码列的类型为varchar(n)。原因是他们可能想要存储扩展(分机333)。但在每种情况下,插入和更新时都会删除“ - ”字符。我不明白为什么“.ext”字符可以存储而不是“ - ”字符。有没有其他人看过这个,你能用这种方式做什么解释?如果你要存储的只是数字,那么你最好不要使用int字段吗?相反,如果您想将数字存储为字符串/ varchar,那么为什么不保留所有字符而不打扰显示格式和写入时清除?
我也有兴趣了解其他地方实施电话号码存储的其他方式。
答案 0 :(得分:30)
快速测试:您要添加/减去/乘/分电话号码吗?不。与SSN类似,电话号码是可以包含实际数字的离散数据,因此字符串类型可能是最合适的。
答案 1 :(得分:12)
存储电话号码的一点是领先0。
例如:01202 8765432
在int列中,0将被剥离,这使得电话号码无效。
我会冒险猜测 - 被换为空格是因为它们实际上并不意味着什么
例如:123-456-789 = 123 456 789 = 123456789
答案 2 :(得分:3)
就个人而言,我不会删除任何字符,因为根据电话号码的来源,它可能意味着不同的东西。将电话号码保留为输入的确切格式,这显然是键入它的人习惯看到它。
答案 3 :(得分:1)
只要它一致,存储它的方式并不重要。规范是删除格式化字符,但如果您需要查询这些值,还可以单独存储国家/地区代码,区域代码,交换和扩展名。同样,要求是它是一致的 - 否则查询它是PITA。
答案 4 :(得分:1)
我可以想到的另一个原因是我不会将电话号码存储为“数字”而是存储为字符串,这通常是您用来访问数据库的软件堆栈的一部分(PHP,我正在看着你)不会支持足够大的整数(原生),以便能够存储一些较长和/或异国情调的电话号码。
32位可携带的最大数字,无标志,为4294967295.这不适用于任何俄罗斯手机号码,例如,号码为4959261234。
因此,您要找到一种方法来携带超过32位的数字数据,这给您带来了额外的不便。尽管数据库长期支持非常大的整数,但只需要链中的一个坏链接用于showstopper。和PHP一样,再次。
答案 5 :(得分:0)
如果数据库表要驱动另一个系统,例如剥离一些字符并允许其他字符可能会产生影响。某种IP电话。根据所涉及的系统,将etc.333作为后缀可能是合法的,而开发人员可能没有在字符串中占用“ - ”(是的,我猜这里......)
至于存储为varchar而不是int,这对我来说只是普通常识。如前所述,前导零可以在int字段中被剥离,int字段上的查询可以执行隐式数学函数(也可以解释从文本中剥离“ - ”,你不想输入555-1234并且有它存储为-679吗?)
简而言之,我不知道确切的推理,但可以推断出一些可能性。
答案 6 :(得分:0)
我选择将数字存储为字符串,并在我的显示代码中添加各种“()”和“ - ”。国际号码确实变得更加困难。我们根据国家/地区提供各种“国际化”显示格式来处理它。
答案 7 :(得分:0)
如果我知道电话号码只会在特定区域(例如北美)内,我喜欢做的是将条目更改为4个字段。 3表示区号,3表示前缀,3表示行,5表示扩展。然后我将这些作为1字段插入' - ',并且可能是'e'来指定扩展名。任何搜索当然也需要遵循相同的过程。这样可以确保我获得更多常规数据,甚至允许将号码用于实际拨打电话,一旦删除 - 并且延期。我也可以轻松回到原来的4个领域。
答案 8 :(得分:0)
好东西!似乎主要的一点是,电话号码的格式化实际上并不是数据的一部分,而是源国家的一个方面。仍然,通过保持数字的扩展部分不变,可能会打破将格式与数据分离的模型。我怀疑所有国家/地区都使用相同的语法/格式来描述扩展。此外,如果与电话系统集成是(可能的)要求,那么最好单独存储扩展并按预期构建消息。但Mark也提出了一个很好的观点,如果你是一致的,那么你可以如何存储它可能无关紧要,因为你也可以一致地查询和处理它。
感谢Eric提供其他问题的链接。
答案 9 :(得分:0)
当自动电话系统使用字段拨打电话时,它可能无法分辨出应该使用哪些字符以及在拨号时应忽略哪些字符。人类可以看到“(”或“)”或“ - ”字符并且知道这些被认为是分隔电话号码的区号,npa和nxx的分隔符。请记住,每个字符代表一个二进制模式,除非预先编程为忽略,否则将由自动拨号程序输入。为了解决这个问题,最好只存储用户在电话听筒上按下的字符的等价物,甚至更好地将各个值存储在不同的列中,这样拨号器就可以使用单个字段而无需解析字符串。 / p>
即使不使用拨号自动化,最好存储将来不需要更新的内容。在字段之间添加字符要比从字符串中删除字符要容易得多。
如上所述,在使用字符串与整数数据类型的注释中,字符串是根据国家/地区之间的差异存储电话号码的正确方法。尽管如此,有一个重要的警告,虽然聚合报告的统计数据(即,数量或调用的数量的总和),字符串的计数要比整数慢得多。为了解释这一点,重要的是将整数添加为可用于计数而不是varchar或char字段数据类型的标识列。