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

168

Solo quiero saber cuál es el beneficio / uso de definir ZEROFILLpara INTDataType en MySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 
diEcho
fuente
Buena pregunta. Preguntas relacionadas que también podrían formularse: ¿Hay buenas razones para no usar ZEROFILL? ¿Cuáles son los inconvenientes y las posibles dificultades del uso de ZEROFILL? ¿Los beneficios superan los inconvenientes?
spencer7593
Vea la explicación stackoverflow.com/questions/5634104/…
priyabagus el

Respuestas:

254

Cuando selecciona una columna con tipo ZEROFILL, rellena el valor visualizado 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 visualización no se truncan. Tenga en cuenta que el uso de ZEROFILLtambién implica UNSIGNED.

El uso ZEROFILLy el ancho de la pantalla no tienen efecto sobre cómo se almacenan los datos. Afecta solo 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
Mark Byers
fuente
52
@diEcho: si, por ejemplo, desea que todos sus números de factura se muestren con 10 dígitos, puede declarar el tipo de esa columna como INT (10) ZEROFILL.
Mark Byers
76
Le recomiendo que se mantenga alejado de esta función: la forma en que se visualiza / formatea un valor numérico es una preocupación de presentación, y no es algo que pertenezca a nivel de base de datos; al menos no si está utilizando la base de datos para respaldar una pieza de software. Tenga en cuenta que esto puede causar problemas: si analiza un valor con un cero inicial como un entero, muchos analizadores considerarán el valor como octal, que probablemente no sea lo que desea. El único momento en que debe usar esta función es como una optimización (de almacenamiento), cuando lo que realmente está almacenando es efectivamente una cadena de dígitos (de longitud fija).
mindplay.dk
3
@ mindplay.dk: Depende. Si está almacenando algo así como un GTIN, deben tener 14 dígitos de largo, pero también pueden tener solo 8 dígitos y rellenarse con ceros a la izquierda. Confiar en el lado de salida no sería correcto en este caso, porque no es simplemente un decimal, sino una clave.
DanMan
1
@MarkByers, en términos prácticos, ¿no la mayoría de las bibliotecas de clientes (por ejemplo, PHP) simplemente eliminan los ceros antes de entregarlos al código de la aplicación? Si es así, entonces realmente parece algo inútil. Un mal diseño en los primeros días de MySQL.
Pacerier
131

Un ejemplo para entender, donde el uso de ZEROFILLpodrí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 80337es un código postal válido para munic, 01067es 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 se 1067ve extraño.

Para almacenar esos datos, puede usar un VARCHAR(5)o INT(5) ZEROFILLmientras que el entero lleno de cero tiene dos grandes ventajas:

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

Quizás este ejemplo ayude a comprender el uso de ZEROFILL.

Phil
fuente
10
Vale la pena agregar que el cliente SQL que muestra los datos es responsable de formatear los números con ceros a la izquierda. Esto no es algo que ocurre "automágicamente" con todas y cada una de las aplicaciones que capturan los datos.
a_horse_with_no_name
Las columnas de ancho fijo también son mejores, porque reducen la fragmentación en el disco.
DanMan
@Phil, en términos prácticos, ¿no la mayoría de las bibliotecas de clientes (por ejemplo, PHP) simplemente eliminan los ceros antes de entregarlos al código de la aplicación? Si es así, entonces realmente parece algo inútil. Un mal diseño en los primeros días de MySQL.
Pacerier
3
@Pacerier Esto depende de cómo desea que se representen los datos en su biblioteca de cliente: como número o como cadena. Un código postal alemán no es un número, es una cadena que consta de dígitos, solo. Por lo tanto, no estoy de acuerdo con su declaración de mal diseño en los primeros días de MySQL. Sigue siendo un enfoque válido pero para casos raros.
Phil
61

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

Inserta

1
23
123 

pero cuando selecciona, rellena los valores

000001
000023
000123
Elijah Saounkine
fuente
15

Ayuda en la ordenación correcta en el caso de que necesite concatenar este "entero" con otra cosa (otro número o texto) que deberá ordenarse como un "texto" en ese momento.

por ejemplo,

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

Conocido
fuente
4

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

Aguja
fuente
1
Gracias, pero desafortunadamente acabo de ejecutar algunas pruebas contra un mysql db y no rellena los valores nulos: - /. Ese objetivo aún se logra al restringir el campo para que no permita nulo. Debería saber mejor que tratar de responder preguntas sobre dbs que normalmente no uso. Voy a borrar mi respuesta antes de que la gente se desanime demasiado. lol
Marlin
1
¿Útil? Es incorrecto Zerofill no hace nada (excepto agregar Unsigned) cuando la duración de la pantalla es 1.
Brilliand
@Marlin y siempre debe establecer un valor predeterminado para verdadero o falso ... si no utiliza los valores predeterminados, entonces el problema que mencionó NO será el único ... NO NULL también es imprescindible :)
bakriawad
Votaría en contra, pero su representante está en 666lo que prefiero mantener esta respuesta tal como está;-)
Martin
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)
zloctb
fuente
1

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 FIRMADO no tiene ningún efecto.

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

Adeel
fuente
0

CEROFILL

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

Por lo tanto

23

se convierte en:

00000023
Simon H
fuente