PostgreSQL: migrando de LATIN1 pra UTF-8

Pra padronizar meus sistemas, resolvi migrar as bases de LATIN1 pra UTF8. Sei que alguns não vão concordar com minha escolha mas enfim. Segue os passos que eu fiz em um servidor RedHat5 (testei com Debian e funcionou também) com a versão 8.1 do PostgreSQL. Fiz com uma base de em torno de 800Mb.
Recomendo que teste em um ambiente separado antes de aplicar na produção. Use por conta e risco.

Primeiro pare todos os serviços que utilizam o banco (ex. stop no apache, tomcat, jboss) para ninguém (usuários) alterar o banco durante o processo.
Nos comandos abaixo, substitua:
usuario_banco = usuário dono do banco, com permissões de apagar e criar bancos
meu_banco = o banco que vc quer fazer a migração

fazer um backup em texto plano

/usr/bin/pg_dump -i -h localhost -U usuario_banco -F p -D -v -f bancoL.sql meu_banco

aqui está o segredo. Use o software iconv para conversão

iconv -f iso-8859-1 -t utf-8 bancoL.sql > bancoU.sql

abra o arquivo bancoL.sql (de preferencia use o vim pra editar)
e no inicio aí pela linha 7, onde tem “SET client_encoding = ‘LATIN1′;” troque LATIN1 por UTF8

Com banco fazer:

faça um backup é claro
pg_dump -U usuario_banco -i -F c -b -f banco.backup meu_banco

agora apague o banco inteiro
dropdb -h localhost -U usuario_banco meu_banco

crie-o com UTF8
createdb -h localhost -E UTF8 -U usuario_banco meu_banco

e agora restaure o banco “uteéfeoitoado” :)
psql -h localhost -U usuario_banco -d meu_banco < bancoU.sql

caso use em seus SQL a função TO_ASCII, com UTF-8 ela não irã funcionar. Veja aqui a alternativa em um post passado que eu fiz.

3 Respostas para “PostgreSQL: migrando de LATIN1 pra UTF-8”

  1. Bruno diz:

    Eu estava com esse problema por causa do wordpress, e resolvi a conversão no MySQL usando um arquivo .php que gera um código SQL para ser executado no cliente (PHPMyAdmin).

    Se interessar:
    http://uninuni.com/convertendo-o-banco-de-dados-do-wordpress-de-latin1-para-utf8/

  2. Fábio Arezi diz:

    é PostgreSQL :)
    mysql != postgresql

  3. Bruno diz:

    Cara parabens pelo post! ;)


Deixe uma resposta