To pytanie nie jest tak związane z bazami danych, ale raczej z obsługą i regułami Unicode.
Na podstawie https://docs.microsoft.com/en-us/sql/t-sql/statements/windows-collation-name-transact-sql Latin1_General_100_CS_AS oznacza: „Sortowanie używa reguł sortowania i mapowania słownika Latin1 General na stronę kodową 1252 ”z dodanym CS = rozróżnianie wielkości liter i AS = rozróżnianie wielkości liter.
Odwzorowanie między stroną kodową Windows 1252 a Unicode ( http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT ) pokazuje te same wartości dla wszystkich znaków, z którymi mamy do czynienia (z wyjątkiem e z makronem tego nie ma w mapowaniu Microsoft, więc nie mam pojęcia, co robi z tym przypadkiem), więc na razie możemy skoncentrować się na narzędziach i terminologii Unicode.
Po pierwsze, daj nam znać dokładnie, z czym mamy do czynienia, dla wszystkich swoich ciągów:
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
Algorytm sortowania Unicode opisano tutaj: https://www.unicode.org/reports/tr10/
Spójrz na sekcję 1.3 „Wrażliwość kontekstowa”, która wyjaśnia, że sortowanie nie może zależeć tylko od jednego znaku po drugim, ponieważ niektóre reguły są zależne od kontekstu.
Zwróć także uwagę na te punkty w 1.8:
Sortowanie nie jest własnością ciągów. Generalnie porządek sortowania nie jest zachowywany podczas operacji konkatenacji lub podciągania.
Domyślnie algorytm wykorzystuje trzy w pełni konfigurowalne poziomy. W przypadku skryptu łacińskiego poziomy te odpowiadają mniej więcej:
alphabetic ordering
diacritic ordering
case ordering.
Ale sam algorytm jest trochę gęsty. Jego istotą jest: Krótko mówiąc, algorytm sortowania Unicode pobiera wejściowy ciąg Unicode i tablicę elementów sortowania, zawierającą dane odwzorowania znaków. Tworzy klucz sortowania, który jest tablicą 16-bitowych liczb całkowitych bez znaku. Tak wytworzone dwa lub więcej kluczy sortowania można następnie porównać binarnie, aby uzyskać prawidłowe porównanie ciągów, dla których zostały wygenerowane.
Możesz zobaczyć szczegółowe zasady sortowania w języku łacińskim tutaj: http://developer.mimer.com/collations/charts/latin.htm
lub więcej bezpośrednio i specjalnie dla MS SQL:
http://collation-charts.org/mssql/mssql. 0409.1252.Latin1_General_CS_AS.html
Dla e
postaci pokazuje:
e E é É è È ê Ê ë Ë
Wyjaśnia to twoje wyniki przy zamawianiu col1
z tą różnicą, że ē nie istnieje na stronie kodowej 1252, więc absolutnie nie mam pojęcia, co on z tym robi.
Lub jeśli wykonujemy algorytm Unicode ręcznie, używając wartości kluczy DUCET na stronie http://www.unicode.org/Public/UCA/latest/allkeys.txt :
krok 1: Normalizacja z formularza D, więc każdy przypadek staje się:
e => U+0065
é => U+0065 U+0301
ë => U+0065 U+0308
è => U+0065 U+0300
ê => U+0065 U+0302
ē => U+0065 U+0304
krok 2, Utwórz tablice sortowania (wyszukiwanie w pliku 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]
krok 3, Utwórz klucze sortowania (dla każdego poziomu, weź każdą wartość do każdej tablicy zestawiania, następnie umieść 0000 jako separator i zacznij ponownie na następny poziom)
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
krok 4, Porównaj klucze sortowania (proste binarne porównanie każdej wartości jedna po drugiej): Czwarta wartość wystarczy, aby posortować je wszystkie, więc ostateczna kolejność to:
e
é
è
ê
ë
ē
W ten sam sposób przy zamawianiu col2
:
krok 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
krok 2: Tablice zestawiania
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]
krok 3: Utwórz klucze sortowania
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
krok 4: Porównaj klucze sortowania: Druga wartość wystarczy, aby posortować je wszystkie, i w rzeczywistości jest już w porządku rosnącym, więc ostateczna kolejność to:
eA
éB
ëC
èD
êE
ēF
Aktualizacja : dodanie trzeciego przypadku Solomona Rutzky'ego, który jest trudniejszy ze względu na przestrzeń umożliwiającą wprowadzenie nowych reguł (wybrałem „przypadek niezapominalny”):
krok 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
krok 2, Utwórz tablice zestawień:
è 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]
krok 3, Utwórz klucze sortowania:
è 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
krok 4, Porównaj klucze sortowania:
Zasadniczo trzecia wartość określa kolejność i w rzeczywistości opiera się tylko na ostatniej cyfrze, więc kolejność powinna wynosić:
è 1
e 2
ē 3
é 4
ê 5
ë 6
Druga aktualizacja oparta na komentarzu Solomona Rutzky'ego na temat wersji Unicode.
Użyłem allkeys.txt
danych o najnowszej wersji Unicode, czyli wersji 10.0
Jeśli zamiast tego musimy wziąć pod uwagę Unicode 5.1 , byłoby to:
http://www.unicode.org/Public/UCA/5.1.0/allkeys.txt
Właśnie sprawdziłem, dla wszystkich powyższych znaków, tablice sortowania są następujące:
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]
i:
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]
i:
è 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]
które następnie obliczają następujące klucze sortowania:
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
i:
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
i:
è 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
co ponownie daje te trzy posortowane wyniki:
e
é
è
ê
ë
ē
i
eA
éB
ëC
èD
êE
ēF
i
è 1
e 2
ē 3
é 4
ê 5
ë 6
VARCHAR
(tj. Nie-Unicode), które nie są tutaj używane. Właśnie dlategoē
postać działa dobrze. 2) Informacje o „zestawieniach” są nieco nieaktualne. Dotyczy poprzedniej wersji tego zestawu i nie opublikowali niczego od 2009 roku. 3) Wersja Unicode tutaj zdecydowanie nie jest najnowsza (wersja 10)._100_
Seria Konfrontacje przyszedł z SQL 2008, więc będzie to Unicode 5.0 lub 5.1: unicode.org/standard/versions/#TUS_Earlier_Versions