none
Pesquisa SQL com e sem caracteres especiais (acento, tio... ) RRS feed

  • 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?

    quinta-feira, 15 de março de 2012 11:28

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 */

    quinta-feira, 15 de março de 2012 12:54

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 */

    quinta-feira, 15 de março de 2012 12:54
  • 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

    quinta-feira, 15 de março de 2012 13:42
  • 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]

    quinta-feira, 15 de março de 2012 19:45
  • 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 NULL  

    Soluçã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
    sexta-feira, 16 de março de 2012 19:23