这个问题与数据库不是很相关,而更多地与Unicode处理和规则有关。
基于https://docs.microsoft.com/zh-cn/sql/t-sql/statements/windows-collation-name-transact-sql Latin1_General_100_CS_AS的意思是:“排序规则使用Latin1 General字典排序规则并将其映射到代码页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算法,请使用http://www.unicode.org/Public/UCA/latest/allkeys.txt上的DUCET键值:
步骤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步,产生排序规则数组(在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]
第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
基于Solomon Rutzky关于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