El tipo de intercalación predeterminado en SQL Server permite la indexación contra cadenas que no distinguen entre mayúsculas y minúsculas, pero el caso de los datos persiste. ¿Cómo funciona esto realmente? Estoy buscando las tuercas y tornillos reales, bits y bytes, o un buen recurso que lo explique en detalle.
create table casetest (fruitnames nvarchar(50) not null);
create unique index IX_fruitnames on casetest(fruitnames);
insert into casetest values ('apples');
insert into casetest values ('Pears');
-- this insert fails
insert into casetest values ('pears');
-- this yields 'Pears' as a result
select * from casetest (forceseek) where fruitnames = 'PEARS'
update casetest set fruitnames = 'pears' where fruitnames = 'pEArs'
-- this yields 'pears' as a result
select * from casetest (forceseek) where fruitnames = 'PEARS'
Las preguntas sobre las intercalaciones de SQL Server que Robert Sheldon le hizo preguntar demasiado sobre cómo utilizar la intercalación. No cubre cómo funciona la colación. Estoy interesado en cómo se puede crear / consultar eficientemente un índice sin preocuparse por el caso, mientras se almacenan simultáneamente los datos del caso.
sql-server
collation
cocogorilla
fuente
fuente
Respuestas:
En realidad, este no es un comportamiento específico de SQL Server, es simplemente cómo funcionan estas cosas en general.
Entonces, los datos son los datos. Si usted está hablando de un índice concreto, los datos debe ser almacenado, ya que es otra cosa sería necesaria una consulta en la tabla principal cada vez para obtener el valor real, y no habría ninguna posibilidad de un índice de cobertura (en al menos no para los tipos de cadena).
Los datos, ya sea en la tabla / índice agrupado o en el índice no agrupado, no contienen ninguna información de clasificación / clasificación. Es simplemente datos. La intercalación (reglas y sensibilidades locales / culturales) son solo metadatos adjuntos a la columna y se usan cuando se llama a una operación de clasificación (a menos que sea anulada por un
COLLATE
cláusula), que incluiría la creación / reconstrucción de un índice. Las reglas definidas por una intercalación no binaria se utilizan para generar claves de clasificación, que son representaciones binarias de la cadena (las claves de clasificación no son necesarias en las intercalaciones binarias). Estas representaciones binarias incorporan todas las reglas locales / culturales y sensibilidades seleccionadas. Las claves de clasificación se utilizan para colocar los registros en su orden correcto, pero no se almacenan en el índice o la tabla. No están almacenados (al menos no he visto estos valores en el índice y me dijeron que no están almacenados) porque:Hay dos tipos de intercalaciones: SQL Server y Windows.
servidor SQL
Las intercalaciones de SQL Server (aquellas con nombres que comienzan con
SQL_
) son la forma anterior de clasificación / comparación anterior a SQL Server 2000 (aunque todavíaSQL_Latin1_General_CP1_CI_AS
es la instalación predeterminada en los sistemas operativos de inglés de EE. UU., Por desgracia). En este modelo anterior, simplista y no Unicode, cada combinación de configuración regional, página de códigos y las diversas sensibilidades reciben una asignación estática de cada uno de los caracteres en esa página de códigos. A cada personaje se le asigna un valor (es decir, clasificar el peso) para indicar cómo se compara con los demás. Las comparaciones en este modelo parecen hacer una operación de dos pasos:Las únicas sensibilidades que se pueden ajustar en estas intercalaciones son: "mayúsculas y minúsculas" ("ancho", "tipo kana" y "selector de variación" no están disponibles). Además, ninguna de estas colaciones admite caracteres suplementarios (lo cual tiene sentido ya que son específicos de Unicode y estas colaciones solo se aplican a datos que no son Unicode).
Este enfoque se aplica solo a
VARCHAR
datos que no son Unicode . Cada combinación única de configuración regional, página de códigos, mayúsculas y minúsculas tiene una "ID de clasificación" específica, que puede ver en el siguiente ejemplo:La única diferencia entre las dos primeras colaciones es la sensibilidad a mayúsculas y minúsculas. La tercera intercalación es una intercalación de Windows y, por lo tanto, no tiene una tabla de asignación estática.
Además, estas clasificaciones deben clasificarse y compararse más rápido que las clasificaciones de Windows debido a que son simples búsquedas de caracteres para clasificar el peso. Sin embargo, estas intercalaciones también son mucho menos funcionales y generalmente deben evitarse si es posible.
Ventanas
Las intercalaciones de Windows (aquellas con nombres que no comienzan con
SQL_
) son la forma más nueva de ordenar / comparar (comenzando en SQL Server 2000). En este modelo Unicode más nuevo y complejo, cada combinación de configuración regional, página de códigos y las diversas sensibilidades no reciben una asignación estática. Por un lado, no hay páginas de códigos en este modelo. Este modelo asigna un valor de clasificación predeterminado a cada carácter, y luego cada localidad / cultura puede reasignar los valores de clasificación a cualquier número de caracteres. Esto permite que múltiples culturas usen los mismos personajes de diferentes maneras. Esto tiene el efecto de permitir que varios idiomas se ordenen naturalmente usando la misma clasificación si no usan los mismos caracteres (y si uno de ellos no necesita reasignar ningún valor y simplemente puede usar los valores predeterminados).Los valores de clasificación en este modelo no son valores únicos. Son una matriz de valores que asignan pesos relativos a la letra base, cualquier signo diacrítico (es decir, acentos), mayúsculas y minúsculas, etc. Si la intercalación distingue entre mayúsculas y minúsculas, se utiliza la parte de "mayúsculas" de esa matriz, de lo contrario se ignora ( por lo tanto, insensible). Si la intercalación es sensible al acento, se usa la porción "diacrítica" de la matriz, de lo contrario se ignora (por lo tanto, insensible).
Las comparaciones en este modelo son una operación de varios pasos:
Para obtener más detalles sobre esta clasificación, eventualmente publicaré una publicación que muestre los valores de clave de clasificación, cómo se calculan, las diferencias entre SQL Server y las intercalaciones de Windows, etc. Pero por ahora, vea mi respuesta a: Clasificación sensible acentuada ( tenga en cuenta que la otra respuesta a esa pregunta es una buena explicación del algoritmo oficial Unicode, pero SQL Server utiliza un algoritmo personalizado, aunque similar, e incluso una tabla de peso personalizada).
Todas las sensibilidades se pueden ajustar en estas intercalaciones: "mayúsculas", "acento", "ancho", "tipo kana" y "selector de variación" (a partir de SQL Server 2017, y solo para las intercalaciones japonesas). Además, algunas de estas intercalaciones (cuando se usan con datos Unicode) admiten caracteres suplementarios (a partir de SQL Server 2012). Este enfoque se aplica tanto a los datos
NVARCHAR
como a losVARCHAR
datos (incluso los datos que no son Unicode). Se aplica aVARCHAR
datos que no son Unicode convirtiendo primero el valor a Unicode internamente y luego aplicando las reglas de clasificación / comparación.Tenga en cuenta:
SQL_Latin1_General_CP1_CI_AS
para los sistemas de inglés de EE. UU., Por lo tanto , vote por esta sugerencia ). Esto se puede cambiar durante la instalación. Esta clasificación a nivel de instancia establece la clasificación para la base de[model]
datos, que es la plantilla utilizada al crear nuevas bases de datos, pero la clasificación se puede cambiar al ejecutarCREATE DATABASE
especificando laCOLLATE
cláusula. Esta clasificación a nivel de base de datos se usa para literales variables y de cadena, así como el valor predeterminado para columnas nuevas (¡y alteradas!) CuandoCOLLATE
no se especifica la cláusula (que es el caso del código de ejemplo en la pregunta).fuente
Por lo general, esto se implementa utilizando tablas de clasificación que asignan una determinada puntuación a cada personaje. La rutina de clasificación tiene un comparador que usa una tabla apropiada, ya sea predeterminada o especificada explícitamente, para comparar cadenas, carácter por carácter, usando sus puntuaciones de clasificación. Si, por ejemplo, una tabla de clasificación particular asigna un puntaje de 1 a "a" y 201 a "A", y un puntaje más bajo en esta implementación particular significa mayor prioridad, entonces "a" se ordenará antes de "A". Otra tabla podría asignar puntuaciones inversas: 201 a "a" y 1 a "A", y el orden de clasificación será posteriormente inverso. Sin embargo, otra tabla podría asignar puntajes iguales a "a", "A", "Á" y "Å", lo que conduciría a una comparación y clasificación insensible a mayúsculas y minúsculas.
De manera similar, dicho comparador basado en tablas de colación se usa al comparar una clave de índice con el valor proporcionado en el predicado.
fuente
SQL_
) cuando se usa enVARCHAR
datos. Esto no es exactamente cierto para losNVARCHAR
datos oVARCHAR
datos cuando se utiliza una intercalación de Windows (los nombres no comienzan conSQL_
).