Se você está como estive tempos atrás: irado, revolto, sem esclarecimento de como as coisas funcionam em um excelente (talvez o melhor) SGDB – Postgres e está sofrendo com os males:

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@srv:~] # su – postgres

[postgres@srv:~] $ 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@srv:~] $ 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

Informações complementares:

http://www.forumdebian.com.br/topico-1583-15.html&sid=64f758c828b395f96e7ae61b4d55897a

http://under-linux.org/7954-configurando-locale-iso-8859-1-no-kubunt-710-gutsy-gibbon.htmlE:

11 comentários em “Corrigindo Maldito encoding do Postgres para poder usar banco de dados latin1 ou outro e mudar o encoding do Sistema operacional Ubuntu ou Debian

  1. isso ai vai me ajudar muito..valeu continua contribuindo…so nao xinga tanto o coitado do linux ou as dificuldades q o soft livre traz..é assim mesmo…muito servico, pouco reconhecimento e remuneracao…mas muita vontade de tornar o mundo mais livre…rsrs

  2. Olá, segui seu tutorial é ocorreu tudo certo até o momento que vou logar no banco de dados. Configurei os arquivos postgres.conf e também pg_hba.conf para obter acesso de outras máquinas da minha rede, mas o que acontece é que a senha para o usuário pglinux é recusada. Já tentei alterar a ROLE, logar com o posgres, mas nada. Você pode me ajudar?

  3. Olá segui seu tutorial e também deu tudo certo tal como o companheiro Thiago. Só que não consigo também logar no banco de dados criado com a porta criada 5433 mas somente com a 5432. Na 5433 deveria estar o banco com codificação ISO latin 1 mas não ocorre o login… Gostaria da sua ajuda…..Obrigado!!!

  4. Littleoak estou a dias quebrando a Kbça sobre como fazer funcionar o postgres v8.4 com o win na codificação adequada, esta saindo tudo sem acentos, já tentei criar um banco com win1252 veja o exemplo :
    CREATE DABASE bdteste encoding ‘win1252’ template0;
    CREATE TABLE Aluno (mat int primary key, nome varchar(30));

    INSERT INTO Aluno VALUES (1, ‘Fuláno’);
    INSERT INTO Aluno VALUES (2, ‘Çiclàno’);
    INSERT INTO Aluno VALUES (3, ‘Béltrano’);

    porém no final não adiante, ao imprimir isso no com PHP sai tudo zuado

    alguém conhece uma coisa parecida.

  5. Talvez seja porque eu utilizo o Postgres 9.0, mas tudo começou a dar errado quando criei o novo cluster, felizmente consegui me virar por aqui e de quebra aprendi muita coisa, mas no geral valeu você me ajudou bastante.

    Vou postar o que eu fiz para aqueles que tiverem eventualmente o mesmo problema:

    Problema, ao criar o usuário o terminal retorna:

    createuser: não pôde conectar ao banco de dados postgres: não pôde conectar ao servidor: Não é um diretório
    O servidor está executando localmente e aceitando
    conexões no soquete de domínio Unix “/var/run/postgresql/9.0-Topicluster.pid/.s.PGSQL.5432”?

    Solução:

    1-

    O Postgres está tentando criar o usuario ainda no antigo cluster, utilizando a velha porta, você pode contornar isso fazendo:

    $ createuser -P -p 5433

    Assim ele deve criar o usuario normalmente. Mas note que você terá que espeficicar a porta 5433 para case todo comando do postgres, até mesmo o psql teria que vir acompanhado de um -p 5433, o que seria um pé no saco né? (Se você usa Webmin como eu, teria que configura-lo para conectar na nova porta, e procurar o novo arquivo de configuração)

    Procurei, mas não consegui achar um metodo de alterar a porta “default”, minha solução foi a seguinte alternativa foi a seguinte:

    2-

    Digite no terminal:

    $ pg_lsclusters

    Ele vai retornar informação sobre todos os clusters disponíveis em sua maquina, aproveite para chegar o nome e a versão de cada um deles.

    Vamos EXCLUIR todos os clusters não utilizados, o que incluiu o velho com a encoding errada, e o novo cluster com a porta indesejada, para isso digite. (ATENÇÃO: isso vai apagar todos os dados, então se você tem algo importante faça backup)

    $ pg_dropcluster –stop

    No meu caso por exemplo, que utilizo a versão 9.0, e o cluster padrão chama main rodei o comando:

    $ pg_dropcluster –stop 9.0 main

    Note que a opção –stop só se faz necessário se o cluster estiver sendo utilizado.

    Agora podemos criar o novo clusters, com a porta padrão:

    $ pg_createcluster -e LATIN1 -p 5432 -d

    Eu criei um cluster no mesmo local, nome e versão que se utiliza normalmente aqui no Ubuntu 10.04 com um Postgres 9.0, mas porfavor note que pode ser difrente em sua maquina, minha linha de comando ficou assim:

    $ pg_createcluster -e LATIN1 -p 5432 -d /var/lib/postgresql/9.0/main 9.0 main

    Agora ta tudo lindo o cluster foi criado no enconding correto e pode ser utilizado facilmente.

    PS: Eu realizar todos esses comandos logado com o usuario “postgres”, acho que se pode fazer isso com qualquer usuário, mas na duvida….

  6. Pessoal tive muita duvida tambem quanto a isso, mas descobri que para usar o latin1 dar o initdp com locale=C , desde modo:

    ./initdb –locale=C -E=LATIN1 -D /usr/local/pgsql/data

    ou entao assim

    ./initdb –locale=C -D /usr/local/pgsql/data

    e deixe para definir a codificacao direto no banco:

    ./createdb -E=LATIN1 banco_latin

    VALEU

  7. Cabe uma observação aqui:

    OK… bases já existentes que possivelmente estão em LATIN1 essa dica é ótima e precisa ser implantada antes de fazer um restore e evitar problemas de acentuação.

    Mas , por favor faça a coisa certa, quando for começar a trabalhar em uma base de dados nova:

    UTF-8 não esta default por acaso. É simplesmente o encoding universal (reconhecido mundialmente) e portanto o melhor para se trabalhar.

    Não pense que UTF-8 causa problemas na acentuação, você esta enganado se achar isso. Irá causar sim se vc estiver trabalhando com uma base LATIN1 e quiser usar UTF-8 ou vice-versa. Ai sim estão incompatíveis!

    Se todo o sistema, base e afins, estiver configurado em UTF-8 não existe problemas de acentuação e nunca haverá!

    Usem UTF-8 para sistemas e base de dados novos.

    Eu e todos os outros desenvolvedores agradecem!

Deixe um comentário