Com muito custo consegui encontrar um caminho para migração de
encondig no PostgreSQL.
Uma vez criado um banco com uma encoding (LATIN1, SQL_ASCII, UTF8), só é possível mudá-lo fazendo um backup e recriando o banco.
Embora a documentação do PostgreSQL informe sobre a opção -E no pg_dump, falta um "pulo do gato", que é o que vai ser apresentado neste passo a passo.
1. Se for migração de servidor, altere o arquivo pg_hba.conf (geralmente em
/etc/postgresql/8.x/main/pg_hba.conf) do servidor antigo para incluir a linha:
hostnossl all postgres ipnovoservidor/32 trust
2. Reinicie o PostgreSQL no servidor antigo:
# service postgresql-8.3 restart
3. Faça um "su" para o usuário postgres no servidor novo:
# su postgres
4. Gere o backup no servidor novo (se for o mesmo servidor, a opção h é desnecessária) . UTF8 é um exemplo de encoding, mas de qualquer forma é recomendado como padrão):
$ pg_dump -h hostanti -C -E UTF8 -U postgres bancodedados > bancodedados.sql
5. O pulo do gato: a opção -E do pg_dump gera o ARQUIVO no encoding desejado. Mas a opção -C (que copia a estrutura original), copia fielmente, a ponto de gerar a linha:
CREATE DATABASE foh WITH TEMPLATE = template0 ENCODING = 'LATIN1';
com o encoding original, o que gera erro na importação.
O MACETE É TROCAR O ENCODING PARA O CORRETO:
CREATE DATABASE foh WITH TEMPLATE = template0 ENCODING = 'UTF8';
Obs.: Se o arquivo for grande, o "mcedit" (que uso muito), não dá conta de abrir, mas o "joe" não reclama.
6. Agora é só rodar:
$ psql -f bancodedados.sql