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

问题描述 投票:0回答:6

正如问题所述,为什么将电话号码存储为字符串而不是整数在 Telephone_number 列中被认为是最佳实践?

不确定我是否理解这样做的理由。请帮忙解决这个问题!

谢谢!

ruby-on-rails ruby ruby-on-rails-3 postgresql ruby-on-rails-4
6个回答
121
投票

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

考虑例如:

  • 以不同的基数表达电话号码将使其变得毫无意义

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

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

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

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

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


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


11
投票

尼尔·斯莱特所说的是正确的。我想补充一点,在很多边缘情况下,您无法一致地将电话号码表示为数字值。

例如,考虑这些数字:

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

这些都是可能有效的电话号码,但它们的含义却截然不同。然而,以整数形式来看,它们都是

111235551212


10
投票

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

然而,虽然确实无法对有意义的数字进行数学运算。在哈希集中使用数字并进行索引比使用字符串更快。因此,如果您可以保证或同质化您的一组数字,使它们全部一致,那么您可能会看到在数字上运行更好的性能。

例如,在电信领域,对给定客户的通话评级包括在其 CLI 上进行大量搜索,在这种情况下,按整数搜索更快、更便宜。一般来说,虽然字符串在性能方面表现良好,但只有当性能很重要并且您需要对大量数字执行多次搜索时,即对 200 万条线路和 2000 个资费中的 2.5 亿个呼叫进行评级。内存评级也变得昂贵,因此在处理这些卷时能够使用 64 位 int 或 uint 会更便宜。


7
投票

以这些电话号码为例

099-1234-56789
+91-8907-687665

在这种情况下,如果

phone_number
属性是
integer
类型,那么它不能接受这些值。它应该是
string
来保存这些类型的值。所以
string
总是比
 更受青睐integer


4
投票

这有几个原因:

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

可能还有其他原因,但我想这已经是相当一部分了:)


0
投票

为什么跳出框框思考很重要

获取最多支持的帖子并逐步演示为什么它确实存储为整数是有意义的:

  • 以不同的基数表达电话号码将使其变得毫无意义 -> 我们不在乎这不是目的。

  • 将两个电话号码相加或相乘,或者对电话号码进行任何数学运算,都是没有意义的。结果不是另一个电话号码(巧合除外) -> 好吧,我们明白你的观点,电话号码不是为了做数学。

  • 电话号码应“按原样”输入到连接的设备中。 -> 好吧,听说过解析输入吗?

  • 电话号码可能有前导零。 -> 只能有一个前导 0。

  • 电话号码的操作,例如添加区号,都是字符串操作。 -> 这里我们讨论的是数据库存储。

TLDR

我们不在乎它是否确实是一个字符串。它会占用数据库空间。

整数为 4 个字节,而数据库内的字符串为 10 或更多字节(特别是如果保留括号等)。

如果您有数百万用户,您可以通过以下方式节省大量空间:1/从用户输入中删除任何非数字,2/将电话号码存储为整数。

当您检索它时,根据长度,您可以添加

+
或前导 0。

© www.soinside.com 2019 - 2024. All rights reserved.