¿Cuál es el beneficio de zerofill en MySQL?


Solo quiero saber cuál es el beneficio / uso de definir ZEROFILL para INT Tipo de datos en MySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 
Author: diEcho, 2011-03-10

9 answers

Cuando selecciona una columna con el tipo ZEROFILL, rellena el valor mostrado del campo con ceros hasta el ancho de visualización especificado en la definición de columna. Los valores más largos que el ancho de pantalla no se truncan. Tenga en cuenta que el uso de ZEROFILL también implica UNSIGNED.

Usar ZEROFILL y un ancho de pantalla no tiene ningún efecto en cómo se almacenan los datos. Solo afecta a cómo se muestra.

Aquí hay un ejemplo de SQL que demuestra el uso de 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;

Resultado:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789
 210
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-10 07:31:17

Un ejemplo para entender, donde el uso de ZEROFILL podría ser interesante:

En Alemania, tenemos códigos postales de 5 dígitos. Sin embargo, esos Códigos pueden comenzar con un Cero, por lo que 80337 es un código postal válido para munic, 01067 es un código postal de Berlín.

Como puede ver, cualquier ciudadano alemán espera que los códigos postales se muestren como un código de 5 dígitos, por lo que 1067 parece extraño.

Para almacenar esos datos, podría usar un VARCHAR (5) o INT(5) ZEROFILL mientras que el entero zerofill tiene dos grandes ventajas:

  1. Mucho menor espacio de almacenamiento en el disco duro
  2. Si inserta 1067, todavía obtiene 01067

Tal vez este ejemplo ayude a entender el uso de ZEROFILL.

 115
Author: Phil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-18 11:10:15

Es una característica para personalidades perturbadas a las que les gustan las cajas cuadradas.

Se inserta

1
23
123 

Pero cuando selecciona, rellena los valores

000001
000023
000123
 52
Author: Ilya Saunkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-07 06:15:00

Ayuda a ordenar correctamente en el caso de que necesite concatenar este "entero" con algo más (otro número o texto) que requerirá ser ordenado como un "texto" entonces.

Por ejemplo,

Si necesita usar los números de campo entero (digamos 5) concatenado como A-005 o 10/0005

 13
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-24 20:52:46

Sé que llego tarde a la fiesta, pero encuentro que el zerofill es útil para las representaciones booleanas de TINYINT(1). Null no siempre significa Falso, a veces no quieres que lo haga. Al zerofilling un tinyint, está convirtiendo efectivamente esos valores a INT y eliminando cualquier confusión que ur aplicación pueda tener sobre la interacción. Su aplicación puede tratar esos valores de una manera similar al tipo de datos primitivo True = Not(0)

 3
Author: Marlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-06 05:42:06
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)
 3
Author: zloctb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-10 15:03:15

Si especifica ZEROFILL para una columna numérica, MySQL agrega automáticamente el atributo UNSIGNED a la columna.

Los tipos de datos numéricos que permiten el atributo UNSIGNED también permiten SIGNED. Sin embargo, estos tipos de datos están firmados de forma predeterminada, por lo que el atributo SIGNED no tiene efecto.

La descripción anterior está tomada del sitio web oficial de MYSQL.

 1
Author: Adeel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-20 16:20:41

ZEROFILL

Esto esencialmente significa que si el valor entero 23 se inserta en una columna INT con el ancho de 8, el resto de la posición disponible se rellenará automáticamente con ceros.

Por lo tanto

23

Se convierte en:

00000023
 0
Author: Simon H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-10 07:03:03

Cuando se utiliza junto con el atributo opcional (no estándar) ZEROFILL, el relleno predeterminado de los espacios se sustituyen por ceros. Para ejemplo, para una columna declarada como INT (4) ZEROFILL, un valor de 5 es retrieved as 0005.

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

 0
Author: Daniel Kutik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-10 07:05:28