Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Consulta com ilike com palavra acentuada.

Bom dia, estou tendo que fazer uma consulta onda ao pesquisar por "ANTÔNIO DA SILVA CORRÊA" usando o ilike '%%' traga tanto o "ANTÔNIO DA SILVA CORRÊA" como "ANTONIO DA SILVA CORREA"

Meu script esta assim: select * from tabela where nome ilike '%ANTÔNIO DA SILVA CORRÊA%' Já tentei assim também: select * from tabela where nome ilike '%ANTÔNIO%DA%SILVA%CORRÊA%'

4 respostas
solução!

Oii Rodrigo, como você está?

O ilike não é case-sensitive, ou seja, para ele "MARIA" é igual "maria". Porém, ele não cobre a respeito de accent insensitive, que se refere a tratar como igual "NÁDIA" e "NADIA". Para que o postgresql possa interpretar esses nomes desconsiderando o acento e os tratando como iguais, devemos utilizar a função unaccent, que é responsável por remover os acentos na comparação. Sendo assim, podemos fazer a consulta da seguinte forma:

select * from nome_da_tabela where unaccent(nome) ilike unaccent('%ANTÔNIO DA SILVA CORRÊA%');

Porém, para que isso funcione, é necessário declarar que queremos utilizar essa função e isso é feito através do seguinte comando:

CREATE EXTENSION unaccent;

Deixo como referência para caso queira saber mais, a documentação da função unaccent, que infelizmente se encontra em inglês, mas utilizando o recurso de tradução do navegador é possível compreender.

Qualquer dúvida fico à disposição.

Abraços e bons estudos!

Boa noite, Nádia. Obrigado pela atenção, mas a função unaccent, ficamos depentente de versão, certo? Consegui solucionar da senguinte forma:

select * from tabela
where to_ascii(nome) ilike to_ascii('%ANTÔNIO DA SILVA CORRÊA%');

Você já tinha usado assim?

Oii Rodrigo, boa noite!

Isso, ficamos dependente de versão. A função unaccent funciona a partir da versão 9.0 do PostgreSQL. A to_ascii é uma alternativa, mas ela não funciona bem em casos onde a codificação do banco esteja em UTF-8 (uma das codificações mais utilizadas hoje em dia), como mostra nos links abaixo e até mesmo na documentação da ferramenta, onde diz que: "A função to_ascii permite apenas a conversão das codificações LATIN1, LATIN2, LATIN9 e WIN1250.":

Como o meu banco de dados está com a codificação em UTF-8, o seu exemplo com to_ascii nao funciona, apresenta o erro abaixo, pois essa função não suporta essa codificação:

Imagem que mostra o erro sendo gerado no postgresql, dizendo que a conversão não suporta o tipo de codificação UTF-8

Para verificar em qual codificação de caracteres o seu banco está, basta utilizar a função

SHOW SERVER_ENCODING;

Para alterar, podemos utilizar o comando SET CLIENT_ENCODING, que irá alterar a codificação da sessão:

SET CLIENT_ENCODING = 'UTF8';

Qualquer dúvida fique a vontade.

Grande abraço!

Bom dia, Nádia! Obrigado pelo rertono. Quando rodei o comando "SHOW SERVER_ENCODING;" tive o retono que nosso "codificação 'LATIN1'", então por isso funcionou de boa.

Abraços.