Usuário com melhor resposta
Pesquisa SQL com e sem caracteres especiais (acento, tio... )

Pergunta
-
Bom dia.
Estou desenvolvendo uma aplicação que tem uma busca no banco, porém meu problema é o resultado.
Por exemplo: no banco, tenho um nome cadastrado como "João" (com tio no a).
O problema é: se o usuário digitar no campo de pesquisa "João", a pesquisa traz os resultados. Porém, se ele digitar "Joao" (sem tio), não traz nada.
O que eu gostaria de fazer é que tanto se o usuário digitar "João" ou "Joao", trazer todos os resultados.
Existe algum tratamento pra isso no próprio SQL ou teria que fazer isto no C#? E se for só no C#, como fazer isso?
Respostas
-
Bom dia Drops22,
Qual é o colllation da sua base? Você consegue ver isso clicando com o botão direito na sua base, "Propriedades".
Se você colocar um Collation que não seja accent sensitive, você consegue obter resultados tanto com "João" quanto com "Joao"[]'s
Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 15 de março de 2012 19:44
- Marcado como Resposta Andre L. Lopes segunda-feira, 26 de março de 2012 15:57
Todas as Respostas
-
Bom dia Drops22,
Qual é o colllation da sua base? Você consegue ver isso clicando com o botão direito na sua base, "Propriedades".
Se você colocar um Collation que não seja accent sensitive, você consegue obter resultados tanto com "João" quanto com "Joao"[]'s
Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 15 de março de 2012 19:44
- Marcado como Resposta Andre L. Lopes segunda-feira, 26 de março de 2012 15:57
-
Drops22, bom dia.
Vc pode utilizar técnicas de data quality em sua aplicação e para isto eu sugiro o comando SOUNDEX.
declare @var0 varchar(255),@var1 varchar(255) set @var0 = 'João' set @var1 = 'joao' select SOUNDEX(@var0), SOUNDEX(@var1)
O soundex gera uma chave fonética, baseado em algorítimos de aproximação.
Para coisas simples ele funciona, mas não recomendo utilizar o soundex em string´s complexas. Aí já sugiro procurar no mercado um algorítimo de match-coding mais avançado. Comparações como "Kubicheque" e "kubitschek" o soundez já não consegue dizer que foneticamente são iguais.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 15 de março de 2012 19:44
-
Eduardo,
Vale ressaltar que a função Soundex esta relacionada diretamente a linguagem do usuário que esta fazendo uso dela como também a Linguagem do Banco de dados, por isso, temos estas situações que não é possível diferenciar uma palavra, script ou até mesmo script complexa.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
-
Bom tarde André,
O problema que você está tendo está relacionado ao Collation do SQL-Server. Este controla a forma que o SQL-Server vai tratar os caracteres especiais, como letras maiúscula e minúsculas, acentos e sem acentos.
Quando instalamos o SQL-Server a configuração DEFAULT é: Collation=Latin1_General_CI_AS, isso quer dizer o seguinte:
- CI: Case Insensitive- O SQL-Server não vai diferenciar Minúsculo de Maiúsculo. EX: ‘ITALIA’ e ‘italia’ vai ser a mesma coisa
- AS: Accent Sensitive – O SQL-Server vai diferenciar os caracteres quem estão sem o acento e com acento. EX: ‘São Paulo’ e ‘São paulo’, para o SQL-Server são resultados diferentes.
O seu Caso é este do AS: Accent Sensitive
Podemos especificar a configuração do Collationem nível de banco de Dados, Tabelas e Colunas.
- Use a Storad Procedure SP_HELPDB ou SP_ HELPSORT para verificar a configuração do Collationem nível de Banco de Dados.
- Use a query abaixo para verificar a configuração do Collation em nível de coluna.
SELECT
object_id,
name,
collation_name
FROM
sys.columns
WHERE
collation_name IS NOT NULLSolução rápida:
Quando há diferença entre as collations, para que o conflito não se manifeste é necessário igualar as collations. Se as collations forem iguais, então o conflito não ocorrerá. Uma das formas de fazer isso é através de pequenas modificações nas consultas.
Por exemplo :
Se sua tabela estiver desta forma: Vai apresentar erro se você tentar concatenar essas duas colunas ou fazer INNER JOIN com outras tabelas.
CREATE TABLE Person.Contact
(
FirstName VARCHAR(100)COLLATE Latin1_General_CI_AS,
LastName,VARCHAR(100)COLLATELatin1_General_CI_AI
)
Mas você pode fazer uma conversão explicitamente no momento do SELECT
select
FirstName,
LastName,CAST(FirstName,ASVARCHAR(100))COLLATELatin1_General_CI_AI +''+LastName
from
Person.Contact
Nesta conversão eu estou igulando as a coluna FirstName e deixando igual a o segundo, assim podei efetuar a consulta normalmente.
Solução Definitiva:
Trocar as collationsutilizadas para uma única collation. Assim não haverá mais problemas em combinar colunas textuais. Essa parece ser uma solução adequada, mas alguns pontos merecem atenção antes de adotá-la.
A solução é recriar essas tabelas especificando Collationiguais.
Qualquer dúvida estou a disposição.
Keny Maciel da Silva
DBA SQL-Server
MCTS SQL Server 2008 Implementation and Maintenance
Email: kenymaciel@gmail.com- Sugerido como Resposta Augustop segunda-feira, 12 de novembro de 2012 07:05