【问题标题】:Storing leading zeros of integers in MySQL database as INTEGER在 MySQL 数据库中将整数的前导零存储为 INTEGER
【发布时间】:2011-10-15 22:41:53
【问题描述】:

我需要 MySQL 将数字存储在整数字段中并保持前导零。我不能使用 zerofill 选项,因为我当前的字段是 Bigint(16) 并且数字可以在前导零的数量上有所不同。 IE:0001 - 0005,然后可能需要存储 008 - 010。我不关心数字的唯一性(这些不被用作 ID 或任何东西),但我仍然需要将它们最好存储为 INTS。

在 PHP 中使用 CHAR/VARCHAR 然后将值类型转换为整数的问题意味着通过查询对结果进行排序会导致字母数字排序,IE: SORT BY number ASC 会产生

001
002
003
1
100
101
102
2

显然不是按数字顺序,而是按字母数字顺序,这是不想要的。

希望有一些聪明的解决方法:)

【问题讨论】:

  • 整数没有前导零。只有它们的字符串表示可以。因此,如果您“需要”前导零,则必须存储字符串表示形式。为什么不能在显示时进行这种格式化,而不是将其放入数据库中?
  • 1 和 001 以及不同的值。但是作为 int 它们是相同的:应该如何对它们进行排序和比较?作为 int 还是作为 varchar?

标签: php mysql string integer varchar


【解决方案1】:

将数字保存为整数。

然后使用函数LPAD() 显示用零填充的数字(左):

SELECT LPAD( 14, 7, '0') AS padded;

| padded  |
-----------
| 0000014 |

如果填零字符的数量是可变的,则在表中添加具有该(填零)长度的另一列。

【讨论】:

  • 即使我可以确认您的查询有效,我也有疑问,当lpad 用于数字类型时,是否会对性能产生影响?这是因为lpadstring-function。考虑一个查询检索大量记录的场景,ldap 用于格式化数字类型的输出。
【解决方案2】:

更改字段的结构并使属性UNSIGNED_ZEROFILL 保留零。

但你应该注意字段的长度,因为它会将所有其余数字返回为零,所以输入字段的长度

【讨论】:

    【解决方案3】:

    您仍然可以使用CAST 对字符串(CHAR/VARCHAR)列进行排序,如整数

    ORDER BY CAST(`col_name` AS SIGNED) DESC
    

    因此,您可以将它们存储在 CHAR/VARCHAR 类型的字段中。

    【讨论】:

    • 还可以使用ORDER BY col_name + 0 DESC 对整数等varchar 进行排序
    【解决方案4】:

    您不能存储带有前导零的整数。一种方法是将其保存在 varchar 和 int 列中。在这种情况下,您需要两列,一列是值,另一列是 intValue,并且在排序时,您可以使用 intValue 进行排序。这很容易实现。

    Select Value from Table order by intValue;
    

    另一个选项可以使用两列,一个值和另一个 NumOfZero,并将它们用于所需的结果。这很复杂,但在 DB 上可能很简单。

    【讨论】:

    • 注意:如果您知道列的长度总是相同的,请使用 CHAR,而不是 VARCHAR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多