Dans ma base de données MySQL InnoDB, j'ai des données de code postal sales que je veux nettoyer.
Les données de code postal propres sont lorsque j'ai les 5 chiffres pour un code postal (par exemple "90210").
Mais pour une raison quelconque, j'ai remarqué dans ma base de données que pour les codes zip qui commencent par un "0", le 0 a été abandonné.
Donc " Holtsville, New York " avec le code postal " 00544
" est stocké dans ma base de données sous " 544
"
et
" Dedham, MA " avec le code postal " 02026
" est stocké dans ma base de données sous le nom " 2026
".
Quel SQL puis-je exécuter sur le pavé avant "0" vers un code postal qui ne comporte pas 5 chiffres? Cela signifie que si le code postal comporte 3 chiffres, le pavé avant "00". Si le code postal comporte 4 chiffres, le pavé avant est juste "0".
MISE À JOUR :
Je viens de changer le code postal pour qu'il soit de type de données VARCHAR (5)
la source
Réponses:
Stockez vos codes postaux en tant que CHAR (5) au lieu d'un type numérique, ou demandez à votre application de le remplir avec des zéros lorsque vous le chargez à partir de la base de données. Une façon de le faire avec PHP en utilisant
sprintf()
:Ou vous pouvez demander à MySQL de le remplir pour vous avec
LPAD()
:Voici un moyen de mettre à jour et de remplir toutes les lignes:
la source
ZEROFILL
réponses.CHARACTER SET
est utf8, celaCHAR(5)
prendra inutilement 15 octets!Vous devez décider de la longueur du code postal (qui, je crois, devrait contenir 5 caractères). Ensuite, vous devez dire à MySQL de remplir les nombres à zéro.
Supposons que votre table soit appelée
mytable
et que le champ en question soitzipcode
, typesmallint
. Vous devez émettre la requête suivante:L'avantage de cette méthode est qu'elle laisse vos données intactes, il n'est pas nécessaire d'utiliser des déclencheurs lors de l'insertion / mise à jour des données, il n'est pas nécessaire d'utiliser des fonctions lorsque vous utilisez
SELECT
les données et que vous pouvez toujours supprimer les zéros supplémentaires ou augmenter la longueur du champ. vous changez d'avis.la source
Ok, donc vous avez changé la colonne de Number à VARCHAR (5). Vous devez maintenant mettre à jour le champ du code postal pour qu'il soit rempli à gauche. Le SQL pour faire cela serait:
Cela remplira toutes les valeurs de la colonne ZipCode à 5 caractères, en ajoutant des «0» sur la gauche.
Bien sûr, maintenant que toutes vos anciennes données sont corrigées, vous devez vous assurer que vos nouvelles données sont également remplies de zéro. Il existe plusieurs écoles de pensée sur la bonne façon de procéder:
Gérez-le dans la logique métier de l'application. Avantages: solution indépendante de la base de données, n'implique pas d'en savoir plus sur la base de données. Inconvénients: doit être manipulé partout où écrit dans la base de données, dans toutes les applications.
Traitez-le avec une procédure stockée. Avantages: les procédures stockées appliquent les règles métier pour tous les clients. Inconvénients: les procédures stockées sont plus compliquées que les simples instructions INSERT / UPDATE et ne sont pas aussi portables entre les bases de données. Un INSERT / UPDATE nu peut toujours insérer des données non complétées par zéro.
Manipulez-le avec une gâchette. Avantages: fonctionnera pour les procédures stockées et les instructions INSERT / UPDATE nues. Inconvénients: Solution la moins portable. Solution la plus lente. Les déclencheurs peuvent être difficiles à obtenir.
Dans ce cas, je le gérerais au niveau de l'application (voire pas du tout), et non au niveau de la base de données. Après tout, tous les pays n'utilisent pas un code postal à 5 chiffres (pas même les États-Unis - nos codes postaux sont en fait Zip + 4 + 2: nnnnn-nnnn-nn) et certains autorisent les lettres ainsi que les chiffres. Mieux vaut NE PAS essayer de forcer un format de données et d'accepter l'erreur de données occasionnelle, que d'empêcher quelqu'un d'entrer la valeur correcte, même si son format n'est pas tout à fait ce que vous attendiez.
la source
Je sais que c'est bien après l'OP. Une façon que vous pouvez utiliser qui garde la table stockant les données de code postal en tant qu'INT non signé mais affichée avec des zéros est la suivante.
select LPAD(cast(zipcode_int as char), 5, '0') as zipcode from table;
Bien que cela préserve les données d'origine en tant qu'INT et puisse économiser de l'espace de stockage, le serveur effectuera la conversion INT en CHAR pour vous. Cela peut être jeté dans une vue et la personne qui a besoin de ces données peut être dirigée vers la table elle-même.
la source
Il serait toujours judicieux de créer votre champ de code postal sous la forme d'un champ entier non signé rempli de zéros.
CREATE TABLE xxx ( zipcode INT(5) ZEROFILL UNSIGNED, ... )
De cette façon, mysql s'occupe du remplissage pour vous.
la source
ou
Le premier prend 5 octets par code postal.
Le second ne prend que 3 octets par code postal. L'option ZEROFILL est nécessaire pour les codes postaux avec des zéros non significatifs.
la source
vous devez utiliser
UNSIGNED ZEROFILL
dans votre structure de table.la source
LPAD fonctionne avec VARCHAR2 car il ne met pas d'espaces pour les octets restants. LPAD remplace les octets restants / nuls par des zéros sur le type de données LHS SO doit être VARCHAR2
la source