sexta-feira, outubro 31, 2008

Select ignorando acento

Quando se faz algum sistema que realize uma busca a partir de uma string do usuário, temos que levar em conseideração as letras maiúsculas e minúsculas e a acentuação.
Andei pesquisando e encontrei como fazer nos bancos mais usados. É assim:

Supondo que possuo a tabela 'tabela' com o campo 'campo' com os seguintes valores:
CAMPO
---------
Maca
Maçã
Macaco
Amanhã
Jaca
Maçaneta

Oracle 10g:
alter session set nls_comp=linguistic;
alter session set nls_sort=binary_ai;

Pronto. O Select desta sessão pegará ignorando o acento e ordenando sem considerá-lo.
select campo from tabela where campo like '%aca%';
ou
select campo from tabela where campo like '%açÃ%';
CAMPO
---------
Jaca
Maca
Maçã
Macaco
Maçaneta


MySQL:
select campo from `tabela`
where `campo` like _utf8 '%aca%' collate utf8_unicode_ci;

ou
select campo from `tabela`
where `campo` like _utf8 '%açÃ%' collate utf8_unicode_ci;

CAMPO
---------
Maca
Maçã
Macaco
Jaca
Maçaneta


PostgreSQL:
select campo from tabela
where lower(to_ascii(campo)) like lower(to_ascii('%açÃ%'));

ou
select campo from tabela
where lower(to_ascii(campo)) like lower(to_ascii('%aca%'));

CAMPO
---------
Maca
Maçã
Macaco
Jaca
Maçaneta


Para ordenar basta usar a cláusula 'order by'; no Oracle foi pré-estabelecida a maneira para a sessão.

3 comentários:

Anônimo disse...

Valeu mesmo...

Anônimo disse...

valeu brother me quebrou um galhaço aqui

jeremias pereira disse...

Tenho um banco em mySQL aqui e não esta funcionando essa função, pode ser alguma configuração do banco de dados? O banco está em codificação
utf8_general_ci,já mudei para outras codificações e não obtive sucesso.

Select * from usuarios where nome like _utf8 '%josé%' COLLATE utf8_unicode_ci



Obrigado!