[Cascavel-pm] [off] Problemas com charset. Dicas para solução?

breno breno em rio.pm.org
Domingo Junho 20 22:01:01 PDT 2010


2010/6/20 Andre Carneiro <andregarciacarneiro em gmail.com>:
>
>
>>
>> Segue um exemplo de pequenas frases com problemas:
>> CAF� DA TARDE
>> --> deveria ser "CAFÉ DA TARDE"
>>
>> Café
>> --> deveria ser "Café"
>>
>> REUNI�ES INTERNAS
>> --> deveria ser "REUNIÕES INTERNAS"
>>
>>
>
> A codificação de caracteres do mysqldump está diferente da configuração do
> 'locales' do S.O. de quem criou o dump, e/ou diferente da codificação de
> caracteres do próprio mysql. Esse é o problema.
>
> Você pode tentar usar esse script na linha de comando:
> <code>
> user$ perl -MEncode -e 'open my $ndump ,">","/tmp/meunovodump.sql"
> while(<>){my $line = $_; my $nline = decode "iso-8859-1",$line; $nline =
> encode "utf-8",$nline; print $ndump $nline;}close $ndump;'
> path/para/o/dump/cagado.sql
> </code>
> Isso lê o arquivo com a codificação errada, linha a linha, converte cada
> linha de iso-8859-1 para utf-8 e escreve num novo arquivo em /tmp.
>
>  O que é estranho, é que você disse que a página está em utf-8. O código do
> dump também parece estar em UTF-8, portanto não deveria estar exibindo
> caracteres 'idiotas'. Sugiro que você vá saber primeiro qual é a codificação
> em todo o caminho do fluxo desses dados, desde S.O., máquinas etc. para
> saber exatamente para qual codificação você deve converter os seus dados.
>

Se funciona para registros novos, de repente até uma subsituição
simples no dump (com vim ou perl) já resolveria. Mudar os comandos do
dump pra apenas alterar as entradas com problemas sem fazer drop nas
tabelas ou modificar índices não me parece um grande desafio (por
outro lado não sei a complexidade do modelo). Quanto a adivinhar a
codificação, os arquivos gerados pelo mysqldump costumam definir isso
dentro do arquivo (procure por SET NAMES $foo). Na pior das hipóteses,
abra o dump no vim (ou no perl), e veja qual código ele representa.
Daí ou tente fazer a conversão apropriada (como Blabos e Andre
sugeriram) ou troque pela correta via substituição simples.

A título de "não cometamos o mesmo erro no futuro", lembre-se que dá
pra forçar charset no mysqldump (veja a opção
--default-character-set=$foo)

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_default-character-set

E que devemos sempre testar backups antes de dependermos deles :-)

[]s

-b


Mais detalhes sobre a lista de discussão Cascavel-pm