Manipulations sur les adresses e-mail d’une table sur MySQL
Supposons un intranet d’entreprise sur un domaine « domaine.fr », avec messagerie électronique en @domaine.fr pour tous les utilisateurs.
Arrive le jour où l’architecture de l’intranet fait l’objet d’une évolution passant par le changement de domaine : domaine.fr devient intranet.nom.fr. Il va falloir, sur nombre de tables, modifier toutes les adresses e-mail de tous les utilisateurs. Il faudra peut-être gérer, pour certains cas, des adresses e-mail mal orthographiées (domiane.fr), avec une casse différente (DOMAINE.FR), ou, comme j’ai pu le constater récemment sur un bug tracker où les utilisateurs s’inscrivaient eux-mêmes, des domaines totalement différents de celui mis en place (gmail.com)… voire pas de domaine du tout (simple nom d’utilisateur sous la forme prenom.nom) !
La simplicité voudrait que l’on édite le dump de la base de données avec son éditeur de texte favori (Notepad++ sur Windows, vi sous Linux… en ce qui me concerne) et que l’on fasse les modifications avec une fonction de remplacement de texte. Seulement, l’hétérogénéité des adresses e-mail enregistrées et surtout la taille du dump sont deux freins non négligeables à cette solution. Ouvrir un dump de 1 Go avec Notepad++ ? Impensable ! Exporter uniquement les tables où figurent les adresses e-mail, puis ensuite les réinjecter ? Pourquoi pas, mais en fonction des outils mis en place sur l’intranet, cette méthode peut se réveler fastidieuse. Modifier manuellement dans la table les adresses e-mail ? Oui pour quelques utilisateurs, non pour plusieurs dizaines voire centaines d’utilisateurs.
Il y a une solution simple, efficace et rapide avec MySQL. Démonstration :
mysql> DESC users; +-------+-------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | Extra | +-------+-------------+------+-----+---------+-------+ | email | VARCHAR(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 1 ROW IN SET (0.05 sec) mysql> SELECT * FROM users; +-------------------------------+ | email | +-------------------------------+ | sergent.bellec | | capitaine.flamme@DOMAINE.FR | | lieutenant.columbo@domaine.fr | | colonel.moutarde@youpi.fr | +-------------------------------+ 4 ROWS IN SET (0.05 sec) mysql> UPDATE users SET email=concat(substring_index(email,'@',1),'@intranet.nom.fr'); Query OK, 4 ROWS affected (0.00 sec) ROWS matched: 4 Changed: 4 Warnings: 0 mysql> SELECT * FROM users; +------------------------------------+ | email | +------------------------------------+ | sergent.bellec@intranet.nom.fr | | capitaine.flamme@intranet.nom.fr | | lieutenant.columbo@intranet.nom.fr | | colonel.moutarde@intranet.nom.fr | +------------------------------------+ 4 ROWS IN SET (0.00 sec)
Explications :
- La fonction substring_index permet de découper la valeur d’un champ avec un délimiteur ;
- La fonction concat permet de concaténer (ah bon ?) deux éléments.
Grâce à ces deux fonctions, la requête récupère pour chaque utilisateur la partie avant l’arobase, y ajoute la valeur « @intranet.nom.fr » et met à jour le champ. Tout simplement.
