En bas j'ai le message « Une incohérence entre le charset de votre site et
celui des tables de votre base de données risque de fausser les recherches
avec caractères accentués » (j'ai bien une structure historique en ISO avec
des contenus UTF-8) et quand je lance la conversion, tous mes accents sont
foirés.
Ca arrive parfois. J'ai eu deux cas :
1) à la toute fin, on vide les caches et c'est bon
2) à la toute fin, c'est pas bon : là il faut analyser le problème
plus en détails.
Mes notes de la dernière fois que ça m'est arrivé (avant-hier !)
(Je vous fait un résumé comme si j'avais pas galéré 4 heures pour
comprendre dans quel ordre faire les choses)
Le problème : dans la base de données DATABASE,
certaines tables ont des problèmes de charset, *mais pas toutes*.
Comment savoir si la table a un problème :
mysql -u(USER) -p(PASSWORD) DATABASE
SELECT titre FROM spip_articles LIMIT 10;
==> "Les petits métiers clandestins"
ici on devrait avoir un "é" et pas "é".
Pour résoudre ça, SPIP propose un outil de conversion efficace :
?exec=convert_sql_utf8
Une fois cette conversion appliquée, j'ai constaté que trois tables de
la base étaient en fait *doublement* en utf8, c'està-dire que le é,
qui en binaire s'écrit é, est devenu (en binaire toujours), "ÃC©",
qui correspond à la conversion utf8 de la chaine iso "é". Donc 4
caractères en binaire, alors qu'il en faut deux. Du coup après
conversion, les tables en question se retrouvaient à afficher des
"é". Vous me suivez ?
Ces trois tables : spip_articles, spip_auteurs, spip_mots : sans doute
lié à notre méthode d'importation initiale des données.
J'ai fait un dump de ces tables en précisant que je voulais un
dump "latin1", histoire d'avoir (en binaire) dans mon fichier dump la
chaîne "é".
# mysqldump --opt --default-character-set=latin1
DATABASE spip_articles spip_auteurs spip_mots >
latin1.sql
Ensuite dans le dump (latin1.sql) j'ai remplacé (avec un éditeur de
texte tout bête) la chaîne :
/*!40101 SET NAMES latin1 */;
en
/*!40101 SET NAMES utf8 */;
puis j'ai réimporté le fichier dump.
# mysql DATABASE < latin1.sql
En important ce fichier MySQL a lu "é" comme étant bien le
caractère "é" en utf8. Ouf.
-- Fil