Olá,
Em 7 de outubro de 2011 11:21, Marcelo Silva (IG) <[email protected]>escreveu:
> Pessoal, peço desculpas por trazer mais uma vez esse assunto a lista,
> mas vira e mexe temos esse problema com acentos na lingua portuguesa.
>
> Segundo a necessidade da empresa eu preciso gravar os dados exatamentes
> como são, por exemplo Maiusculas e Minusculas nos nomes e afins,
> caracteres especiais e acentos como são na lingua portuguesa mesmo.
>
> Estou trabalhando com banco UTF-8 pois de inicio como sou novo no PG acabei
> criando assim...
> Hoje tenho a base populada e estou tento problemas em pesquisas.
>
> Estava fazendo testes com uma base criada em LATIN1, ao restaurar a minha
> base de UTF8 para LATIN1, ele restaura sem problemas,
> mas na pesquisa ele se comporta como o UTF8, então tenho que usar a função
> “to_ascii” para ele trazer o que quero.
>
> select nome from clientes where (to_ascii(nome) like to_ascii(‘%JOÃO%’))
>
> A base foi criada assim:
>
> CREATE DATABASE teste
> WITH OWNER = postgres
> ENCODING = 'LATIN1'
> TABLESPACE = pg_default
> LC_COLLATE = 'C'
> LC_CTYPE = 'C'
> CONNECTION LIMIT = -1;
>
> Sendo que foi criada em Latin1 ele não deveria ignorar os acentos e
> caracteres especiais e até mesmo Maiuscula e Minuscula?
>
> Será que foi porque eu restaurei UTF8 para LATIN1 ?
>
> Existe uma forma mais simples para se trabalhar com acentos no postgres ou
> o metodo é esse mesmo?
>
O seu problema não está no Encoding do banco e sim, nas regras de
localização.
Se você utilizar LC_COLLATE='pt_BR.UTF-8' (utilizado para ordenação) e
LC_CTYPE='pt_BR.UTF-8' (classificação) você não terá este tipo de problema.
Veja um pequeno exemplo:
initdb -D /tmp/data --locale=C --encoding=LATIN1
postgres=# SHOW lc_ctype;
lc_ctype
----------
C
(1 row)
postgres=# SHOW lc_collate;
lc_collate
------------
C
(1 row)
CREATE TABLE teste(nome VARCHAR);
INSERT INTO teste VALUES ('João');
INSERT INTO teste VALUES ('JOÃO');
INSERT INTO teste VALUES ('JOAO');
INSERT INTO teste VALUES ('Joao');
SELECT * FROM teste WHERE nome ILIKE 'Joã%';
nome
-------
João
(1 row)
Agora veja outro exemplo:
initdb -D /tmp/data --locale=pt_BR.utf8 --encoding=UTF8
postgres=# SHOW lc_collate;
lc_collate
------------
pt_BR.utf8
(1 row)
postgres=# SHOW lc_ctype;
lc_ctype
------------
pt_BR.utf8
(1 row)
CREATE TABLE teste(nome VARCHAR);
INSERT INTO teste VALUES ('João');
INSERT INTO teste VALUES ('JOÃO');
INSERT INTO teste VALUES ('JOAO');
INSERT INTO teste VALUES ('Joao');
SELECT * FROM teste WHERE nome ILIKE 'Joã%';
nome
------
João
JOÃO
(2 rows)
Espero ter sido claro na minha explanação.
>
> obs.: O MySQL5 basta criar em LATIN1 e ele ignora Acentos, Caracteres
> especiais e é CaseInsensitive
>
>
> Marcelo Silva
> --------------------------------------------------
> Desenvolvedor Delphi, PHP
> msn: [email protected]
> cel.: (11) 9693-4251
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
Abraços
--
JotaComm
http://jotacomm.wordpress.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral