Pergunta

Acabei com codificações de caracteres confusas em uma de nossas colunas mysql.

Normalmente eu tenho

√© em vez de é
√∂ em vez de ö
√≠ em vez de í

e assim por diante...

Quase certo de que alguém aqui saberia o que aconteceu e como consertar.

ATUALIZAR:Com base na resposta do bobince e como eu tinha esses dados em um arquivo fiz o seguinte

#!/user/bin/env python
import codecs
f = codecs.open('./file.csv', 'r', 'utf-8')
f2 = codecs.open('./file-fixed.csv', 'w', 'utf-8')
for line in f:
    f2.write(line.encode('macroman').decode('utf-8')),

após o qual

load data infile 'file-fixed.csv' 
into table list1 
fields terminated by ',' 
optionally enclosed by '"' 
ignore 1 lines;

importou corretamente os dados.

ATUALIZAÇÃO2:Hammerite, só para completar aqui estão os detalhes solicitados...

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | latin1                     | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+

O SHOW CREATE TABLE para a tabela para a qual estou importando tem DEFAULT CHARSET=utf8

EDITAR3:

Na verdade, com as configurações acima, o load não faça a coisa certa (não consegui comparar com os campos utf8 existentes e apenas com meus dados carregados visto como se tivesse sido carregado corretamente;Presumo que por causa do errado, mas combinando charsets de cliente, conexão e resultados), então atualizei as configurações para:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       | 
| character_set_connection | utf8                       | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     | 
| character_set_results    | utf8                       | 
| character_set_server     | utf8                       | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+

carreguei os dados novamente e, finalmente, carreguei os dados corretamente (comparável aos dados existentes).

Foi útil?

Solução

Seu texto foi codificado para UTF-8 e depois recodificado, erroneamente, como Mac romano.

Você não poderá consertar isso dentro do banco de dados, pois o MySQL não conhece a codificação Mac Roman.Você pode escrever um script para percorrer cada linha de cada tabela afetada e corrigir o texto invertendo o ciclo de codificação/decodificação.Python é uma possibilidade, tendo uma boa variedade de codificações:

>>> print u'é'.encode('macroman').decode('utf-8')
é
>>> print u'ö'.encode('macroman').decode('utf-8')
ö
>>> print u'í'.encode('macroman').decode('utf-8')
í

Alternativamente, se não houver conteúdo não-ASCII que não seja afetado por este problema, você pode tentar usar mysqladmin para exportar um dump SQL e convertê-lo tudo de uma vez, usando um script como acima ou, se você tiver um editor de texto (presumivelmente no Mac) que possa fazer isso, carregando o script como UTF-8 e salvando-o como Mac Romano.Finalmente reimporte o dump usando mysql < dump.sql.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top