【问题标题】:Why is it best to store a telephone number as a string vs. integer?为什么最好将电话号码存储为字符串与整数?
【发布时间】:2014-07-01 11:16:39
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 这是一个有趣的问答!我喜欢由于未指定“电话号码是我们用整数表示的数字字符串”而引起的混乱。我猜“幕后”使用的字符由整数表示,因为它们映射到整数(bijection)。由于不精确的自然语言,我看到很多事情都出现了类似的困惑。所以电话号码是整数,但它们不是,具体取决于上下文。

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


【解决方案1】:

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

举个例子:

  • 以不同的基数表示电话号码会使其毫无意义

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

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

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

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

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


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

【讨论】:

  • 对于用户的电话号码,您是否总是只有一个字段?如果是这样,国际号码也是这样吗?
  • @stevec:这部分取决于你和我认为的另一个问题。对于大多数用例,我会亲自使用单个字段和一个库来解析数字以分离出拨号代码等,如果它很重要的话,因为我不想将这个要求要求系统用户放置正确的部分在多字段版本的右侧框中。但是,在某些用例中,在输入或存储数字时将其分成逻辑组件可能会很方便。
【解决方案2】:

这有几个原因:

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

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

【讨论】:

    【解决方案3】:

    以这些电话号码为例

    099-1234-56789+91-8907-687665

    在这种情况下,如果phone_number属性的类型是integer,那么它不能接受这些值。它应该是一个string来保存这些类型的值。所以string总是首选比integer

    【讨论】:

      【解决方案4】:

      尼尔斯莱特说的是正确的。我要补充一点,在很多极端情况下,您无法始终将电话号码表示为数字值。

      例如,考虑这些数字:

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

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

      【讨论】:

        【解决方案5】:

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

        但是,虽然不能对有意义的数字执行任何数学运算,但这是事实。在散列集和索引中使用数字比使用字符串更快。因此,只要您可以保证或同质化您的一组数字,使它们都保持一致,那么您可能会看到在一个数字上运行的性能更好。

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

        【讨论】:

        • 赞成,因为我已经写了一个并且在数据库中将电话号码作为整数处理要快得多。当您需要 NXX 或 1000 块 ID 时,缺点当然是看起来很奇怪的算法。
        • 赞成,因为我在大型电信公司实施了多个项目并且完全同意您的经验。
        猜你喜欢
        • 2013-06-27
        • 1970-01-01
        • 2020-06-05
        • 2019-12-18
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 2014-06-13
        相关资源
        最近更新 更多