Quel est l'avantage de zerofill dans MySQL?

168

Je veux juste savoir quel est l'avantage / l'utilisation de définir ZEROFILLpour INTDataType dans MySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 
diEcho
la source
Bonne question. Questions connexes qui pourraient également être posées: Y a-t-il de bonnes raisons de ne pas utiliser ZEROFILL? Quels sont les inconvénients et les pièges potentiels de l'utilisation de ZEROFILL? Les avantages l'emportent-ils sur les inconvénients?
spencer7593
Voir l'explication stackoverflow.com/questions/5634104/…
priyabagus

Réponses:

254

Lorsque vous sélectionnez une colonne avec un type ZEROFILL, la valeur affichée du champ est remplie de zéros jusqu'à la largeur d'affichage spécifiée dans la définition de colonne. Les valeurs plus longues que la largeur d'affichage ne sont pas tronquées. Notez que l'utilisation de ZEROFILLimplique également UNSIGNED.

L'utilisation d' ZEROFILLune largeur d'affichage et n'a aucun effet sur la façon dont les données sont stockées. Cela n'affecte que la façon dont il est affiché.

Voici un exemple de SQL qui illustre l'utilisation 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;

Résultat:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789
Mark Byers
la source
52
@diEcho: Si, par exemple, vous souhaitez que tous vos numéros de facture soient affichés avec 10 chiffres, vous pouvez déclarer le type de cette colonne comme INT (10) ZEROFILL.
Mark Byers
76
Je vous recommande fortement de rester à l'écart de cette fonctionnalité - la façon dont une valeur numérique est affichée / formatée est un problème de présentation, et absolument pas quelque chose qui appartient au niveau de la base de données; du moins pas si vous utilisez la base de données pour sauvegarder un logiciel. Sachez que cela peut causer des problèmes - si vous analysez une valeur avec un zéro non significatif comme entier, de nombreux analyseurs considéreront la valeur comme octale, ce qui n'est probablement pas ce que vous voulez. La seule fois où vous devriez utiliser cette fonctionnalité, c'est en tant qu'optimisation (de stockage), lorsque ce que vous stockez réellement est en fait une chaîne (de longueur fixe) de chiffres.
mindplay.dk
3
@ mindplay.dk: cela dépend. Si vous stockez quelque chose comme un GTIN, ils doivent comporter 14 chiffres, mais peuvent également ne contenir que 8 chiffres et être remplis à gauche avec des zéros. S'appuyer sur le côté sortie ne serait pas correct dans ce cas, car ce n'est pas simplement une décimale, mais une clé.
DanMan
1
@MarkByers, Cependant, en pratique, la plupart des bibliothèques clientes (par exemple PHP) ne supprimeraient-elles pas simplement les zéros avant de les remettre au code de l'application? Si tel est le cas, cela semble vraiment inutile. Une mauvaise conception aux débuts de MySQL.
Pacerier
131

Un exemple pour comprendre où l'utilisation de ZEROFILLpeut être intéressante:

En Allemagne, nous avons des codes postaux à 5 chiffres. Cependant, ces codes peuvent commencer par un zéro, donc 80337un code postal valide pour munic 01067est un code postal de Berlin.

Comme vous le voyez, tout citoyen allemand s'attend à ce que les codes postaux soient affichés sous forme de code à 5 chiffres, ce qui 1067semble étrange.

Pour stocker ces données, vous pouvez utiliser un VARCHAR(5)ou INT(5) ZEROFILLalors que l'entier rempli à zéro présente deux grands avantages:

  1. Beaucoup moins d'espace de stockage sur le disque dur
  2. Si vous insérez 1067, vous 01067revenez toujours

Peut-être que cet exemple aide à comprendre l'utilisation de ZEROFILL.

Phil
la source
10
Il convient d'ajouter que le client SQL affichant les données est responsable du formatage des nombres avec des zéros non significatifs. Ce n'est pas quelque chose qui se produit "automatiquement" avec chaque application qui récupère les données.
a_horse_with_no_name
Les colonnes à largeur fixe sont également meilleures, car elles réduisent la fragmentation sur disque.
DanMan
@Phil, cependant, en pratique, la plupart des bibliothèques clientes (par exemple PHP) ne supprimeraient-elles pas simplement les zéros avant de les remettre au code de l'application? Si tel est le cas, cela semble vraiment inutile. Une mauvaise conception aux débuts de MySQL.
Pacerier
3
@Pacerier Cela dépend de la façon dont vous souhaitez que les données de votre bibliothèque cliente soient représentées: sous forme de nombre ou de chaîne. Un code postal allemand n'est pas un nombre, c'est une chaîne composée uniquement de chiffres. Par conséquent, je ne suis pas d'accord avec votre déclaration de mauvaise conception au début de MySQL. C'est toujours une approche valable mais dans de rares cas.
Phil
61

C'est une fonctionnalité pour les personnalités dérangées qui aiment les boîtes carrées.

Vous insérez

1
23
123 

mais quand on sélectionne, ça remplit les valeurs

000001
000023
000123
Elijah Saounkine
la source
15

Cela aide à corriger le tri dans le cas où vous auriez besoin de concaténer cet "entier" avec autre chose (un autre nombre ou un autre texte) qui nécessitera alors d'être trié comme un "texte".

par exemple,

si vous devez utiliser les nombres de champ entiers (disons 5) concaténés comme A-005 ou 10/0005

Ken
la source
4

Je sais que je suis en retard à la fête mais je trouve que le zerofill est utile pour les représentations booléennes de TINYINT (1). Null ne signifie pas toujours faux, parfois vous ne le voulez pas. En remplissant à zéro un tinyint, vous convertissez efficacement ces valeurs en INT et supprimez toute confusion que votre application peut avoir lors de l'interaction. Votre application peut ensuite traiter ces valeurs d'une manière similaire au type de données primitif True = Not (0)

Marlin
la source
1
Merci, mais malheureusement, je viens de lancer quelques tests sur une base de données mysql et il ne remplit pas les valeurs nulles: - /. Cet objectif est toujours atteint en contraignant le champ à ne pas autoriser null. Je devrais savoir mieux que d'essayer de répondre à des questions sur les dbs que je n'utilise pas habituellement. Je vais supprimer ma réponse avant que les gens ne soient trop heureux. lol
Marlin
1
Utile? C'est incorrect. Zerofill ne fait rien (sauf ajouter non signé) lorsque la durée d'affichage est de 1.
Brilliand
@Marlin et vous devriez toujours définir une valeur par défaut pour true ou false ... si vous n'utilisez pas de valeurs par défaut, le problème que vous avez mentionné ne sera PAS le seul ... NOT NULL est également un must :)
bakriawad
Je voterais contre mais votre représentant est à 666donc je préférerais garder cette réponse telle quelle;-)
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
la source
1

Si vous spécifiez ZEROFILL pour une colonne numérique, MySQL ajoute automatiquement l'attribut UNSIGNED à la colonne.

Les types de données numériques qui autorisent l'attribut UNSIGNED autorisent également SIGNED. Cependant, ces types de données sont signés par défaut, donc l'attribut SIGNED n'a aucun effet.

La description ci-dessus est tirée du site officiel de MYSQL.

Adeel
la source
0

ZEROFILL

Cela signifie essentiellement que si la valeur entière 23 est insérée dans une colonne INT d'une largeur de 8, le reste de la position disponible sera automatiquement complété par des zéros.

Par conséquent

23

devient:

00000023
Simon H
la source