Этот вопрос связан не столько с базами данных, сколько с обработкой и правилами 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: НФД
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