Це питання не так пов’язане з базами даних, але більше про обробку Unicode та правила.
На основі https://docs.microsoft.com/en-us/sql/t-sql/statements/windows-collation-name-transact-sql Latin1_General_100_CS_AS означає: "Для зібрання використовуються загальні правила сортування та карти словника Latin1 та карти на кодову сторінку 1252 "із доданим CS = Чутливий до регістру та AS = Акцентний.
Відображення між кодовою сторінкою Windows 1252 та Unicode ( http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT ) показує однакові значення для всіх символів, з якими ми маємо справу (за винятком e з макроном цього не існує в картографуванні Microsoft, тому немає уявлення про те, що це робиться з цим випадком), тому ми можемо зосередитись на інструментах та термінології Unicode.
По-перше, повідомте нам точно, з чим ми маємо справу, для всіх ваших рядків:
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
Алгоритм зібрання Unicode описаний тут: https://www.unicode.org/reports/tr10/
Погляньте на розділ 1.3 "Контекстна чутливість", який пояснює, що сортування не може залежати лише від одного символу за іншим, оскільки деякі правила залежать від контексту.
Зауважте також ці пункти в 1.8:
Збір не є властивістю рядків. Порядок зіставлення не зберігається під час операцій конкатенації чи підрядки.
За замовчуванням алгоритм використовує три повністю настроювані рівні. Для латинського письма ці рівні приблизно відповідають:
alphabetic ordering
diacritic ordering
case ordering.
Але алгоритм сам по собі трохи щільний. Суть його полягає в: Якщо коротко сказано, алгоритм зібрання Unicode приймає вхідний рядок Unicode та таблицю елементів зібрання, що містять дані зіставлення символів. Він виробляє ключ сортування, який представляє собою масив непідписаних 16-бітних цілих чисел. Два або більше створених ключів сортування потім можуть бути двійковими порівняннями, щоб дати правильне порівняння між рядками, для яких вони були створені.
Ви можете переглянути конкретні правила сортування з латинських країн тут: http://developer.mimer.com/collations/charts/latin.htm
або більш безпосередньо та спеціально для MS SQL:
http://collation-charts.org/mssql/mssql. 0409.1252.Latin1_General_CS_AS.html
Для e
персонажа він показує:
e E é è è ê ê Ê ë Ë
Це пояснює ваші результати при замовленні, за col1
винятком того, що ē не існує на кодовій сторінці 1252, тому я абсолютно не маю уявлень, що з цим робити.
Або якщо ми робимо алгоритм Unicode вручну, використовуючи значення ключів DUCET за адресою http://www.unicode.org/Public/UCA/latest/allkeys.txt :
крок 1: Нормалізація форми D, тому кожен випадок стає:
e => U+0065
é => U+0065 U+0301
ë => U+0065 U+0308
è => U+0065 U+0300
ê => U+0065 U+0302
ē => U+0065 U+0304
крок 2, Створення масивів зіставлення (пошук у файлі 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]
крок 3, Сформуйте клавіші сортування (для кожного рівня, візьміть кожне значення всередині кожного масиву зіставлення, а потім поставте 0000 як роздільник і почніть знову для наступного рівня)
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
крок 4, Порівняйте клавіші сортування (просте двійкове порівняння кожного значення по одному): Четвертого значення достатньо для сортування їх усіх, тому остаточний порядок стає:
e
é
è
ê
ë
ē
Таким же чином для замовлення на col2
:
етап 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
крок 2: масиви зіставлення
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]
крок 3: Формуйте клавіші сортування
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
крок 4: Порівняйте клавіші сортування: Другого значення достатньо, щоб сортувати їх усі, і воно насправді вже в порядку зростання, тому остаточний порядок дійсно:
eA
éB
ëC
èD
êE
ēF
Оновлення : додавання третього випадку Соломона Руцкого, який складніший через простір, який дозволяє нові правила (я вибрав "неігнорований випадок"):
крок 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
крок 2, Створіть масиви зіставлення:
è 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]
крок 3, Формуйте клавіші сортування:
è 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
крок 4, порівняйте клавіші сортування:
В основному третє значення визначає порядок, і воно насправді базується лише на останній цифрі, тому порядок повинен бути:
è 1
e 2
ē 3
é 4
ê 5
ë 6
Друге оновлення на основі коментаря Соломона Руцького щодо версій Unicode.
Я використовував allkeys.txt
дані про останню версію Unicode в цей час, тобто версію 10.0
Якщо нам потрібно брати до уваги Unicode 5.1 , це буде:
http://www.unicode.org/Public/UCA/5.1.0/allkeys.txt
Я щойно перевірив, чи для всіх символів вище вказані масиви порівняння:
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]
і:
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]
і:
è 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]
які потім обчислюють наступні клавіші сортування:
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
і:
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
і:
è 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
що знову дає ці три сортовані результати:
e
é
è
ê
ë
ē
і
eA
éB
ëC
èD
êE
ēF
і
è 1
e 2
ē 3
é 4
ê 5
ë 6
VARCHAR
(тобто не Unicode), які тут не використовуються. Ось чомуē
персонаж працює просто чудово. 2) Інформація про "графіки порівняння" трохи застаріла. Це для попередньої версії цього зібрання, і вони нічого не публікували з 2009 року. 3) Версія Unicode тут, безумовно, не сама остання (версія 10)._100_
Серія Параметри сортування прийшов з SQL 2008, так що це буде Unicode 5,0 або 5,1: unicode.org/standard/versions/#TUS_Earlier_Versions