MySQL 5.1 à 5.5: tous les caractères UTF-8 sont perdus!

J'ai décidé de mettre à niveau mon installation Debian, et après quelques jours en utilisant MySQL 5.5, j'ai trouvé que mysql imprime des ordures au terminal au lieu des caractères UTF-8.

J'ai jeté un oeil au file SQL qui a été produit par mysqldump , et j'ai remarqué qu'il contenait déjà les ordures. Aujourd'hui, j'ai lâché la database et j'ai obtenu une copy de l'ancienne /var/lib/mysql/database_name/* qui fonctionnait bien et, à ma grande surprise, j'obtiens toujours les mêmes résultats.

Le file produit par mysqldump inclut les lignes suivantes:

 /*!40101 SET NAMES utf8 */; /*!40101 SET character_set_client = utf8 */; ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

/var/lib/mysql/database_name/db.opt de l'ancienne et de la nouvelle database sont les mêmes:

 default-character-set=latin1 default-collation=latin1_swedish_ci 

Que puis-je faire maintenant? J'espère que je ne vais pas perdre toute la database!

METTRE À JOUR

 show session variables like 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ SELECT charset(name), hex(name), name FROM table WHERE id='123'; +---------------+----------------------------------------------+----------------------------+ | charset(name) | hex(name) | name | +---------------+----------------------------------------------+----------------------------+ | latin1 | 457361C3BA204A6F73C3A92064652053616E74616E61 | Esaú José de Santana | +---------------+----------------------------------------------+----------------------------+ 

La sortie du nom dans la dernière command doit être Esaú José de Santana

La sortie MySQL et le terminal fonctionnent correctement; le problème est que le text dans la database est étiqueté comme latin1 , mais effectivement codé comme utf8 .

Cela peut être corrigé par

  1. le dumping de la database dans un file Latin1, puis l'import de ce file en tant que UTF-8: Correction d'une incompatibilité de encoding de caractères MySQL ; ou
  2. dans MySQL, convertir en binary pour ignorer le mauvais enencoding:

     UPDATE table SET column=CONVERT(CONVERT(column USING binary) USING utf8) WHERE id=123; 

    Correction de l'enencoding des colonnes dans MySQL .

La réponse de @CL. m'a beaucoup aidé avec le debugging, mais c'était l'inverse: la database et les files de sauvegarde étaient codés avec latin1, mais le client attendait la sortie UTF-8.

La solution était de s'assurer que character_set_client était aussi bien sur latin1:

 [client] default-character-set = latin1