Dans ma base de données MySQL InnoDB, j'ai des données de code Zip sales que je veux nettoyer.
Les données de code postal propres correspondent aux 5 chiffres d’un code postal (p. Ex. "90210").
Mais pour une raison quelconque, j’ai remarqué dans ma base de données que pour les codes postaux commençant par "0", le 0 avait été supprimé.
Donc "Holtsville, New York" avec le code postal "00544
"est stocké dans ma base de données sous le nom" 544
"
et
"Dedham, MA" avec le code postal "02026
"est stocké dans ma base de données sous le nom" 2026
".
Quel code SQL puis-je exécuter sur le pavé avant "0" avec un code postal ne comportant pas 5 chiffres? Cela signifie que si le code postal est composé de 3 chiffres, le pavé avant "00". Si le code postal est composé de 4 chiffres, le pavé avant ne contient que "0".
UPDATE :
Je viens de changer le code postal pour être de type VARCHAR (5)
Stockez vos codes postaux sous la forme CHAR (5) au lieu d'un type numérique ou laissez votre application la saisir avec des zéros lorsque vous la chargez à partir de la base de données. Une façon de le faire avec PHP en utilisant sprintf()
): =
echo sprintf("%05d", 205); // prints 00205
echo sprintf("%05d", 1492); // prints 01492
Ou vous pourriez avoir MySQL le compiler pour vous avec LPAD()
:
SELECT LPAD(Zip, 5, '0') as zipcode FROM table;
Voici un moyen de mettre à jour et de remplir toutes les lignes:
ALTER TABLE `table` CHANGE `Zip` `Zip` CHAR(5); #changes type
UPDATE table SET `Zip`=LPAD(`Zip`, 5, '0'); #pads everything
Vous devez décider de la longueur du code postal (qui, à mon avis, devrait comporter 5 caractères). Ensuite, vous devez dire à MySQL de remplir les chiffres à zéro.
Supposons que votre table s'appelle mytable
et que le champ en question soit zipcode
, tapez smallint
. Vous devez émettre la requête suivante:
ALTER TABLE mytable CHANGE `zipcode` `zipcode`
MEDIUMINT( 5 ) UNSIGNED ZEROFILL NOT NULL;
L'avantage de cette méthode est qu'elle laisse vos données intactes, vous n'avez pas besoin d'utiliser de déclencheurs lors de l'insertion/de la mise à jour des données, vous n'avez pas besoin d'utiliser de fonctions lorsque vous SELECT
les données et que vous pouvez toujours supprimer les zéros supplémentaires. ou augmentez la longueur du champ si vous changez d'avis.
Ok, vous avez donc changé la colonne de Number en VARCHAR (5). Maintenant, vous devez mettre à jour le champ de code postal pour qu'il soit rempli à gauche. Le SQL à faire serait:
UPDATE MyTable
SET ZipCode = LPAD( ZipCode, 5, '0' );
Ceci ajoutera 5 caractères à toutes les valeurs de la colonne ZipCode, en ajoutant des "0" à gauche.
Bien sûr, maintenant que toutes vos anciennes données ont été corrigées, vous devez vous assurer que vos nouvelles données sont également complétées par des zéros. Il existe plusieurs écoles de pensée sur la bonne façon de le faire:
Manipulez-le dans la logique métier de l'application. Avantages: solution indépendante de la base de données, n'implique pas davantage d'informations sur la base de données. Inconvénients: doit être géré partout où il écrit dans la base de données, dans toutes les applications.
Manipulez-le avec une procédure stockée. Avantages: Les procédures stockées appliquent les règles métier à tous les clients. Inconvénients: Les procédures stockées sont plus compliquées que de simples instructions INSERT/UPDATE et ne sont pas aussi portables dans les bases de données. Un INSERT/UPDATE nu peut toujours insérer des données non complétées de zéros.
Manipulez-le avec une gâchette. Avantages: fonctionnera pour les procédures stockées et les instructions nues INSERT/UPDATE. Inconvénients: solution moins portable. La solution la plus lente. Les déclencheurs peuvent être difficiles à obtenir.
Dans ce cas, je le gérerais au niveau de l'application (le cas échéant) 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 des codes 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, plutôt que d'empêcher quelqu'un d'entrer la valeur correcte, même si ce format ne correspond pas tout à fait à ce que vous attendiez.
tu devrais utiliser UNSIGNED ZEROFILL
dans la structure de votre table.
Je sais que c'est bien après le PO. Une façon de procéder consiste à garder la table stockant les données de code postal sous la forme d'un INT non signé mais affiché avec des zéros, comme suit.
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 que INT et puisse économiser de l’espace en 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 y être dirigée par rapport à la table elle-même.
CHAR(5)
ou
MEDIUMINT (5) UNSIGNED ZEROFILL
Le premier prend 5 octets par code postal.
La seconde ne prend que 3 octets par code postal. L'option ZEROFILL est nécessaire pour les codes ZIP avec des zéros non significatifs.
Il serait toujours judicieux de créer votre champ Code postal en tant que champ entier non signé zerofilled.
CREATE TABLE xxx ( zipcode INT(5) ZEROFILL UNSIGNED, ... )
De cette façon, mysql s'occupe du rembourrage pour vous.
LPAD fonctionne avec VARCHAR2 car il ne met pas d'espaces pour les octets restants. LPAD change les octets restants/nuls en zéros sur LHS SO le type de données doit être VARCHAR2