Encoding do Postgres (latin1) e encoding do SO (Debian/Ubuntu)

How to para modificar encoding do sistema operacional Linux (Debian, Ubuntu ou derivados) e do banco de dados Postgres (charset) para latin1.

[ Hits: 44.239 ]

Por: Little Oak em 06/01/2009 | Blog: http://www.littleoak.com.br


Introdução



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 Linux 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.

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 Postgres que não aceita nem a pau um encoding diferente (padrão dessa tosquisse sempre é UTF8).

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 as variáveis 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


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 super-user para administrar o Postgres:

# su - postgres
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?

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:

Fonte deste post: Corrigindo Maldito encoding do Postgres para poder usar banco de dados latin1 ou outro e mudar o encoding do Sistema operacional Ubuntu ou Debian

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Diagrama Entidade-Relacionamento com Dia e tedia2sql para o PostgreSQL

Como instalar Postgres 8 no Linux em 10 passos rápidos

Checklist de performance do PostgreSQL 8.0

Replicação de dados síncrona com Postgres

PostgreSQL no Slackware - Importando e Exportando arquivos TXT e CSV

  
Comentários
[1] Comentário enviado por removido em 07/01/2009 - 01:17h

Parabéns meu querido ;)

[2] Comentário enviado por wfox em 08/01/2009 - 17:37h

Apenas um ponto:
UTF-8 eh um superset de charset e inclui os caracteres do iso-8859-1.

Muito trabalho foi feito e vem sendo feito pela equipe das principais distribuicoes linux no sentido de padronizar os sistemas em charset UTF-8. A Debian como uma das principais distro busca adotar este padrao.

A substituicao de qualquer charset pela codificacao UTF-8 eh um objetivo geral para melhor internacionalizacao dos sistemas e aplicativos e na contra-mao desta dificil evolucao vem este artigo combatendo o UTF-8 como se ele nao service ao pt_BR. Acredito que seja um equivoco e sugiro que busque maiores informacoes sobre o relato.
No mais, parabens pelo artigo que pode ser utilizado ao inverso. Quer dizer. Deve ser utilizado justamente ao inverso, no lugar de latin1 ou iso8859-1, utilizar UTF-8.

=)

[3] Comentário enviado por little_oak em 08/01/2009 - 18:37h

Pois é irmão, sem dúvidas estou um pouco distante de um conhecimento sólido em postgres, mas foi isso que salvou 500 / mês a mais no meu antigo salário...

Acredito que seja um equivoco e sugiro que busque maiores informacoes sobre o relato.

Usa isto, e se não funcionar validamos como equívoco... ok? Não por sua afirmativa, mas pela necessidade que o artigo cobre.


A questão nÃo é que MATO A PAU, por que desenvolvo sobre UTF8, o lance é que tem gente que obriga você a utilizar latin1, fazer o que?

Abraços e bons estudos.

[4] Comentário enviado por removido em 03/06/2009 - 14:15h

Artigo muito bom.

Mas tive um probleminha aqui no meu debian 5, se poderia me ajudar a resolve-¯lo fico agradecido.

É assim:

Tava tudo indo certinho até o ponto que o artigo se refere a 3 arquivos no diretório /var/lib/locales/supported.d só que eu não tenho esses 2 ultimos diretórios então dei "uma de malamdro " e usei um mkdir -p /var/lib/locales/supported.d e criei o arquivo local para jogar dentro desse esse conteúdo como descrito no artigo.

pt_BR.ISO-8859-1 ISO-8859-1
en_US.ISO-8859-1 ISO-8859-1

no mais os passos seguiram corretamente ( eu acredito) só que quando cheguei no ponto do comando

locale -a

ele me retorna esse resultado:

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
POSIX
pt_BR.utf8


E aí nada dá certo depois.

E agora, como poderia resolver isso? Poderia me dar uma luz?

[5] Comentário enviado por Luiz.trindade em 26/06/2009 - 15:17h

Prezado Little Oak,

Faltou você informar que se faz necessário incluir um path no environment:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

Sem essa linha não funcionava no Debian 4.0 Ecth.

Quero acreditar que foi um esquecimento seu ou falta de conhecimento mesmo.

Ahhhhh...

Não esqueçam de reiniciar depois do ultimo passo viu?!?

Vida Longa e Próspera à todos!

[6] Comentário enviado por little_oak em 26/06/2009 - 15:54h

DEUS DOS CÉUS, alguém me dê uma lógica para o comentário maravilhoso do senhor LUIZ TRINDADE, ou melhor, meu concorrente?

