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