Jeffrey Cross
Jeffrey Cross

Migração de banco de dados MySQL: conversão de latin1 para utf8

Até a versão 4.1, as tabelas do MySQL eram codificadas com o conjunto de caracteres latin1. Por padrão, o conjunto de caracteres agora é utf8. Isso é bom em termos de suporte a caracteres não latinos, mas se você estiver fazendo upgrade de um banco de dados antigo, poderá ter muitos problemas de codificação de caracteres.

Migrei recentemente vários bancos de dados antigos da versão 4.0 para o MySQL 5 e converti algumas tabelas de latin1 para utf8, e reuni alguns truques que podem ajudá-lo no processo. Até agora, basicamente eu tenho três problemas principais: converter uma tabela do conjunto de caracteres latin1 para utf8, atualizar um conjunto de banco de dados inteiro que foi exportado corretamente com mysqldump e (o pior) migrar um conjunto inteiro de arquivos MYI e MYD do banco de dados que não foram exportados corretamente.

Convertendo uma tabela latin1 para utf8 Se você já migrou com sucesso para a nova versão do MySQL, mas tem uma tabela codificada latin1 mais antiga e simplesmente deseja alterar o conjunto de caracteres para utf8, é um exercício bem simples. Primeiro, exporte a tabela com o mysqldump:

mysqldump -u username -p banco de dados --default-character-set = latin1 table> tableoutput.sql

Primeiro faça um backup desse arquivo e edite-o para ajustar duas coisas. Encontre a linha que contém “SET NAMES latin1” e mude para “SET NAMES utf8”. Em seguida, observe a definição da tabela e altere “DEFAULT CHARSET = latin1” para “DEFAULT CHARSET = utf8”. Finalmente, reimporte a tabela:

cat tableoutput.sql | mysql --default-character-set = utf8 -u username -p database

Quando for importado de volta, ele será criado corretamente como uma tabela utf8 e você não deverá ter problemas de codificação de caracteres. Você pode fazer isso para um banco de dados inteiro com a mesma técnica e usando uma pesquisa e substituir para mudar de latin1 para utf8.

Atualizando um conjunto de banco de dados inteiro que foi exportado corretamente com o mysqldump Esse é um cenário bem simples. Você exportou todo o seu banco de dados da versão anterior do MySQL com algo assim:

mysqldump --default-character-set = latin1 -u username -p banco de dados> dboutput.sql

Você pode então importá-lo como uma tabela latin1 ou convertê-lo para utf8 como fizemos acima. Apenas certifique-se de ajustar os valores de “SET NAMES” e “CHARACTER SET” apropriadamente, e defina o parâmetro “–default-character-set” para utf8 ou latin1, conforme apropriado.

Observe que o conjunto de caracteres padrão agora é utf8, a menos que você o altere no arquivo my.cnf. Eu estive em sistemas em que ele foi definido como latin1 por motivos de compatibilidade, por isso você não pode simplesmente assumir isso. Certifique-se de que todo o código do seu banco de dados (em seu php, perl, whatever) emita a instrução SQL “SET NAMES utf8” antes de emitir qualquer comando SQL adicional. Isso garantirá que o que você definir em INSERTs e receber em SELECTs não seja codificado incorretamente. Se você estiver usando uma tabela legada latin1, certifique-se de fazer o mesmo, mas com a configuração latin1.

Migrando um conjunto inteiro de arquivos MYI e MYD do banco de dados que não eram exportados corretamente Eu era um idiota outro dia e não exportava corretamente um dos bancos de dados do meu servidor antes de atualizá-lo para o MySQL 5. Após a atualização, todos os meus bancos de dados estavam corrompidos , incluindo o banco de dados mysql, o que significa que eu não pude nem mesmo efetuar login. O comando mysql_upgrade não corrigiu as coisas corretamente, e foi tudo porque o MySQL assumiu que minhas tabelas daquela versão mais antiga estavam codificadas em utf8.

Foi como uma chatice.

Não sei se existe uma maneira mais fácil, mas é assim que consegui fazer a transição de todos os arquivos MYI e MYD para o novo banco de dados, sem reverter para a versão mais antiga e exportar corretamente.

Primeiro, você precisa alterar a configuração do mysql para que, quando carregar seus bancos de dados antigos, ele considere que eles sejam codificados em latin1. Para fazer isso, edite o arquivo my.cnf. Encontre todas as linhas que dizem “default-character-set = utf8” e altere todas elas para dizer “default-character-set = latin1”.

Inicie o mysqld e ignore-o:

mysqld_safe - skip-grant-tables e

Agora, execute "mysql_upgrade". Quando terminar, faça um SELECT na tabela mysql.user. Você deve ver que os nomes de usuário e as senhas codificadas não foram truncados ao meio e substituídos por gobbledeguk.

Mate e reinicie o servidor mysql. Você deve ser capaz de efetuar login, o que significa que a tabela de usuários do mysql é, na verdade, incorrupta. Você verá que todas as outras mesas também estão bem. Uma coisa que você pode notar é que o script mysql_upgrade atualizará os bancos de dados mysql para usar o utf8. Todos os seus outros bancos de dados ainda estão no latin1, portanto, você precisará convertê-los em utf8 (se desejar) usando as instruções acima. Além disso, se você não precisar de suporte legado para aplicativos mais antigos, provavelmente deverá voltar para o arquivo my.cnf e alterar o conjunto de caracteres padrão de volta para utf8 para tudo.

Seus pensamentos A partir deste ponto em diante, todos devem estar usando o utf8 em todas as direções, mas parece que o salto é mais doloroso do que deveria. Se você conhece algum bom truque e dicas de codificação de caracteres do MySQL, ajude seu colega hacker. Compartilhe-os nos comentários!

Ação

Deixar Um Comentário