Éviter le double encodage dans MySQL
Rédigé par Marc GUILLAUME | Aucun commentaireVotre site affiche des caractères bizarres ?
Votre site web est en utf-8, ce qui est correctement indiqué par la balise meta idoine :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Vos tables MySQL sont déclarées en utf8_general_ci
, mais vos écritures se font sans avertir MySQL de cet état, et vous courrez à la catastrophe.
C'est un cas de figure qui peut facilement se présenter si lorsque vous écrivez dans les base vous n'utilisez pas le paramètre SET NAMES 'UTF8';
. Comme MySQL, pour des raisons « historiques », considère par défaut que les informations qui lui sont envoyées sont codées au format ISO, si votre table utilise l'encodage utf8_general_ci
MySQL va convertir les données reçues en utf-8
. Si elle reçoit des données qui se trouvent déjà encodées utf-8
sans le paramètre ci-dessus elle va les traiter comme des données ISO et les ré-encoder en utf-8
, ce double encodage conduisant à un affichage aberrant.
Il peut arriver que vous rendiez compte du ce problème en utilisant PhpMyAdmin et une base MySQL en utf-8. Si le site couplé à la base ne prend pas la précaution d'utiliser l'instruction SET NAMES
. Le phénomène se trouve exposée sur cette page http://wiki.php]myadmin.net/pma/garbled_data.
Dans PhpMyAdmin cela vous sautera aux yeux, car lui utilise correctement l'écriture dans des tables utf-8
. Du coup le contenu d'un champ que vous avez saisi via un formulaire sur votre site et qui contient ceci "Âéàùèréçà" après son ré-encodage dans la table s'affichera ainsi "Âéà ùèréçÃ" dans PhpMyAdmin.
Pour écrire en utf-8
dans MySQL prenez l'habitude d'envoyer, juste après la connexion à MySQL (via php par exemple), la commande suivante : SET NAMES 'UTF8';
, ainsi vous n'aurez plus de double encodage et votre affichage sera correct à la fois sur votre site et dans PhpMyadmin, et surtout vos tables MySQL contiendront des enregistrement en utf-8
propre.