Questa domanda non è così correlata ai database ma piuttosto alla gestione e alle regole Unicode.
Basato su https://docs.microsoft.com/en-us/sql/t-sql/statements/windows-collation-name-transact-sql Latin1_General_100_CS_AS significa: "Le regole di confronto utilizzano le regole di ordinamento del dizionario latino Latin1 e le mappe alla tabella codici 1252 "con CS = case sensitive aggiunto e AS = accent sensitive.
La mappatura tra la code page di Windows 1252 e Unicode ( http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT ) mostrano gli stessi valori per tutti i personaggi con cui abbiamo a che fare (tranne e con macron che non esiste nella mappatura Microsoft, quindi non ho idea di cosa faccia in questo caso), quindi per ora possiamo concentrarci sugli strumenti e sulla terminologia Unicode.
Per prima cosa, facci sapere esattamente con cosa abbiamo a che fare, per tutte le tue corde:
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
L'algoritmo di confronto Unicode è descritto qui: https://www.unicode.org/reports/tr10/
Dai un'occhiata alla sezione 1.3 "Sensibilità contestuale" che spiega che l'ordinamento non può dipendere da un solo carattere dopo l'altro poiché alcune regole sono sensibili al contesto.
Nota anche questi punti in 1.8:
La collazione non è una proprietà delle stringhe. L'ordine di confronto non viene conservato durante le operazioni di concatenazione o sottostringa, in generale.
Per impostazione predefinita, l'algoritmo utilizza tre livelli completamente personalizzabili. Per la scrittura latina, questi livelli corrispondono approssimativamente a:
alphabetic ordering
diacritic ordering
case ordering.
Ma l'algoritmo di per sé è un po 'denso. L'essenza è: brevemente, l'algoritmo di confronto Unicode accetta una stringa Unicode di input e una tabella degli elementi di confronto, che contiene i dati di mapping per i caratteri. Produce una chiave di ordinamento, che è un array di numeri interi a 16 bit senza segno. Due o più chiavi di ordinamento così prodotte possono quindi essere confrontate binariamente per fornire il corretto confronto tra le stringhe per le quali sono state generate.
È possibile visualizzare le regole di ordinamento latino specifiche qui: http://developer.mimer.com/collations/charts/latin.htm
o più direttamente e specificamente per MS SQL:
http://collation-charts.org/mssql/mssql. 0409.1252.Latin1_General_CS_AS.html
Per il e
personaggio che mostra:
e E é É è È ê Ê ë Ë
Questo spiega i tuoi risultati al momento dell'ordine, col1
tranne per il fatto che ē non esiste nella tabella codici 1252, quindi non ho assolutamente idea di cosa ci faccia.
O se eseguiamo manualmente l'algoritmo Unicode, utilizzando il valore delle chiavi di DUCET su http://www.unicode.org/Public/UCA/latest/allkeys.txt :
passaggio 1: modulo di normalizzazione D, quindi ogni caso diventa:
e => U+0065
é => U+0065 U+0301
ë => U+0065 U+0308
è => U+0065 U+0300
ê => U+0065 U+0302
ē => U+0065 U+0304
passaggio 2, produrre array di confronto (ricerca nel file 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]
passaggio 3, chiavi di ordinamento dei moduli (per ogni livello, prendere ciascun valore all'interno di ciascun array di confronto, quindi inserire 0000 come delimitatore e ricominciare dal livello successivo)
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
passaggio 4, confronta le chiavi di ordinamento (semplice confronto binario di ogni valore uno per uno): il quarto valore è sufficiente per ordinarli tutti, quindi l'ordine finale diventa:
e
é
è
ê
ë
ē
Allo stesso modo per l'ordinazione su col2
:
passaggio 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
passaggio 2: array di confronto
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]
passaggio 3: chiavi di ordinamento dei moduli
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
passaggio 4: confronta le chiavi di ordinamento: il secondo valore è sufficiente per ordinarle tutte, ed è infatti già in ordine crescente, quindi l'ordine finale è effettivamente:
eA
éB
ëC
èD
êE
ēF
Aggiornamento : aggiunta del terzo caso Solomon Rutzky, che è più complicato a causa dello spazio che consente nuove regole (ho scelto il "caso non ignorabile"):
passaggio 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
passaggio 2, produrre array di confronto:
è 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]
passaggio 3, chiavi di ordinamento dei moduli:
è 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
passaggio 4, confronta i tasti di ordinamento:
Fondamentalmente il terzo valore determina l'ordine, ed è in realtà basato solo sull'ultima cifra, quindi l'ordine dovrebbe essere:
è 1
e 2
ē 3
é 4
ê 5
ë 6
Secondo aggiornamento basato sul commento di Solomon Rutzky sulle versioni Unicode.
Ho usato i allkeys.txt
dati sull'ultima versione Unicode in questo momento, cioè la versione 10.0
Se invece dovessimo prendere in considerazione Unicode 5.1 , questo sarebbe:
http://www.unicode.org/Public/UCA/5.1.0/allkeys.txt
Ho appena controllato, per tutti i personaggi sopra, gli array di confronto sono i seguenti invece:
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]
e:
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]
e:
è 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]
che poi calcola alle seguenti chiavi di ordinamento:
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
e:
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
e:
è 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
che fornisce di nuovo questi tre risultati ordinati:
e
é
è
ê
ë
ē
e
eA
éB
ëC
èD
êE
ēF
e
è 1
e 2
ē 3
é 4
ê 5
ë 6
VARCHAR
(cioè non Unicode), che non viene utilizzato qui. Ecco perché ilē
personaggio funziona bene. 2) Le informazioni sui "grafici di confronto" sono un po 'obsolete. È per una versione precedente di questa raccolta e non hanno pubblicato nulla dal 2009. 3) La versione Unicode qui non è sicuramente l'ultima (versione 10). La_100_
serie Collations è arrivata con SQL 2008, quindi sarebbe Unicode 5.0 o 5.1: unicode.org/standard/versions/#TUS_Earlier_Versions