【问题标题】: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 

【问题讨论】:

标签: mysql types unsigned-integer


【解决方案1】:

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

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

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

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

  1. 硬盘上的存储空间少了很多
  2. 如果您插入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

          【解决方案9】:

          清零

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

          因此

          23
          

          变成:

          00000023
          

          【讨论】:

          • 很好很简单的解释!
          猜你喜欢
          • 2012-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-04
          • 1970-01-01
          • 2010-11-19
          相关资源
          最近更新 更多