AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 190969
Accepted
lumo
lumo
Asked: 2017-11-16 02:02:21 +0800 CST2017-11-16 02:02:21 +0800 CST 2017-11-16 02:02:21 +0800 CST

Ignorar acentos na cláusula 'where'

  • 772

Em nosso banco de dados, temos várias entradas com acentos graves, acentos circunflexos ou carons (aka hačeks). Esses acentos são coletivamente também conhecidos como sinais diacríticos .

Agora, nossos usuários desejam encontrar entradas que incluam esses sinais diacríticos quando pesquisam entradas sem. Vou mostrar isso com um exemplo simples:

Em nosso banco de dados temos a entrada (contato com nome)

Millière

...então este nome está correto no país em que a pessoa vive.

Em nosso país não temos caracteres com sinais diacríticos, portanto nosso usuário procura por Milliere. Nenhum resultado aparece, como èobviamente não corresponde e.

Eu não tenho idéia de como isso poderia ser realizado como é, è, êe muitos mais estão disponíveis (e este é apenas um exemplo para carta e...).

(A outra maneira seria muito mais fácil, pois eu poderia simplesmente substituir todas as letras por caron/haček pela básica. Obviamente, nossos usuários querem a versão correta do nome no banco de dados, não a aleijada.)

sql-server sql-server-2008
  • 1 1 respostas
  • 27131 Views

1 respostas

  • Voted
  1. Best Answer
    Tom V
    2017-11-16T02:33:17+08:002017-11-16T02:33:17+08:00

    Esse problema pode ser resolvido usando collations sem distinção de acentos .

    Seu banco de dados provavelmente está usando um agrupamento AS (Accent Sensitive), portanto, por padrão, ele procurará a correspondência exata, incluindo acentos.

    Você pode instruir a cláusula WHERE a usar outro agrupamento que não o padrão do banco de dados especificando um agrupamento com a comparação.

    Neste dbfiddle , criei um exemplo usando os agrupamentos LATIN1, mas você pode usar a mesma abordagem com o agrupamento que está usando apenas alterando AS para AI para o agrupamento que sua coluna está usando no momento.

    Use o agrupamento Accent Insensitive que corresponde ao agrupamento que a coluna está usando. Por exemplo, se a coluna estiver usando SQL_Latin1_General_CP1_CI_AS, use SQL_Latin1_General_CP1_CI_AIand not Latin1_General_CI_ASou Latin1_General_100_CI_ASou qualquer uma das variações desses dois, pois o comportamento dos agrupamentos não SQL_ será diferente em mais maneiras do que apenas a insensibilidade ao acento, e isso pode não ser esperado pelos usuários.

    Você pode verificar o agrupamento atual em sys.columns.

    CREATE TABLE testaccent (name nvarchar(50));
    GO
    INSERT INTO testaccent (name) VALUES ('Millière') , ('Milliere');
    GO
    -- returns Miliere
    SELECT * FROM testaccent WHERE name = 'Milliere';
    
    -- returns both
    SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AI
    
    --only returns Miliere
    SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AS
    

    Leia usando o SQL Server Collations para obter mais informações.

    Então, novamente, você provavelmente deseja que a classificação use esse agrupamento (como peufeu observou nos comentários) para garantir que "é" seja classificado com "e". Caso contrário, alguém que pagina os resultados em ordem alfabética ficaria surpreso em não encontrar o "é" onde eles esperavam que estivessem, mas se você quiser apenas tocar nessa consulta, poderá adicionar a COLLATEcláusula ORDER BYtambém.

    Conforme observado por Solomon Rutzky nos comentários, se isso afetar apenas 1 ou algumas colunas, outra opção é criar uma coluna computada não persistente que simplesmente repita a coluna "nome" e forneça o agrupamento insensível ao acento e, em seguida, indexe o cálculo coluna. Isso evita a verificação causada pela alteração do agrupamento na consulta. Em seguida, a consulta precisa filtrar na nova coluna.

    Algo como:

    ALTER TABLE 
    dbo.[table_name] ADD [SearchName] datatype_of_name_column 
    AS ([Name] COLLATE LATIN1_GENERAL_100_CI_AI)); 
    
    CREATE INDEX [IX_table_name_SearchName] 
    ON dbo.[table_name] ([SearchName] ASC);
    

    Ou você também pode criar uma visualização em vez de adicionar uma coluna computada (como jyao prefere).

    • 38

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve