Dans un de mes projet, j'ai eu besoin de transformer des résultats sur une base de données,
le bute était de convertir tout les caractères accentués vers leurs équivalents (non accentués) et de remplacer les espaces par des tiret.
Exemple: à vers a, é vers e, ê vers e, ect ..., Facile j'utilise la fonction Translate ...
mysql> SELECT translate('très accentués', 'éèê', 'eee'); ERROR 1305 (42000): FUNCTION maBase.TRANSLATE does NOT exist
Seulement voila cette fonction n'existe pas sous Mysql.
Comme il était hors de question de passer par php pour faire cette transformation, j'ai googler, binger ...
et rien sur le net sauf des fainéants qui n'ont pas voulu se prendre la tête et sont passer par php ou autre language de script.
J'ai donc décider de créer cette fonction très utile que je vous livre ci-dessous et qui va servir a d'autre personnes.
# Modification du caractère de fin d instruction DELIMITER | # On fait passer le jeux de caractères sur utf8 sinon CHAR_LENGTH('â') = 2 au lieu de 1 SET NAMES utf8; # Création de la function translate CREATE FUNCTION translate(V_string VARCHAR(255), V_from VARCHAR(255), V_to VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC BEGIN DECLARE i INT; SET i = CHAR_LENGTH(V_from); WHILE i > 0 DO SET V_string = REPLACE(V_string, SUBSTR(V_from, i, 1), SUBSTR(V_to, i, 1)); SET i = i - 1; END WHILE; RETURN V_string; END; | # Très important, Remise du delimiter standard DELIMITER ;
Et maintenant:
mysql> SELECT translate('très accentués', 'éèê', 'eee'); +---------------------------------------------+ | translate('très accentués', 'éèê', 'eee') | +---------------------------------------------+ | tres accentues | +---------------------------------------------+ 1 row IN SET (0.00 sec)
Un autre exemple plus complet:
# Appel de la function mysql> SELECT translate('Une très bonne initiative et à bientôt', 'ÁÀÂÄÃÅÇÉÈÊËÍÏÎÌÑÓÒÔÖÕÚÙÛÜÝáàâäãåçéèêëíìîïñóòôöõúùûüýÿ', 'AAAAAACEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuuuyy'); +------------------------------------------------------------+ | translate('Une très bonne initiative et à bientôt', ...... | --------------------------------------------------------------+ | Une tres bonne initiative et a bientot | +------------------------------------------------------------+ 1 row IN SET (0.00 sec)

