【问题标题】:MySQL stripping off leading zero from integer columnMySQL从整数列中剥离前导零
【发布时间】:2011-01-29 04:00:43
【问题描述】:

我有一个bigint 字段,例如,当输入诸如'05555555555' 之类的数字时,0 被剥离,仅插入'5555555555'

我应该使用什么数据类型来防止这种情况发生?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    你不能。整数列(bigint's)不存储前导零(即在视觉表示中)

    与其尝试存储前导零(通过使用 varchar 字段),不如让视图(或其他)将整数格式化为您需要的格式的字符串。

    如果您需要在域模型中存储实际上是字符串的内容(例如电话号码),请使用字符串而不是整数类型字段。

    【讨论】:

    • 奇怪的是,这被否决了,但是当他们说同样的话时,安德鲁·摩尔的回答被投了两次。
    • @Andrew - ZEROFILL 以可视化的方式做到了这一点。它甚至与 PHP 组合来呈现最终结果为零填充。查看 OP 的其他问题。
    【解决方案2】:

    BIGINT 和其他 Integer 列不存储数字的视觉表示,仅存储二进制形式的数字本身(BIGINT 为 8 个字节)。 5555555555 存储为:

    00000000 00000000 00000000 00000001 01001011 00100011 00001100 11100011

    如果前面的零对数据的完整性很重要,则应使用VARCHARCHAR 而不是整数类型。数值数据类型只能用于数值数据。美国邮政编码和电话号码不是数字数据。

    【讨论】:

      【解决方案3】:

      bigint将数据存储为一个数字,055555555555555555555是同一个数字。您需要一个字符串类型来保留前导零,例如varchar 具有合适的最大长度。

      【讨论】:

        【解决方案4】:

        您可能会考虑更改该字段以使用 UNSIGNED ZEROFILL。这应该允许您存储带有前导零的数字。

        【讨论】:

        • -1: ZEROFILL 不允许您存储前导零。如果它的长度小于定义,它只是告诉 DBMS 在返回结果前加上零。
        • @cyberkiwi:为什么重要?因为如果这只是一个渲染问题,我敢肯定 OP 会简单地将其左填充到其他地方。我很确定这里存储的是前面的零(以及它们的数量)对数据完整性很重要的数据。
        • @cyberkiwi:不赞成票是一种意见。我的观点是使用ZEROFILL 不是这里的答案。
        • 当我发布这个答案时,我只是想提供另一个选项,而不是其他人给出的“你不能,使用 varchar”答案。尽管有一些意见,但这是可能的选择之一。使用字符串无疑是更好的选择,我意识到ZEROFILL 不会影响存储的实际数据。但是,有些人更喜欢此功能的便利性,而不是每次检索数据时都必须记住解析数据。尽管这是出租人的选择,但我还是发布了这个,因为我喜欢在阅读论坛时看到多种解决方案。
        【解决方案5】:

        问题是,如果您有一个包含数十万行的大型数据库,那么 bigint 比 VARHAR 字段要快得多。我在充满欧洲商品编号(EAN)的产品数据库中遇到了类似的问题。其中一些代码以前导 0 开头当我将其更改为 VARCHAR 时,加载某些搜索 EAN 代码的页面需要 8 秒,当我更改它到 BIGINT 变成 2 秒。 速度确实相差很大。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-15
          • 1970-01-01
          • 2021-03-18
          • 1970-01-01
          • 2010-09-06
          • 1970-01-01
          • 2015-09-15
          • 2010-09-21
          相关资源
          最近更新 更多