Esta pregunta no está tan relacionada con las bases de datos, sino más sobre el manejo y las reglas de Unicode.
Basado en https://docs.microsoft.com/en-us/sql/t-sql/statements/windows-collation-name-transact-sql Latin1_General_100_CS_AS significa: "La clasificación utiliza las reglas y mapas de clasificación general del diccionario Latin1 en la página de códigos 1252 "con el agregado CS = mayúsculas y minúsculas y AS = acento sensible.
La asignación entre la página de códigos de Windows 1252 y Unicode ( http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT ) muestra los mismos valores para todos los caracteres con los que estamos tratando (excepto e con macron eso no existe en el mapeo de Microsoft, así que no tengo idea de qué hace con este caso), por lo que podemos concentrarnos en las herramientas y la terminología de Unicode por ahora.
Primero, háganos saber con precisión a qué nos enfrentamos, para todas sus cadenas:
0065 LATIN SMALL LETTER E
0041 LATIN CAPITAL LETTER A
00E9 LATIN SMALL LETTER E WITH ACUTE
0042 LATIN CAPITAL LETTER B
00EB LATIN SMALL LETTER E WITH DIAERESIS
0043 LATIN CAPITAL LETTER C
00E8 LATIN SMALL LETTER E WITH GRAVE
0044 LATIN CAPITAL LETTER D
00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
0045 LATIN CAPITAL LETTER E
0113 LATIN SMALL LETTER E WITH MACRON
0046 LATIN CAPITAL LETTER F
El algoritmo de colación Unicode se describe aquí: https://www.unicode.org/reports/tr10/
Eche un vistazo a la sección 1.3 "Sensibilidad contextual" que explica que la clasificación no puede depender de un solo carácter después del otro, ya que algunas reglas son sensibles al contexto.
Tenga en cuenta también estos puntos en 1.8:
La clasificación no es una propiedad de cadenas. El orden de clasificación no se conserva bajo operaciones de concatenación o subcadena, en general.
Por defecto, el algoritmo utiliza tres niveles totalmente personalizables. Para la escritura latina, estos niveles corresponden aproximadamente a:
alphabetic ordering
diacritic ordering
case ordering.
Pero el algoritmo en sí mismo es un poco denso. La esencia de esto es: En pocas palabras, el Algoritmo de clasificación Unicode toma una cadena Unicode de entrada y una Tabla de elementos de clasificación, que contiene datos de mapeo para los caracteres. Produce una clave de clasificación, que es una matriz de enteros de 16 bits sin signo. Dos o más claves de clasificación así producidas se pueden comparar en binario para dar la comparación correcta entre las cadenas para las que se generaron.
Puede ver las reglas específicas de clasificación en latín aquí: http://developer.mimer.com/collations/charts/latin.htm
o más directa y específicamente para MS SQL:
http://collation-charts.org/mssql/mssql. 0409.1252.Latin1_General_CS_AS.html
Para el e
personaje que muestra:
e E é É è È ê Ê ë Ë
Esto explica sus resultados al realizar el pedido, col1
excepto que ē no existe en la página de códigos 1252, por lo que no tengo absolutamente ninguna idea de lo que hace con él.
O si hacemos el algoritmo Unicode a mano, utilizando el valor de las claves de DUCET en http://www.unicode.org/Public/UCA/latest/allkeys.txt :
Paso 1: Forma de normalización D, por lo que cada caso se convierte en:
e => U+0065
é => U+0065 U+0301
ë => U+0065 U+0308
è => U+0065 U+0300
ê => U+0065 U+0302
ē => U+0065 U+0304
paso 2, Producir matrices de intercalación (búsqueda en archivo allkeys.txt
)
e => [.1D10.0020.0002]
é => [.1D10.0020.0002] [.0000.0024.0002]
ë => [.1D10.0020.0002] [.0000.002B.0002]
è => [.1D10.0020.0002] [.0000.0025.0002]
ê => [.1D10.0020.0002] [.0000.0027.0002]
ē => [.1D10.0020.0002] [.0000.0032.0002]
paso 3, Forme las claves de clasificación (para cada nivel, tome cada valor dentro de cada matriz de clasificación, luego coloque 0000 como delimitador y comience nuevamente para el siguiente nivel)
e => 1D10 0000 0020 0000 0002
é => 1D10 0000 0020 0024 0000 0002 0002
ë => 1D10 0000 0020 002B 0000 0002 0002
è => 1D10 0000 0020 0025 0000 0002 0002
ê => 1D10 0000 0020 0027 0000 0002 0002
ē => 1D10 0000 0020 0032 0000 0002 0002
Paso 4, Comparar claves de clasificación (comparación binaria simple de cada valor uno por uno): el cuarto valor es suficiente para ordenarlos todos, por lo que el orden final se convierte en:
e
é
è
ê
ë
ē
De la misma manera para ordenar col2
:
paso 1: NFD
eA => U+0065 U+0041
éB => U+0065 U+0301 U+0042
ëC => U+0065 U+0308 U+0043
èD => U+0065 U+0300 U+0044
êE => U+0065 U+0302 U+0045
ēF => U+0065 U+0304 U+0046
paso 2: matrices de intercalación
eA => [.1D10.0020.0002] [.1CAD.0020.0008]
éB => [.1D10.0020.0002] [.0000.0024.0002] [.1CC6.0020.0008]
ëC => [.1D10.0020.0002] [.0000.002B.0002] [.1CE0.0020.0008]
èD => [.1D10.0020.0002] [.0000.0025.0002] [.1CF5.0020.0008]
êE => [.1D10.0020.0002] [.0000.0027.0002] [.1D10.0020.0008]
ēF => [.1D10.0020.0002] [.0000.0032.0002] [.1D4B.0020.0008]
Paso 3: claves de clasificación de formulario
eA => 1D10 1CAD 0000 0020 0020 0000 0002 0008
éB => 1D10 1CC6 0000 0020 0024 0020 0000 0002 0002 0008
ëC => 1D10 1CE0 0000 0020 002B 0020 0000 0002 0002 0008
èD => 1D10 1CF5 0000 0020 0025 0020 0000 0002 0002 0008
êE => 1D10 1D10 0000 0020 0027 0020 0000 0002 0002 0008
ēF => 1D10 1D4B 0000 0020 0032 0020 0000 0002 0002 0008
Paso 4: Comparar las claves de clasificación: el segundo valor es suficiente para ordenarlas todas, y de hecho ya está en orden creciente, por lo que el orden final es:
eA
éB
ëC
èD
êE
ēF
Actualización : agregar el tercer caso de Solomon Rutzky, que es más complicado debido al espacio que permite nuevas reglas (elegí el "caso no ignorable"):
paso 1, NFD:
è 1 => U+0065 U+0300 U+0020 U+0031
ê 5 => U+0065 U+0302 U+0020 U+0035
e 2 => U+0065 U+0020 U+0032
é 4 => U+0065 U+0301 U+0020 U+0034
ē 3 => U+0065 U+0304 U+0020 U+0033
ë 6 => U+0065 U+0308 U+0020 U+0036
Paso 2, Producir matrices de intercalación:
è 1 => [.1D10.0020.0002] [.0000.0025.0002] [*0209.0020.0002] [.1CA4.0020.0002]
ê 5 => [.1D10.0020.0002] [.0000.0027.0002] [*0209.0020.0002] [.1CA8.0020.0002]
e 2 => [.1D10.0020.0002] [*0209.0020.0002] [.1CA5.0020.0002]
é 4 => [.1D10.0020.0002] [.0000.0024.0002] [*0209.0020.0002] [.1CA7.0020.0002]
ē 3 => [.1D10.0020.0002] [.0000.0032.0002] [*0209.0020.0002] [.1CA6.0020.0002]
ë 6 => [.1D10.0020.0002] [.0000.002B.0002] [*0209.0020.0002] [.1CA9.0020.0002]
Paso 3, claves de clasificación de formulario:
è 1 => 1D10 0209 1CA4 0000 0020 0025 0020 0020 0000 0002 0002 0002 0002
ê 5 => 1D10 0209 1CA8 0000 0020 0027 0020 0020 0000 0002 0002 0002 0002
e 2 => 1D10 0209 1CA5 0000 0020 0020 0020 0000 0002 0002 0002
é 4 => 1D10 0209 1CA7 0000 0020 0024 0020 0020 0000 0002 0002 0002 0002
ē 3 => 1D10 0209 1CA6 0000 0020 0032 0020 0020 0000 0002 0002 0002 0002
ë 6 => 1D10 0209 1CA9 0000 0020 002B 0020 0020 0000 0002 0002 0002 0002
Paso 4, compara las claves de clasificación:
Básicamente, el tercer valor determina el orden, y de hecho solo se basa en el último dígito, por lo que el orden debería ser:
è 1
e 2
ē 3
é 4
ê 5
ë 6
Segunda actualización basada en el comentario de Solomon Rutzky sobre las versiones de Unicode.
Usé los allkeys.txt
datos sobre la última versión de Unicode en este momento, es decir, la versión 10.0
Si necesitamos tener en cuenta Unicode 5.1 , esto sería:
http://www.unicode.org/Public/UCA/5.1.0/allkeys.txt
Acabo de comprobar, para todos los caracteres anteriores, las matrices de intercalación son las siguientes:
e => [.119D.0020.0002.0065]
é => [.119D.0020.0002.0065] [.0000.0032.0002.0301]
ë => [.119D.0020.0002.0065] [.0000.0047.0002.0308]
è => [.119D.0020.0002.0065] [.0000.0035.0002.0300]
ê => [.119D.0020.0002.0065] [.0000.003C.0002.0302]
ē => [.119D.0020.0002.0065] [.0000.005B.0002.0304]
y:
eA => [.119D.0020.0002.0065] [.1141.0020.0008.0041]
éB => [.119D.0020.0002.0065] [.0000.0032.0002.0301] [.1157.0020.0008.0042]
ëC => [.119D.0020.0002.0065] [.0000.0047.0002.0308] [.116F.0020.0008.0043]
èD => [.119D.0020.0002.0065] [.0000.0035.0002.0300] [.1182.0020.0008.0044]
êE => [.119D.0020.0002.0065] [.0000.003C.0002.0302] [.119D.0020.0008.0045]
ēF => [.119D.0020.0002.0065] [.0000.005B.0002.0304] [.11D5.0020.0008.0046]
y:
è 1 => [.119D.0020.0002.0065] [.0000.0035.0002.0300] [*0209.0020.0002.0020] [.1138.0020.0002.0031]
ê 5 => [.119D.0020.0002.0065] [.0000.003C.0002.0302] [*0209.0020.0002.0020] [.113C.0020.0002.0035]
e 2 => [.119D.0020.0002.0065] [*0209.0020.0002.0020] [.1139.0020.0002.0032]
é 4 => [.119D.0020.0002.0065] [.0000.0032.0002.0301] [*0209.0020.0002.0020] [.113B.0020.0002.0034]
ē 3 => [.119D.0020.0002.0065] [.0000.005B.0002.0304] [*0209.0020.0002.0020] [.113A.0020.0002.0033]
ë 6 => [.119D.0020.0002.0065] [.0000.0047.0002.0308] [*0209.0020.0002.0020] [.113D.0020.0002.0036]
que luego se calculan con las siguientes claves de clasificación:
e => 119D 0000 0020 0000 0002 0000 0065
é => 119D 0000 0020 0032 0000 0002 0002 0000 0065 0301
ë => 119D 0000 0020 0047 0000 0002 0002 0000 0065 0308
è => 119D 0000 0020 0035 0000 0002 0002 0000 0065 0300
ê => 119D 0000 0020 003C 0000 0002 0002 0000 0065 0302
ē => 119D 0000 0020 005B 0000 0002 0002 0000 0065 0304
y:
eA => 119D 1141 0000 0020 0020 0000 0002 0008 0000 0065 0041
éB => 119D 1157 0000 0020 0032 0020 0000 0002 0002 0008 0000 0065 0301 0042
ëC => 119D 116F 0000 0020 0047 0020 0000 0002 0002 0008 0000 0065 0308 0043
èD => 119D 1182 0000 0020 0035 0020 0000 0002 0002 0008 0000 0065 0300 0044
êE => 119D 119D 0000 0020 003C 0020 0000 0002 0002 0008 0000 0065 0302 0045
ēF => 119D 11D5 0000 0020 005B 0020 0000 0002 0002 0008 0000 0065 0304 0046
y:
è 1 => 119D 0209 1138 0000 0020 0035 0020 0020 0000 0002 0002 0002 0002 0000 0065 0300 0020 0031
ê 5 => 119D 0209 113C 0000 0020 003C 0020 0020 0000 0002 0002 0002 0002 0000 0065 0302 0020 0035
e 2 => 119D 0209 1139 0000 0020 0020 0020 0000 0002 0002 0002 0000 0065 0020 0032
é 4 => 119D 0209 113B 0000 0020 0032 0020 0020 0000 0002 0002 0002 0002 0000 0065 0301 0020 0034
ē 3 => 119D 0209 113A 0000 0020 005B 0020 0020 0000 0002 0002 0002 0002 0000 0065 0304 0020 0033
ë 6 => 119D 0209 113D 0000 0020 0047 0020 0020 0000 0002 0002 0002 0002 0000 0065 0308 0020 0036
que nuevamente da estos tres resultados ordenados:
e
é
è
ê
ë
ē
y
eA
éB
ëC
èD
êE
ēF
y
è 1
e 2
ē 3
é 4
ê 5
ë 6
VARCHAR
(es decir, no Unicode), que no se utilizan aquí. Es por eso que elē
personaje funciona bien. 2) La información de "gráficos de colación" está un poco desactualizada. Es para una versión anterior de esta Clasificación y no han publicado nada desde 2009. 3) La versión Unicode aquí definitivamente no es la última (Versión 10). La_100_
serie Collations llegó con SQL 2008, por lo que sería Unicode 5.0 o 5.1: unicode.org/standard/versions/#TUS_Earlier_Versions