Encodage et migration de la base de données de SPIP en UTF-8

Aujourd'hui, lorsque vous installez un SPIP 2.x, vous avez une belle base de données avec un interclassement "utf8_general_ci" et des données ayant un jeu de caractères en UTF-8.

Avant SPIP 2.x, la base de données se retrouvait avec un interclassement "latin1_swedish_ci" et un jeu de caractères en ISO-8859-1. SPIP offrait la possibilité de convertir les données avec un jeu de caractères en UTF-8 et dès SPIP 1.9, cette conversion était imposée.

Ainsi, nous pouvions avoir un SPIP avec une base de données en UTF-8... Oui, mais faussement en UTF-8. La base et les tables avaient toujours un interclassement "latin1_swedish_ci" et les données avaient reçu un coup de utf8_encode() par SPIP. L'accentuation étaient par conséquent transformée, de telle manière que le "é" était devenu "é" et SPIP passait un coup de utf8_decode() pour que l'accentuation s'affiche correctement, en ayant vérifié au préalable la valeur du "charset" de la table "spip_meta".

Cette conversion n'est pas ce que l'on peut appeler de propre. Elle pouvait provoquer quelques problèmes avec le moteur de recherche où la recherche ne permettait pas de trouver des mots accentués.

Pour avoir une base propre, il faut que les données aient un jeu de caractères en UTF-8, et que la base, ainsi que les tables aient un interclassement "utf8_general_ci". Pour ce faire, il suffit d’exécuter les commandes suivantes :

mysqldump -u{identifiantBase} -p{motdepasseBase} --quote-names --set-charset --default-character-set=latin1 {nomBase} > {nomFichier1}.sql
cat {nomFichier1}.sql |sed -e 's/latin1/utf8/g' > {nomFichier2}.sql
mysql -u{identifiantBase} -p{motdepasseBase} {nomBase} < {nomFichier2}.sql

Une fois que c'est fait, vous n'avez plus rien à faire si votre SPIP est antérieur à un 2.x. Par contre, si vous avez un SPIP 2.x qui est issu d'un SPIP 1.9.x, il vous faut rajouter "mysql_query("SET NAMES 'utf8'");" dans le fichier "connect.php" dans le répertoire "config" pour que l'accentuation s'affiche correctement sur le site.

En fait, lors de la migration d'un SPIP vers un SPIP 2.x, SPIP ne migre pas totalement la table "spip_meta". Il manque des valeurs et c'est pour cette raison qu'il faut rajouter "mysql_query("SET NAMES 'utf8'");".

Si vous voulez vraiment avoir une base SPIP correcte, soit vous prenez la table "spip_meta" d'un SPIP 2.x, ce que je conseille, soit vous rajoutez 3 enregistrements dans cette table :

  • "charset_sql_base" avec la valeur "utf8"
  • "charset_collation_sql_base" avec la valeur "utf8_general_ci"
  • "charset_sql_connexion" avec la valeur "utf8"

Et vous n'aurez pas besoin de "mysql_query("SET NAMES 'utf8'");".

Après cette migration, vous obtenez une belle base de données à la SPIP 2.x.

NB : Bien-entendu, les 3 lignes de code peuvent être utilisées pour le même besoin sur une base de données Mysql autre que SPIP.

4 commentaires

  1. Bonjour,
    Une autre solution plus simple à mettre en œuvre si l’on part d’un site en SPIP 1.9.2 et antérieur est de migrer vers SPIP 2.1, de convertir la base pour cette version de SPIP, d’installer le plugin Fulltext (http://www.spip-contrib.net/Fulltex…), puis d’utiliser l’outil de conversion vers utf8 de ce plugin.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.