Algo simples que desejamos e a trabalheira grandiosa :(. O que queremos? Mudar o encoding default para Latin1 (se bem que o mundo hoje gira em torno de utf8), assim como mudar locales para PT_BR.
1 – Encoding do Sistema Operacional Debian/Ubuntu Ferrados (sim, você brasileiro e a droga do locale te mostrando coisas de americanos, pode uma coisa destas?)
2 – Mudar o Encoding do Postgres.
Vamos ao ataque
Antemão você precisa saber que o seu sistema foi configurado por algum bestão, isto mesmo, o cara instalou o sistema americano sendo brasileiro.
Ter um porstgres que não aceita nem a pau um encoding diferente (padrão dessa tosquisse sempre é UTF8).
Locale do Sistema
Mãos-a-Obra
Todas as configurações e comandos foram executados como usuário root.
Existem vários arquivos que fazem a configuração do locale, precisamos configurar todos eles e depois executar alguns comandos, vamos lá.
Edite o arquivo /etc/environment e altere os campos LANG e LANGUAGE de forma que fiquem iguais ao abaixo, se não existir, acrescente:
LANG="pt_BR"
LANGUAGE="pt_BR:pt:en"
O arquivo /etc/default/locale também deve ser editado e seu conteúdo deve ser:
LANG="pt_BR"
LANGUAGE="pt_BR:pt:en"
Execute o seguinte comando:
# echo "pt_BR pt_BR.ISO-8859-1" >> /etc/locale.alias
Este arquivo grava os aliases para os locales, isso é para facilitar as configurações.
No diretório /var/lib/locales/supported.d alguns arquivos que configuram os locales que serão gerados, por padrão existem três arquivos “en”, “pt” e “local”. Para nosso caso, pode apagar o “en” e o “pt” deixando apenas o “local”.
Feito isso, edite o arquivo local e deixe seu conteúdo como abaixo:
pt_BR.ISO-8859-1 ISO-8859-1
en_US.ISO-8859-1 ISO-8859-1
Muito bem, configuramos os arquivos necessários para a geração dos locales, agora vamos reconfigurar.
Os comandos abaixo fazem o serviço:
# localedef pt_BR -i pt_BR -f ISO-8859-1
# localedef pt_BR.ISO-8859-1 -i pt_BR -f ISO-8859-1
# localedef pt_BR.ISO8859-1 -i pt_BR -f ISO-8859-1
# dpkg-reconfigure locales
# locale-gen --purge
# locale-gen
###### SE HOUVER ERRO USE:
localedef pt_BR -i pt_BR -f UTF-8
localedef pt_BR -i pt_BR -f LATIN1
Acredito que apenas um desses três comandos fariam o serviço, mas como eu executei os três quando estava configurando o sistema não vou tirar algum deles, é melhor executar a mais e funcionar do que executar a menos e não funcionar.
Reinicie o sistema e execute o comando abaixo para termos certeza que está tudo conforme o desejado.
# locale
LANG=pt_BR
LANGUAGE=pt_BR:pt:en
LC_CTYPE="pt_BR"
LC_NUMERIC="pt_BR"
LC_TIME="pt_BR"
LC_COLLATE="pt_BR"
LC_MONETARY="pt_BR"
LC_MESSAGES="pt_BR"
LC_PAPER="pt_BR"
LC_NAME="pt_BR"
LC_ADDRESS="pt_BR"
LC_TELEPHONE="pt_BR"
LC_MEASUREMENT="pt_BR"
LC_IDENTIFICATION="pt_BR"
LC_ALL=
# locale -a
C
en_US.iso88591
POSIX
pt_BR.iso88591
Agora sim, está tudo como deveria estar. Nosso sistema já está usando ISO-8859-1.
(ISO-8859-1é LATIN1)
Corrigindo o Encoding do Postgres
Bem, esta é a hora do quebra-quebra, vamos lá:
1 – Crie uma nova instância (cluster) de gestão do Postgres:
sudo pg_createcluster -e LATIN1 -d /caminho/do/novoSGDB 8.3
cluster-8.3-2
Feito isto, a porta que o postgres vai operar neste novo SGDB será 5433
Criando SuperUser para administrar o Postgres
[root@appunixlabs:~] # su – postgres
[postgres@appunixlabs:~] $ createuser -P
Digite o nome da role a ser adicionada: pglinux
Digite a senha para a nova role:
Digite-a novamente:
A nova role poderá criar um super-usuário? (s/n) s
CREATE ROLE
Quer ver os users?
[postgres@appunixlabs:~] $ psql
postgres=# du
Lista de roles
Nome da role | Super-usuário | Cria role | Cria BD | Conexões | Membro de
————–+—————+———–+———+———–+———–
pglinux | sim | sim | sim | ilimitado |
postgres | sim | sim | sim | ilimitado |
(2 registros)
postgres=# q
Obs: Se estiver usando Debian 4 mude o path para aceitar corretamente todas as mudanças
PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games”
Caso seus locales estejam 100% ajustados antes mesmo deste How To você pode usar outros meios, 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:
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