Corrigindo codificações
-
26-09-2019 - |
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).
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
.