15
Jun/09
5

Comment convertir une DB de latin1 à UTF8

Un des défis d’être francophone consiste à bien gérer l’encoding. Je ne connais aucune personne n’ayant jamais eu de problème un jour où un autre. On m’a déjà approché pour trouver la manière la plus efficace de convertir une base de données de Latin1 à UTF8. Voici ce que j’ai trouvé. Ce n’est peut-être pas la manière la plus efficace, mais je n’ai pas eu problème après l’avoir testé. J’ai utilisé cette technique pour convertir une base de données de 115Go et tout c’est bien déroulé.

L’astuce consiste à transformer les chaines de caractères à un format binaire, pour ensuite les reconvertir en UTF8.

  1. ALTER DATABASE myDbNameDEFAULT CHARACTER SET utf8;
  2.  
  3. ALTER TABLE Groups DEFAULT CHARACTER SET utf8;
  4.  
  5. ALTER TABLE Groups MODIFY Domain VARBINARY(64) NULL DEFAULT NULL,
  6. MODIFY Type VARBINARY(64) NULL DEFAULT NULL,
  7. MODIFY Description VARBINARY(255) NULL DEFAULT NULL,
  8. MODIFY Name VARBINARY(200) NULL DEFAULT NULL;
  9.  
  10. ALTER TABLE Groups MODIFY Domain VARCHAR(64) CHARACTER SET utf8 NULL DEFAULT NULL,
  11. MODIFY Type VARCHAR(64) CHARACTER SET utf8 NULL DEFAULT NULL,
  12. MODIFY Description VARCHAR(255) CHARACTER SET utf8 NULL DEFAULT NULL,
  13. MODIFY Name VARCHAR(200) CHARACTER SET utf8 NULL DEFAULT NULL;

That’s it ! Super simple et efficace. Un coup qu’une string originalement Latin1 est convertie en format binaire, il n’y a plus de character set ni de collation qui tiennent. Elle devient un format binaire au même titre qu’une image JPG par exemple. Ensuite, on reprend ce format binaire et on réapplique un character set (et la collation par défaut dans mon exemple).

Il faut cependant ne pas négliger un aspect lors de cette conversion. Les caractères Latin1 utilise 1 byte par caractère alors qu’un caractère UTF8 utilisent 3 bytes par caractère. Si l’espace disque est une de vos contraintes, il ne faut pas prendre cette conversion à la légère!

Tagged as: