MySQL 5.1 a 5.5: todos os caracteres UTF-8 perdidos!

3

Eu decidi atualizar minha instalação do Debian, e depois de alguns dias usando o MySQL 5.5, descobri que mysql imprime lixo no terminal em questão de caracteres UTF-8.

Eu dei uma olhada no arquivo SQL que foi produzido por mysqldump e notei que ele já continha o lixo. Hoje abandonei o banco de dados e obtive uma cópia do antigo /var/lib/mysql/database_name/* que estava funcionando bem e, para minha surpresa, ainda recebo os mesmos resultados.

O arquivo produzido por mysqldump inclui as seguintes linhas:

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

/var/lib/mysql/database_name/db.opt dos bancos de dados antigos e novos são os mesmos:

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

O que posso fazer agora? Espero não perder o banco de dados inteiro!

UPDATE

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     |
+---------------+----------------------------------------------+----------------------------+

A saída do nome no último comando deve ser Esaú José de Santana

    
por Teresa e Junior 30.09.2012 / 12:56

2 respostas

2

A resposta de @CL. me ajudou muito com a depuração, mas foi ao contrário: tanto o banco de dados quanto os arquivos de backup foram codificados com latin1, mas o cliente esperava uma saída UTF-8.

A solução foi certificar-se de que character_set_client também estava definido para latin1:

[client]
default-character-set = latin1
    
por 30.09.2012 / 23:37
3

A saída do MySQL e o terminal funcionam corretamente; O problema é que o texto no banco de dados é rotulado como latin1 , mas codificado como utf8 .

Isso pode ser corrigido por

  1. descarregando o banco de dados em um arquivo Latin1 e importando esse arquivo como UTF-8: Corrigindo uma incompatibilidade de codificação de caracteres do MySQL ; ou
  2. no MySQL, convertendo através de binary para ignorar a codificação incorreta:

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

    Corrigindo confusão de codificação de colunas no MySQL .

por 30.09.2012 / 17:49

Tags