在 MySQL 数据库中将整数的前导零存储为 INTEGER

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

我需要 MySQL 将数字存储在整数字段中并维护前导零。我无法使用填零选项,因为我当前的字段是 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

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

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

php mysql string integer varchar
6个回答
24
投票

将数字存储为整数。

然后使用函数

LPAD()
显示用零填充的数字(左侧):

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

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

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


8
投票

更改字段的结构并使属性

UNSIGNED_ZEROFILL
保留零。

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


7
投票

您仍然可以使用 CAST

像整数一样对字符串(CHAR/VARCHAR)列进行排序
ORDER BY CAST(`col_name` AS SIGNED) DESC

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


6
投票

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

Select Value from Table order by intValue;

另一个选项可以使用两列,一列是 value,另一列是 NumOfZero,并使用它们来获得所需的结果。这很复杂,但对数据库来说可能很简单。


0
投票

好吧,没有人有这个权利。

您不能将前导零存储在整数中。 时期。您必须存储为字符。

对于已知要使用的所需位数的情况,您可以简单地执行类似的操作

选择 (LPAD(zip,5,0))

将零放回去。

但是如果您的数字位数不同,并且前导零的数量也不同。你不能只转换为整数并排序,因为这会将 1 和 01 以及 d001 和 0001 相互折叠,并按照它们在数据库中已有的顺序返回它们。 这是错误的。

但是,如果您在没有强制转换的情况下按字符排序,则当您需要从右到左比较以正确排序时,该字段将从左到右进行比较。

按正确顺序排序的唯一方法是在进入数据库时或使用 LPAD() 函数在左侧填充空格。

ORDER BY LPAD(number,16," ") 将以正确的顺序返回数据。


0
投票

创建表发票( id int(6) 零填充主键自动增量, 名称 varchar(30) );

现在 id 将存储 int 值,但是当您查询数据时,它将给出前导零

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