Hoje vamos falar um pouco sobre usabilidade utilizando o Oracle. É 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:
<br />create table tb_produto(nome varchar2(40), valor number(16,4));<br />insert into tb_produto(nome,valor) values ('Fogão 4 bocas',300);<br />insert into tb_produto(nome,valor) values ('Fogao 6 bocas',600);<br />insert into tb_produto(nome,valor) values ('Lava-louças',800);<br />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';<br /><br />NOME VALOR<br />---------------------------------------- ------------------Vamos
mudar os nossos parâmetros para não diferenciar maiúsculos e
minúsculos.
SQL> alter session set nls_comp=linguistic;<br /><br />Session <br />altered<br /><br />SQL> alter session set nls_sort=binary_ai;<br /><br />Session<br /> alteredVeja
que agora o Oracle encontra o produto solicitado.
SQL> select * from tb_produto where nome = 'lava-louças';<br /><br />NOME VALOR<br />---------------------------------------- ------------------<br />Lava-louças 800,0000Segunda
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';<br /><br />NOME VALOR<br />---------------------------------------- ------------------ 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;<br /><br />Session altered<br /><br />SQL> alter session set nls_sort=binary_ai;<br /><br />Session alteredVeja
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';<br /><br />NOME VALOR<br />---------------------------------------- ------------------<br />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';<br /><br />NOME VALOR<br />---------------------------------------- ------------------<br />Lava-louças 800,0000Assim chegamos ao final
de mais um artigo, espero que tenham gostado!







