É muito comum vermos em grande sites de e-commerce, buscas e relacionamentos, entre outros, que mesmo digitando uma palavra, sem sua acentuação correta, ou até mesmo com acento colocado errado, encontramos a informação desejada. Pois bem, veremos como isso é possível utilizando um banco de dados Oracle.

Para a consulta funcionar, devemos alterar os parâmetros nls_comp e nls_sort.

O parâmetro nls_comp determina qual método de comparação será considerado na consulta. Após a instalação do banco de dados seu valor inicial é "binary".

  • Binary: todo SQL executado e baseado no método binário, exatamente da forma que está escrita a informação.
  • Linguistic: todo SQL executado e baseado no Método lingüístico, considerando a busca e a ordenação como a palavra e falada.

O Parâmetro nls_sort define qual combinação lingüística será utilizada. Para instalações em que o idioma escolhido é o Português (nls_language= portuguese), o valor para o padrão lingüístico é o "Binário" (nls_sort = binary).

Por exemplo, utilizando a combinação binária, temos as seguintes opções:

O sufixo _ci indica que será utilizada a combinação binária com Case-Insensitive Sort.

O sufixo _ai indica que será utilizada a combinação binária com Accente Insensitive Sort. Pode haver outros valores para o parâmetro como, por exemplo, xspanish_ia, mas isso já é assunto para outro artigo.

  • Binary: segue exatamente da mesma forma que foi escrita.
  • Binary_ci: o algoritmo compara exatamente como a palavra foi escrita, desconsiderando as letras maiúsculas e minúsculas. (Case-Insensitive Sort).
  • Binary_ai: o algoritmo compara as palavras ignora a acentuação e os maiúsculos e minúsculos. (Accent Insensitive Sort).

Por exemplo:

A letra "a" pode ser comparada com as letras "ã,á,ä,à,â,ä"; a letra "é" pode ser comparada com as letras "e,è,ê,ë", dentre outras acentuações.

Estes parâmetros podem ser definidos para todo o banco de dados ou somente para uma seção. O ideal é utilizar em locais apenas onde há real necessidade, pois se utilizado para todo ambiente, pode degradar a performance do banco de dados.

Vamos praticar.

Em nosso cenário vamos considerar um cadastro de produto, que será utilizando em um E-Commerce.

Logo, se um cliente digitar o nome do produto sem a acentuação necessária ou com a acentuação errada, o sistema deve ser capaz de identificar e retornar o produto que ele procura.

Vamos criar um simples cadastro de produtos:


create table tb_produto(nome varchar2(40), valor number(16,4));
insert into tb_produto(nome,valor) values ('Fogão 4 bocas',300);
insert into tb_produto(nome,valor) values ('Fogao 6 bocas',600);
insert into tb_produto(nome,valor) values ('Lava-louças',800);
insert into tb_produto(nome,valor) values ('Jogo de Faca',120);
Primeira situação:

Digamos que o cliente digitou o nome do produto com a acentuação correta, mas toda a palavra em minúscula, e que estamos utilizando o método binário para consulta. Logo, ele não encontrará o produto que procura!

SQL> select * from tb_produto where nome = 'lava-louças';

NOME                                                  VALOR
---------------------------------------- ------------------

Vamos mudar os nossos parâmetros para não diferenciar maiúsculos e minúsculos.

SQL> alter session set nls_comp=linguistic;

Session
altered

SQL> alter session set nls_sort=binary_ai;

Session
altered

Veja que agora o Oracle encontra o produto solicitado.

SQL>  select * from tb_produto where nome = 'lava-louças';

NOME                                                  VALOR
---------------------------------------- ------------------
Lava-louças                                        800,0000
Segunda situação:

Vamos simular que o usuário digitou o nome do produto sem a acentuação devida.

SQL> select * from tb_produto where nome = 'lava-louças';

NOME                                                  VALOR
---------------------------------------- ------------------

Agora vamos mudar o método de comparação para lingüístico, na seção que estamos trabalhando.

SQL> alter session set nls_comp=linguistic;

Session altered

SQL> alter session set nls_sort=binary_ai;

Session altered

Veja que o Oracle interpretou a letra "c" sendo a mesma que "ç". Ou seja, ignorou o acento.

SQL> select * from tb_produto where nome = 'lava-loucas';

NOME                                                  VALOR
---------------------------------------- ------------------
Lava-louças                                        800,0000

Veja que, mesmo se forçarmos um acento indevido, poderemos saber o preço da lava-louça.

SQL> select * from tb_produto where nome = 'lava-loucás';

NOME                                                  VALOR
---------------------------------------- ------------------
Lava-louças                                        800,0000
 
FONTE: http://imasters.uol.com.br/artigo/15814/oracle/ignorando_acentos_no_oracle/
Technorati Marcas: ,