En nuestra base de datos tenemos múltiples entradas con caron / hatschek. Ahora nuestros usuarios quieren encontrar entradas que incluyan caron / hatschek cuando buscan entradas sin ellas. Lo mostraré con un simple ejemplo:
En nuestra base de datos tenemos la entrada (contacto con nombre)
Millière
entonces este nombre es correcto en el país donde vive la persona.
En nuestro país no tenemos ningún personaje con caron / hatschek, por lo tanto, nuestro usuario busca Milliere
. No aparecen resultados, ya è
que obviamente no coincide e
.
No tengo idea de cómo esto podría ser realizado como é
, è
, ê
y muchos más están disponibles (y esto es sólo un ejemplo de carta e
...).
(La otra forma sería mucho más fácil, ya que podría simplemente reemplazar todas las letras con caron / hatschek por la básica. Obviamente, nuestros usuarios quieren la versión correcta del nombre en la base de datos, no la lisiada).
Respuestas:
Este problema puede resolverse utilizando colaciones insensibles al acento .
Es probable que su base de datos esté utilizando una clasificación AS (sensible al acento), por lo que, de forma predeterminada, buscará la coincidencia exacta, incluidos los acentos.
Puede indicar a la cláusula WHERE que use otra clasificación que no sea la predeterminada de la base de datos especificando una clasificación con la comparación.
En este dbfiddle , creé un ejemplo usando las intercalaciones LATIN1, pero podría usar el mismo enfoque con la intercalación que está utilizando simplemente cambiando AS a AI para la intercalación que su columna está utilizando actualmente.
Utilice la clasificación Accent Insensitive que coincida con la clasificación que está utilizando el columnmn. Por ejemplo, si la columna está usando
SQL_Latin1_General_CP1_CI_AS
, useSQL_Latin1_General_CP1_CI_AI
y notLatin1_General_CI_AS
oLatin1_General_100_CI_AS
cualquiera de las variaciones de esos dos, ya que el comportamiento de las colaciones no SQL_ diferirá en más formas que solo la insensibilidad al acento, y eso podría no ser esperado por los usuarios.Puede consultar la clasificación actual en
sys.columns
.Lea a través del uso de intercalaciones de SQL Server para obtener más información.
Por otra parte, es probable que desee ordenar para utilizar esta intercalación (como peufeu señaló en los comentarios) para asegurarse de que "é" se clasifique con "e". De lo contrario, alguien que pagina los resultados en orden alfabético se sorprendería de no encontrar la "é" donde espera que estén, pero si solo desea tocar esta consulta, también puede agregar la
COLLATE
cláusulaORDER BY
.Como señaló Solomon Rutzky en los comentarios, si esto solo afecta a 1 o unas pocas columnas, otra opción es crear una columna computada no persistente que simplemente repita la columna "nombre" y proporcione la colación insensible al acento, y luego indexe el cómputo calculado columna. Esto evita el escaneo causado al cambiar la intercalación dentro de la consulta. Entonces la consulta necesita filtrarse en la nueva columna.
Algo como:
O también podría crear una vista en lugar de agregar una columna calculada (como lo prefiere jyao ).
fuente
SQL_Latin1_General_CP1_CI_AS
, useSQL_Latin1_General_CP1_CI_AI
y notLatin1_General_CI_AS
oLatin1_General_100_CI_AS
cualquiera de las variaciones de esos dos, ya que el comportamiento de las noSQL_
colaciones diferirá en más formas que solo la insensibilidad al acento, y eso podría no ser esperado por los usuarios. La colación se encuentra ensys.columns
.