Encode LATIN1 no PostgreSQL
Dica publicada em Linux / Introdução
Encode LATIN1 no PostgreSQL
Neste meu primeiro tutorial, vou ensinar uma maneira rápida e prática de adicionar o suporte ao LATIN1 no PostgreSQL.
Depois de inúmeras pesquisas na internet sobre como resolver o problema de encode no Postgres, deparei com infinitos artigos, tutoriais, dicas e afins dizendo que para resolver o problema, deve-se trocar o idioma do sistema operacional. Isso mesmo, trocar o idioma do sistema operacional.
Entendo que se você está no Brasil, deve instalar um sistema em português, mas eu particularmente, prefiro sempre o padrão inglês, porque por mais que você tente usar um sistema em português, uma hora ou hora aparece inúmeras mensagens em inglês, então pra evitar esse detalhe, eu sempre opto por instalar todo o sistema em inglês.
Neste tutorial, todos os comandos executados foram a partir do Ubuntu 14.04 Server, provavelmente deve funcionar em versões anteriores. Mão na massa.
Como já disse, a solução é muito mais simples do que parece.
Primeiro, precisamos adicionar suporte ao encode/idioma/locale desejado e no caso do LATIN1, usaremos "pt_BR.ISO-8859-1" com a seguinte linha de comando:
sudo echo "pt_BR.ISO-8859-1 ISO-8859-1" >> /var/lib/locales/supported.d/local
Agora vamos recompilar os encodes/idiomas/locales para serem suportados pelo sistema operacional:
sudo dpkg-reconfigure locales
Pronto. Seu sistema operacional já tem suporte a LATIN1 ou... ISO-8859-1, logo "pt_BR.ISO-8859-1". Simples assim, porém, partindo do pressuposto que seu banco de dados já esteja rodando enquanto efetuávamos as alterações, precisaremos reiniciá-lo, pois só assim ele carregará o suporte ao encoding.
Para isso, basta executar:
sudo service postgresql restart
Pronto. Seu Postgres já tem suporte a LATIN1. Mas para criar o banco de dados, você precisa informar alguns parâmetros para obter êxito na criação do banco, como:
CREATE DATABASE db_in_latin1 ENCODING 'LATIN1' LC_COLLATE 'pt_BR.ISO-8859-1' LC_CTYPE 'pt_BR.ISO-8859-1' template template0;
Informações gerais do sistema depois das alterações:
sudo su - postgres
psql
postgres=# CREATE DATABASE db_with_LATIN1 ENCODING 'LATIN1' LC_COLLATE 'pt_BR.ISO-8859-1' LC_CTYPE 'pt_BR.ISO-8859-1' template template0;
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
db_with_latin1 | postgres | LATIN1 | pt_BR.ISO-8859-1 | pt_BR.ISO-8859-1 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
postgres=# \q
locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
locale -a
C
C.UTF-8
en_US.utf8
POSIX
pt_BR.iso88591
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.1 LTS
Release: 14.04
Codename: trusty
Depois de inúmeras pesquisas na internet sobre como resolver o problema de encode no Postgres, deparei com infinitos artigos, tutoriais, dicas e afins dizendo que para resolver o problema, deve-se trocar o idioma do sistema operacional. Isso mesmo, trocar o idioma do sistema operacional.
Entendo que se você está no Brasil, deve instalar um sistema em português, mas eu particularmente, prefiro sempre o padrão inglês, porque por mais que você tente usar um sistema em português, uma hora ou hora aparece inúmeras mensagens em inglês, então pra evitar esse detalhe, eu sempre opto por instalar todo o sistema em inglês.
Neste tutorial, todos os comandos executados foram a partir do Ubuntu 14.04 Server, provavelmente deve funcionar em versões anteriores. Mão na massa.
Como já disse, a solução é muito mais simples do que parece.
Primeiro, precisamos adicionar suporte ao encode/idioma/locale desejado e no caso do LATIN1, usaremos "pt_BR.ISO-8859-1" com a seguinte linha de comando:
sudo echo "pt_BR.ISO-8859-1 ISO-8859-1" >> /var/lib/locales/supported.d/local
Agora vamos recompilar os encodes/idiomas/locales para serem suportados pelo sistema operacional:
sudo dpkg-reconfigure locales
Pronto. Seu sistema operacional já tem suporte a LATIN1 ou... ISO-8859-1, logo "pt_BR.ISO-8859-1". Simples assim, porém, partindo do pressuposto que seu banco de dados já esteja rodando enquanto efetuávamos as alterações, precisaremos reiniciá-lo, pois só assim ele carregará o suporte ao encoding.
Para isso, basta executar:
sudo service postgresql restart
Pronto. Seu Postgres já tem suporte a LATIN1. Mas para criar o banco de dados, você precisa informar alguns parâmetros para obter êxito na criação do banco, como:
CREATE DATABASE db_in_latin1 ENCODING 'LATIN1' LC_COLLATE 'pt_BR.ISO-8859-1' LC_CTYPE 'pt_BR.ISO-8859-1' template template0;
Informações gerais do sistema depois das alterações:
sudo su - postgres
psql
postgres=# CREATE DATABASE db_with_LATIN1 ENCODING 'LATIN1' LC_COLLATE 'pt_BR.ISO-8859-1' LC_CTYPE 'pt_BR.ISO-8859-1' template template0;
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
db_with_latin1 | postgres | LATIN1 | pt_BR.ISO-8859-1 | pt_BR.ISO-8859-1 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
postgres=# \q
locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
locale -a
C
C.UTF-8
en_US.utf8
POSIX
pt_BR.iso88591
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.1 LTS
Release: 14.04
Codename: trusty
Não entendo muito de Postgres, mas já usei o comando abaixo em determinada situação e parece ter resolvido, porém, para UTF-8. Talvez lhe seja útil.
Dentro do postgres:
update pg_database set encoding = pg_char_to_encoding('UTF-8');