この質問はデータベースとはあまり関係がありませんが、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つの文字だけに依存することはできないことを説明するセクション1.3「コンテキスト依存」をご覧ください。
1.8の次の点にも注意してください。
照合は文字列のプロパティではありません。一般に、連結またはサブストリング操作では照合順序は保持されません。
デフォルトでは、アルゴリズムは完全にカスタマイズ可能な3つのレベルを使用します。ラテン文字の場合、これらのレベルはおおよそ次のものに対応します。
alphabetic ordering
diacritic ordering
case ordering.
しかし、アルゴリズム自体は少し高密度です。その要点は次のとおりです。簡単に言えば、Unicode照合アルゴリズムは、入力Unicode文字列と、文字のマッピングデータを含む照合要素テーブルを受け取ります。ソートキーを生成します。これは、符号なし16ビット整数の配列です。このように生成された2つ以上のソートキーをバイナリ比較して、生成された文字列間の正しい比較を行うことができます。
特定のラテン語の並べ替え規則
については、http://developer.mimer.com/collations/charts/latin.htmをご覧ください。MSSQLの場合、具体的にはhttp://collation-charts.org/mssql/mssqlをご覧
ください。 0409.1252.Latin1_General_CS_AS.html
以下のためe
の文字には示しています。
e EéÉèèêÊëË
これはcol1
、コードページ1252にēが存在しないことを除いて、注文時の結果を説明しています。
または、http://www.unicode.org/Public/UCA/latest/allkeys.txtのDUCETのキー値を使用して、Unicodeアルゴリズムを手動で実行する場合:
ステップ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、ソートキーの比較(各値を1つずつ単純なバイナリ比較):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:ソートキーの比較:2番目の値はすべてをソートするのに十分であり、実際にはすでに昇順であるため、実際の最終順序は次のとおりです。
eA
éB
ëC
èD
êE
ēF
更新:ソロモンラッツキーの3番目のケースを追加します。これは、新しいルールを有効にするスペースがあるために複雑です(「無視できないケース」を選択しました)。
ステップ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、ソートキーの比較:
基本的に3番目の値は順序を決定し、実際には最後の桁のみに基づいているため、順序は次のようになります。
è 1
e 2
ē 3
é 4
ê 5
ë 6
Unicodeバージョンに関するSolomon Rutzkyのコメントに基づく2番目の更新。
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
この場合も、次の3つの並べ替えられた結果が得られます。
e
é
è
ê
ë
ē
そして
eA
éB
ëC
èD
êE
ēF
そして
è 1
e 2
ē 3
é 4
ê 5
ë 6
VARCHAR
ここでは使用されていない(非Unicode)データ用です。そのため、ē
キャラクターは問題なく動作します。2)「照合チャート」情報は少し時代遅れです。これはこの照合の前バージョン用であり、2009年以降何も投稿していません。3)ここのUnicodeバージョンは間違いなく最新のものではありません(バージョン10)。_100_
これは、Unicode 5.0または5.1になるように、一連の照合順序は、SQL 2008に付属している:unicode.org/standard/versions/#TUS_Earlier_Versions