Olá,

Em 7 de outubro de 2011 11:21, Marcelo Silva (IG) <marc...@ig.com.br>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: marc...@ig.com.br
> cel.: (11) 9693-4251
>
> _______________________________________________
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>

Abraços
-- 
JotaComm
http://jotacomm.wordpress.com
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a