Accueil du site > SPIP > Réparer le charset d’une base SPIP

Réparer le charset d’une base SPIP

dimanche 30 décembre 2012, par Fil

Quand on part d’une vieille installation de SPIP il arrive qu’on enregistre les données en utf-8 dans des tables déclarées en latin1. Ca ne gêne pas le fonctionnement normal du site, mais ça empêche d’utiliser proprement les outils MySQL, de la ligne de commande (qui affiche des « Ã© » à la place des « é ») au moteur de recherche FULLTEXT, qui ne retrouve pas les mots accentués. Méthode de nettoyage.

0/ Faire toutes les sauvegardes, travailler sur un site de tests, etc. La procédure prend plusieurs minutes. Pour éviter toute connerie dans cet intervalle, tu peux vouloir mettre le site en berne, en mettant dans config/mes_options.php :

    header('Status: 503 Service Unavailable');
    die('Maintenance en cours, revenez plus tard.');

1/ dumper la base spip en latin1, la réimporter en utf8 dans une base spip2

mysqldump --opt  --default-character-set=latin1 --no-create-info spip > spip-data.sql
mysqldump --opt  --default-character-set=latin1 --no-data spip > spip-struct.sql

on corrige tous les charsets déclarés dans la structure

perl -pi -e's/latin1/utf8/g;' spip-struct.sql

On importe la structure corrigée des tables

mysql spip2 < spip-struct.sql

Si le site comporte des tables ayant une PRIMARY KEY sur un champ accentué, il peut y avoir des doublons, non détectés jusqu’ici, qui empêcheront la réimportation. On fait alors sauter cette primary key :

mysql spip2#
   ALTER TABLE spip_urls DROP PRIMARY KEY;

on corrige dans les toutes premières lignes des données la déclaration de charset :

perl -pi -e's/SET NAMES latin1/SET NAMES utf8/g;' spip-data.sql

On réimporte ensuite les données :

mysql spip2 < spip-data.sql

2/ Modifier les meta de charset :

mysql spip2#
   REPLACE spip_meta (nom,valeur,impt,maj) VALUES
     ('charset_sql_base', 'utf8', 'oui', NOW()),
     ('charset_collation_sql_base', 'utf8_general_ci', 'oui', NOW()),
     ('charset_sql_connexion', 'utf8', 'oui', NOW()),
     ('charset', 'utf-8', 'oui', NOW());

3/ Vérifier le fichier config/connect.php :
il faut qu’il ait la ligne :

define('_MYSQL_SET_SQL_MODE',true);

… et le connecter sur spip2.

4/ purger le cache des meta :

rm tmp/meta_cache.php

5/ éventuellement, vider le cache (mais sans obligation)