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)