• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Rui Carlos

Base de dados Latin1 com dados em UTF8: como corrigir o encoding?

9 posts in this topic

Tenho o seguinte problema: tenho bases de dados que foram criadas com o encoding default do MySQL (Latin1), mas em que a aplicação que usava a BD trabalhava com UTF8. Ou seja, foram introduzidos dados codificados em UTF8 na BD em Latin1.

Isto não é muito problemático, e a aplicação até não costuma dar problemas. Só que agora estou a fazer a migração das aplicações/BDs, e está a ser uma valente dor de cabeça... É que não consigo acertar com os encodings... Eu lembro-me que já consegui fazer uma migração bem sucedida apesar deste problema, ao fim de tentar dezenas de métodos diferentes. Mas agora não encontro forma de o fazer.

Basicamente precisava de migrar a BD, de modo a que a aplicação fique a funcionar. Como extra, também era porreiro conseguir configurar o encoding correctamente, mas dava-me por contente se conseguisse fazer a migração sem ficar com problemas de encoding na aplicação.

0

Share this post


Link to post
Share on other sites

Parece que à n-ésima tentativa lá funcionou alguma coisa... Usei os seguintes comandos:

mysqldump  -u <user> -p --default-character-set=latin1 --skip-set-charset <bd1> > dump.sql
mysql -u <user> -p --default-character-set utf8 <bd2> < dump.sql

Isto apenas me permitiu importar os dados na nova BD de modo a que a aplicação funcione. No entanto, continuo com a BD configurada em Latin1 com dados em UTF8.

Pelo que estive a ver, para corrigir o encoding, terei que ir coluna a coluna, alterar primeiro para o tipo BLOB e depois voltar a alterar para texto com o encoding correcto, o que não é lá muito prático (visto que numa das BDs teria centenas de colunas para corrigir)...

0

Share this post


Link to post
Share on other sites

Estás a fazer a migração através de exportação para um ficheiro e, depois, importação, estás a fazer através de uma aplicação (por exemplo, feita em php, como o phpmyadmin ou qq outra aplicação que tenhas feito) ou estás a fazer usando comunicação directa entre as duas DB?

0

Share this post


Link to post
Share on other sites

Para exportar as BDs antigas posso usar phpMyAdmin ou mysqldump.

Para importar estou a usar o MySQL directamente no terminal.

0

Share this post


Link to post
Share on other sites

O que eu tentava fazer era usar uma aplicação intermédia, por exemplo, PHP e fazer 1 ligação à 1 DB usando o default e uma ligação à 2ª usando o modo utf8.

Senão, podes tentar obter o dump para ficheiro, depois converter o conteúdo do ficheiro para utf-8 e executar o SQL no outro servidor. Acho que dá para fazer isso a partir da terminal.

Edited by brunoais
0

Share this post


Link to post
Share on other sites

Usar o PHP não me parece muito prático, visto que tenho várias BDs, com dezenas de tabelas.

Já consegui a parte de criar um dump correcto, em UTF8 (ver segundo post). Agora as tabelas ainda são criadas novamente em Latin1 (com dados UTF8). Possivelmente se editasse o dump removendo as definições do encoding nos CREATE TABLE resolvia o problema, mas ainda não arrisquei fazer isto, pois seria complicado validar o resultado. O ideal era mesmo que o MySQL me deixasse mudar o encoding das tabelas sem mexer na informação...

0

Share this post


Link to post
Share on other sites

Estou no ponto em que estava no segundo post.

A migração está feita, e está a funcionar, mas continuo com a BD com a meta-informação sobre encodings errada. Penso que o único problema que isso pode trazer é nas pesquisas de texto, o que não é grave, daí ter optado por não arriscar mexer nos CREATE TABLE do dump (que devia permitir resolver o problema da meta-informação).

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now