在 MySQL 中使用 zeroffill 有什么好处?

我只是想知道在 MySQL中为 INT数据类型定义 ZEROFILL的好处/用法是什么?

`id` INT UNSIGNED ZEROFILL NOT NULL
151888 次浏览

零填充

这实际上意味着,如果整数值23插入到宽度为8的 INT 列中,那么剩余的可用位置将自动用零填充。

因此

23

变成:

00000023

当您选择一个类型为 ZEROFILL的列时,它会用零填充字段的显示值,直到列定义中指定的显示宽度为止。大于显示宽度的值不会被截断。请注意,使用 ZEROFILL也意味着使用 UNSIGNED

使用 ZEROFILL和显示宽度对数据的存储方式没有影响。它只影响它的显示方式。

下面是一些示例 SQL,它们演示了 ZEROFILL的用法:

CREATE TABLE yourtable (x INT(8) ZEROFILL NOT NULL, y INT(8) NOT NULL);
INSERT INTO yourtable (x,y) VALUES
(1, 1),
(12, 12),
(123, 123),
(123456789, 123456789);
SELECT x, y FROM yourtable;

结果:

        x          y
00000001          1
00000012         12
00000123        123
123456789  123456789

当与 可选(非标准)属性 ZEROFILL,默认的填充 将空格替换为零 例如,对于声明为 INT (4) ZEROFILL,值5表示 检索为0005。

Http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

这是喜欢方盒子的精神病人的特征。

你插入

1
23
123

但是当您选择时,它会填充值

000001
000023
000123

如果为数字列指定 ZEROFILL,MySQL 会自动将 UNSIGNED 属性添加到该列。

允许 UNSIGNED 属性的数字数据类型也允许 SIGNED。但是,这些数据类型是默认签名的,因此 SIGNED 属性没有效果。

以上描述摘自 MYSQL 官方网站。

为了了解 ZEROFILL的用法可能有趣的地方,举一个例子:

在德国,我们有5位数的邮政编码。然而,这些代码可能以一个零开始,所以 80337是一个有效的邮政编码,01067是柏林的邮政编码。

正如您所看到的,任何德国公民都希望邮政编码显示为5位数字代码,因此 1067看起来很奇怪。

为了存储这些数据,您可以使用 VARCHAR(5)INT(5) ZEROFILL,而零填充整数有两大优点:

  1. 硬盘存储空间较小
  2. 如果插入 1067,仍然会得到 01067

也许这个例子有助于理解 ZEROFILL的用法。

我知道我迟到了,但是我发现零填充对 TINYINT (1)的布尔表示很有帮助。Null 并不总是表示 False,有时候您不希望它表示 False。通过对 tinyint 进行零填充,可以有效地将这些值转换为 INT,并消除应用程序在交互时可能产生的任何混淆。然后,应用程序可以以类似于基元数据类型 True = Not (0)的方式处理这些值

它有助于正确排序的情况下,你将需要 连接这个“整数”与其他东西(另一个数字或文本) ,将需要排序为“文本”然后。

比如说,

如果您需要使用整数字段编号(比方说5) 连在一起作为 A-005或10/0005

mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)


mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0


mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)


mysql>


mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)




mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)