181 votes

Quel est l'avantage de zerofill dans MySQL ?

Je veux juste savoir quel est l'intérêt/utilisation de définir ZEROFILL para INT DataType dans MySQL ?

`id` INT UNSIGNED ZEROFILL NOT NULL

0 votes

Bonne question. Des questions connexes 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 ?

0 votes

271voto

Mark Byers Points 318575

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

Utilisation de ZEROFILL et une largeur d'affichage n'a aucun effet sur la façon dont les données sont stockées. Elle n'affecte que la façon dont elles sont affichées.

Voici un exemple de SQL qui démontre l'utilisation de la fonction 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

52 votes

@diEcho : Si par exemple vous voulez 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.

81 votes

Je vous recommande vivement de ne pas utiliser cette fonctionnalité - la façon dont une valeur numérique est affichée/formatée est une question de présentation, et n'a absolument rien à faire au niveau de la base de données ; du moins pas si vous utilisez la base de données pour soutenir un logiciel. Sachez que cela peut causer des problèmes - si vous analysez une valeur avec un zéro en tête comme un nombre entier, de nombreux analyseurs syntaxiques 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 pour optimiser le stockage, lorsque ce que vous stockez réellement est une chaîne de chiffres (de longueur fixe).

3 votes

@mindplay.dk : Ça dépend. Si vous stockez quelque chose comme un GTIN, il doit comporter 14 chiffres, mais il peut aussi n'en comporter que 8 et être complété par des zéros. Se fier au côté sortie ne serait pas correct dans ce cas, car il ne s'agit pas simplement d'une décimale, mais d'une clé.

138voto

Phil Points 1158

Un exemple afin de comprendre, où l'utilisation de ZEROFILL pourrait être intéressant :

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

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

Afin de stocker ces données, vous pouvez utiliser un fichier VARCHAR(5) o INT(5) ZEROFILL alors que l'entier à remplissage 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 obtenez toujours 01067 arrière

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

10 votes

Il convient d'ajouter que le Client SQL qui affiche les données est responsable du formatage des chiffres avec des zéros de tête. Ce n'est pas quelque chose qui se produit "automatiquement" avec chaque application qui récupère les données.

0 votes

Les colonnes à largeur fixe sont également préférables, car elles réduisent la fragmentation sur le disque.

0 votes

@Phil, En pratique, la plupart des bibliothèques clientes (par exemple PHP) n'enlèvent-elles pas simplement les zéros avant de les transmettre au code de l'application ? Si c'est le cas, alors cela semble vraiment inutile. Une mauvaise conception dans les premiers jours de MySQL.

63voto

Elijah Saounkine Points 4108

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

Vous insérez

1
23
123 

mais quand on sélectionne, cela remplit les valeurs

000001
000023
000123

15voto

Ken Points 71

Il permet un tri correct dans le cas où vous auriez besoin de concaténer ce "nombre entier" avec quelque chose d'autre (un autre nombre ou un texte) qui devra ensuite être trié comme un "texte".

par exemple,

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

5voto

Marlin Points 548

Je sais que j'arrive tard dans la soirée mais je trouve que le zerofill est utile pour les représentations booléennes de TINYINT(1). Null ne signifie pas toujours False, parfois on ne le veut pas. En remplissant à zéro un tinyint, vous convertissez effectivement ces valeurs en INT et vous supprimez toute confusion que votre application pourrait avoir lors de l'interaction. Votre application peut alors traiter ces valeurs d'une manière similaire au type de données primitif True = Not(0).

1 votes

Merci, mais malheureusement je viens de faire quelques tests avec 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 les valeurs nulles. Je ne devrais pas essayer de répondre à des questions sur des bases de données que je n'utilise pas habituellement. Je vais supprimer ma réponse avant que les gens ne soient trop heureux de me descendre. lol

1 votes

Utile ? C'est incorrect. Zerofill ne fait rien (sauf ajouter Unsigned) lorsque la longueur de l'affichage est de 1.

0 votes

@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 alors le problème que vous avez mentionné ne sera PAS le seul... NOT NULL est également un must :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X