MySQL中的zerofill有啥好处?

Posted

技术标签:

【中文标题】MySQL中的zerofill有啥好处?【英文标题】:What is the benefit of zerofill in MySQL?MySQL中的zerofill有什么好处? 【发布时间】:2011-07-12 12:06:40 【问题描述】:

我只是想知道在mysql 中为INT DataType 定义 ZEROFILL 有什么好处/用途?

`id` INT UNSIGNED ZEROFILL NOT NULL 

【问题讨论】:

读者还应该注意zerofill是非标准的。 "The ZEROFILL attribute is ignored when a column is involved in expressions or UNION queries. If you store values larger than the display width in an integer column that has the ZEROFILL attribute, you may experience problems when MySQL generates temporary tables for some complicated joins. In these cases, MySQL assumes that the data values fit within the column display width." 好问题。也可以提出相关问题:是否有充分的理由不使用 ZEROFILL?使用 ZEROFILL 的缺点和潜在陷阱是什么?利大于弊吗? 看解释***.com/questions/5634104/… 简短说明:tutorialspoint.com/what-is-the-benefit-of-zerofill-in-mysql 【参考方案1】:

为了理解,ZEROFILL 的用法可能很有趣:

在德国,我们有 5 位数的邮政编码。但是,这些代码可能以零开头,因此80337 是 munic 的有效邮政编码,01067 是柏林的邮政编码。

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

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

    硬盘上的存储空间少了很多 如果您插入1067,您仍然会返回01067

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

【讨论】:

值得补充的是,显示数据的SQL 客户端 负责格式化带有前导零的数字。这不是每个应用程序检索数据时“自动”发生的事情。 固定宽度的列也更好,因为它们减少了磁盘碎片。 @Phil,但实际上,大多数客户端库(例如 php)在将其交给应用程序代码之前不会简单地去掉零吗?如果是这样,那它确实显得有些毫无意义。 MySQL 早期的糟糕设计。 @Pacerier 这取决于您希望客户端库中的数据如何表示:数字或字符串。德国邮政编码不是数字,它只是由数字组成的字符串。因此,我不同意您在 MySQL 早期提出的糟糕设计的说法。这仍然是一种有效的方法,但在极少数情况下。【参考方案2】:

当您选择类型为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

【讨论】:

@diEcho:例如,如果您希望所有发票编号都显示为 10 位数字,那么您可以将该列的类型声明为 INT(10) ZEROFILL。 我强烈建议您远离此功能 - 如何显示/格式化数值是一个演示问题,绝对不属于数据库级别的东西;至少如果您使用数据库来支持某个软件,则不会。请注意,这可能会导致问题 - 如果您将带有前导零的值解析为整数,许多解析器会将值视为八进制,这可能不是您想要的。您应该使用此功能的唯一时间是作为(存储)优化,当您实际存储的是有效的(固定长度)数字字符串时。 @mindplay.dk:视情况而定。如果您要存储 GTIN 之类的内容,则它们的长度必须为 14 位,但也可以只有 8 位并用零填充。在这种情况下,依赖输出端是不对的,因为它不仅仅是一个小数,而是一个键。 @MarkByers,实际上,大多数客户端库(例如 PHP)在将其交给应用程序代码之前不会简单地去掉零吗?如果是这样,那它确实显得有些毫无意义。 MySQL 早期的糟糕设计。 @MarkByers 我和@Pacerier 有同样的问题。出于所有实际目的,int 列将映射到应用程序语言中的数字类型。不会忽略显示属性吗?我想不出带有显示属性的 javascript、C# 或 Java 中的数字类型。【参考方案3】:
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)

【讨论】:

【参考方案4】:

如果您需要将这个“整数”与其他需要作为“文本”排序的东西(另一个数字或文本)连接,它有助于正确排序。

例如,

如果您需要使用整数字段编号(比如说 5)串联作为 A-005 或 10/0005

【讨论】:

【参考方案5】:

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

的方式处理这些值

【讨论】:

谢谢,但不幸的是,我刚刚对 mysql 数据库进行了一些测试,但它并没有将空值归零:-/。该目标仍然通过将字段限制为不允许为空来实现。我应该知道最好不要尝试回答有关我通常不使用的 dbs 的问题。在人们太高兴之前删除我的答案。大声笑 有用吗?这是不正确的。当显示长度为 1 时,Zerofill 什么都不做(除了添加无符号)。 @Marlin 并且您应该始终为 true 或 false 设置默认值...如果您不使用默认值,那么您提到的问题不会是唯一的问题...不是NULL 也是必须的 :) 我会投反对票,但您的代表在666,所以我更愿意保留这个答案,就像;-)【参考方案6】:

这是一个为喜欢方盒子的心烦意乱的人准备的功能。

你插入

1
23
123 

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

000001
000023
000123

【讨论】:

【参考方案7】:

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

允许 UNSIGNED 属性的数值数据类型也允许 SIGNED。但是,这些数据类型默认是有符号的,所以 SIGNED 属性没有作用。

以上描述摘自MYSQL官网。

【讨论】:

【参考方案8】:

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

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

【讨论】:

链接将改为dev.mysql.com/doc/refman/5.0/en/numeric-type-attributes.html【参考方案9】:

清零

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

因此

23

变成:

00000023

【讨论】:

很好很简单的解释!

以上是关于MySQL中的zerofill有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL INT(N)以及zerofill的使用区别

spark中的lit()有啥用?下面的两段代码返回相同的输出,使用 lit() 有啥好处 [重复]

Scala 中的右关联方法有啥好处?

在 MySQL 中删除软删除行有啥好处?

在 MySQL 中使用数字行 ID 有啥好处?

在 PHP 应用程序中使用 MySQL VIEWS 有啥好处? [关闭]