为什么最好将电话号码存储为字符串与整数?

时间:2014-05-13 16:42:47

标签: ruby-on-rails ruby ruby-on-rails-3 postgresql ruby-on-rails-4

正如问题所述,为什么在电话号码栏中将电话号码存储为字符串而不是整数是最佳做法?

我不确定我理解这个的理由。请帮忙澄清一下!

谢谢!

5 个答案:

答案 0 :(得分:79)

电话号码是数字字符串,不是整数。

考虑例如:

  • 在不同的基地表达电话号码会使其毫无意义

  • 将两个电话号码相加或相乘,或者对电话号码进行任何数学运算都是没有意义的。结果不是另一个电话号码(除了字面意思)

  • 电话号码应“按原样”输入已连接的设备。

  • 电话号码可能有前导零。

  • 操作电话号码,例如添加区号,是字符串操作。

存储电话号码的字符串版本使这一点清晰明确。


历史:在旧的脉冲编码拨号系统中,电话号码中每个数字的代码被发送为与数字相同的脉冲数(或10个脉冲为“0”)。这可能就是为什么我们仍然使用数字来表示电话号码的部分。见http://en.wikipedia.org/wiki/Pulse_dialing

答案 1 :(得分:8)

Neil Slater所说的是正确的。我想补充说,有很多边缘情况你不能将电话号码一致地​​表示为数字值。

例如,请考虑以下数字:

011-123-555-1212
+11-123-555-1212
+1 (112) 355-5121 x2

这些都是可能有效的电话号码,但它们意味着非常不同的东西。然而,在整数形式中,它们都是111235551212

答案 2 :(得分:6)

如果要从输入中存储显示的数字,则必须使用字符串。

然而,虽然没有数学运算可以对具有意义的数字执行。使用哈希集中的数字和索引比使用字符串更快。因此,如果您可以保证或统一您的数字集,因此它们都是一致的,那么您可能会看到更好的数字运算。

例如,在Telco世界中,给定客户的评级调用包括在他们的CLI上进行大量搜索,在这种情况下,按整数搜索更快,更便宜。一般来说,虽然字符串在性能方面会很好,但只有在性能很重要的情况下,你才能进行多次搜索才能获得大量的数字 - 即在200万行和2000个关税中获得2.5亿次通话。在内存中评级也变得昂贵,因此在处理这些卷时能够使用64位int或uint更便宜。

答案 3 :(得分:5)

例如考虑这些电话号码

099-1234-56789+91-8907-687665

在这种情况下,如果phone_number属性属于integer类型,则它无法接受这些值。它应该是string来保存这些类型的值。string始终优先于integer

答案 4 :(得分:2)

有几个原因:

  • 电话号码通常以“0”开头:整数将删除所有前导“0”
  • 电话号码可以包含特殊字符:+(-等(例如:+33(0)6 12 23 34)
  • 您无法在手机上执行操作:例如,添加手机将毫无意义
  • 电话号码可以是国际化的,即不同人的格式不同,因此不可能使用整数

可能还有其他原因,但我猜这已经是相当多的原因了:)