Abraços a todos e espero bons estudos a todos!

[7] Comentário enviado por mfeltrin em 21/10/2009 - 15:12h

Bom eu tive problemas com isso... fiz os comandos tomando todos os devidos cuidados para nao faltar nada, pois bem não funcionou, qdo eu executo o comando locale -a aparece da seguinte forma:

C
en_US.iso88591
POSIX
pt_BR
pt_BR.iso88591
pt_BR.utf8

resolvi refazer td pra ter mais ctz e mesmo assim continua igual apenas acrescentando mais algumas linhas:

pt_BRISO-8859-1
pt_BRISO-8859-1.iso88591

se alguem souber responde ai como resolver

abraço

[8] Comentário enviado por SMarcell em 06/11/2009 - 14:53h

Complementando...

# Criar banco com codificação 'latin1' em cluster codificado como 'utf-8'

CREATE DATABASE nome_do_banco ENCODING 'ISO8859-1' LC_CTYPE 'pt_BR.ISO8859-1' TEMPLATE template0;

[9] Comentário enviado por danilolamier em 19/11/2009 - 06:46h

Pessoal, eu estou com o seguinte problema, está dando o seguinte erro quando estou mudando para LATIN1:


Erro:
A codificação que você escolheu (LATIN1) e a codificação que a configuração regional selecionada utiliza (UTF8) não tem correspondência. Isto pode conduzir a um comportamento inesperado em funções de processamento de cadeia de caracteres. Execute novamente o initdb e não especifique uma codificação explicitamente ou escolha uma outra combinação.


Como faço para resolver ?

Obrigado

[10] Comentário enviado por bjverde em 20/01/2010 - 15:08h

little_oak,

concordo com a visão do wfox é sempre melhor UTF8 do que Latin1. Porem a sua dica é valida para situações que não é possível exportar a base para UTF8 como no link abaixo.
http://www.vivaolinux.com.br/dica/Migracao-de-encoding-no-PostgreSQL-8.3

[11] Comentário enviado por souzace em 18/02/2010 - 17:53h

Senhores, só vejo necessidade de adicionar uma váriavel "client encoding = UTF8", isso ja resolve o problema!

[12] Comentário enviado por betolima em 07/06/2010 - 10:52h

Pessoal se alguém puder me dar uma força: Eu tenho uma base antiga em latin1 e preciso passar os dados dela para uma outra base com a mesma estrutura mas essa com sql_ascii.
Tentei fazer como i little_oak disse mas não deu certo....
Será que tem alguma forma de apenas converter a minha base antiga para sql_ascii ???
Eu só preciso importar estes dados e mais nada...
No futuro vou usar sempre utf8...
obrigado

[13] Comentário enviado por jeferbd em 07/07/2010 - 17:09h

duvida...

OK..
tutorial seguido e funcionaou tudo...

porem onde encontro o cluster criado com o latin1?

sobre os comentarios, concordo tb que melhor seria UTF8, porém algumas coisas.. como a NFe, nos forçam a utiliza LATIN1

[14] Comentário enviado por aurianalves em 17/08/2010 - 17:42h


POR FAVOR, ALGUEM PODE ME AJUDAR???? HELP.. HELP...

Efetuei todos os procedimentos orientados, deu tudo certo ate o ponto de criar o cluster, tive o seguinte problema:

# sudo pg_createcluster -e LATIN1 8.3 novadata -d /usr/local/pgsql/data

Creating new cluster (configuration: /etc/postgresql/8.3/novadata, data: /usr/local/pgsql/data)...
could not change directory to "/root"
initdb: encoding mismatch
The encoding you selected (LATIN1) and the encoding that the
selected locale uses (UTF8) do not match. This would lead to
misbehavior in various character string processing functions.
Rerun initdb and either do not specify an encoding explicitly,
or choose a matching combination.
Error: initdb failed


[15] Comentário enviado por mineirobr em 03/01/2012 - 20:28h

para resolver seu problema no debian, digite o comando:

apt-get install locales-all

[16] Comentário enviado por gelcimarf em 10/01/2014 - 16:20h

Boa Tarde, sou novo no ramo do banco de dados postgres e fiquei confuso na opção que diz

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


quero saber onde fica localizado o caminho para o banco de dados, ou se posso colocar em qualquer local?

[17] Comentário enviado por bacteria_ em 05/03/2015 - 11:44h

Fiz de outro jeito bem mais simples e funcionou.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts