Pertanyaan ini tidak begitu terkait dengan database tetapi lebih pada penanganan dan aturan Unicode.
Berdasarkan https://docs.microsoft.com/en-us/sql/t-sql/statements/windows-collation-name-transact-sql Latin1_General_100_CS_AS berarti: "Collation menggunakan kamus umum Latin yang menyortir aturan dan peta ke halaman kode 1252 "dengan tambahan CS = Case Sensitive dan AS = Accent Sensitive.
Pemetaan antara kode Windows halaman 1252 dan Unicode ( http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT ) menunjukkan nilai yang sama untuk semua karakter yang kita hadapi (kecuali e dengan macron yang tidak ada dalam pemetaan Microsoft, jadi tidak tahu apa fungsinya dengan kasus ini), jadi kita dapat berkonsentrasi pada alat dan terminologi Unicode untuk saat ini.
Pertama, beri tahu kami apa yang kami hadapi, untuk semua hal:
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
Algoritma Collation Unicode dijelaskan di sini: https://www.unicode.org/reports/tr10/
Lihat bagian 1.3 "Sensitivitas Kontekstual" yang menjelaskan bahwa penyortiran tidak dapat bergantung hanya pada satu karakter setelah yang lain karena beberapa aturan sensitif terhadap konteks.
Perhatikan juga poin-poin ini di 1.8:
Collation bukan milik string. Urutan collation tidak diawetkan di bawah operasi concatenation atau substring, secara umum.
Secara default, algoritma ini menggunakan tiga level yang sepenuhnya dapat disesuaikan. Untuk skrip Latin, level-level ini secara kasar berhubungan dengan:
alphabetic ordering
diacritic ordering
case ordering.
Tetapi algoritme itu sendiri agak padat. Intinya adalah: Secara singkat dinyatakan, Algoritma Collation Unicode mengambil string Unicode input dan Tabel Elemen Collation, yang berisi data pemetaan untuk karakter. Ini menghasilkan semacam kunci, yang merupakan array bilangan bulat 16-bit yang tidak ditandatangani. Dua atau lebih kunci sortir yang dihasilkan kemudian dapat dibandingkan biner untuk memberikan perbandingan yang benar antara string yang dihasilkan.
Anda dapat melihat aturan penyortiran Latin khusus di sini: http://developer.mimer.com/collations/charts/latin.htm
atau lebih langsung dan khusus untuk MS SQL:
http://collation-charts.org/mssql/mssql. 0409.1252.Latin1_General_CS_AS.html
Untuk e
karakter yang ditampilkan:
e E é É è È ê Ê ë Ë
Ini menjelaskan hasil Anda ketika memesan, col1
kecuali bahwa ē tidak ada di halaman kode 1252, jadi saya sama sekali tidak tahu apa fungsinya.
Atau jika kita melakukan algoritma Unicode dengan tangan, menggunakan nilai kunci DUCET di http://www.unicode.org/Public/UCA/latest/allkeys.txt :
langkah 1: Normalisasi bentuk D, sehingga setiap kasus menjadi:
e => U+0065
é => U+0065 U+0301
ë => U+0065 U+0308
è => U+0065 U+0300
ê => U+0065 U+0302
ē => U+0065 U+0304
langkah 2, Menghasilkan array susunan (pencarian dalam 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]
langkah 3, Bentuk kunci sortir (untuk setiap level, ambil setiap nilai di dalam setiap susunan susunan, lalu masukkan 0000 sebagai pembatas dan mulai lagi untuk level berikutnya)
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
langkah 4, Bandingkan tombol sortir (perbandingan biner sederhana dari setiap nilai satu per satu): Nilai keempat cukup untuk mengurutkan semuanya, sehingga urutan terakhir menjadi:
e
é
è
ê
ë
ē
Dengan cara yang sama untuk memesan pada col2
:
langkah 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
langkah 2: Susunan susunan
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]
langkah 3: Formulir kunci sortir
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
langkah 4: Bandingkan tombol sortir: Nilai kedua sudah cukup untuk menyortir semuanya, dan sebenarnya sudah dalam urutan yang meningkat, sehingga urutan terakhirnya memang:
eA
éB
ëC
èD
êE
ēF
Pembaruan : menambahkan Solomon Rutzky kasus ketiga, yang lebih sulit karena ruang yang memungkinkan aturan baru (saya memilih "kasus yang tidak dapat diabaikan"):
langkah 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
langkah 2, Menghasilkan susunan susunan:
è 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]
langkah 3, Formulir kunci sortir:
è 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
langkah 4, Bandingkan tombol sortir:
Pada dasarnya nilai ketiga menentukan urutan, dan sebenarnya hanya berdasarkan pada digit terakhir, sehingga urutannya harus:
è 1
e 2
ē 3
é 4
ê 5
ë 6
Pembaruan kedua berdasarkan komentar Solomon Rutzky tentang versi Unicode.
Saya menggunakan allkeys.txt
data tentang versi Unicode terbaru saat ini, yaitu versi 10.0
Jika kita perlu mempertimbangkan Unicode 5.1 , ini akan menjadi:
http://www.unicode.org/Public/UCA/5.1.0/allkeys.txt
Saya baru saja memeriksa, untuk semua karakter di atas, susunan susunan adalah sebagai berikut:
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]
dan:
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]
dan:
è 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]
yang kemudian menghitung kunci penyortiran berikut:
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
dan:
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
dan:
è 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
yang sekali lagi memberikan tiga hasil ini:
e
é
è
ê
ë
ē
dan
eA
éB
ëC
èD
êE
ēF
dan
è 1
e 2
ē 3
é 4
ê 5
ë 6
VARCHAR
(yaitu non-Unicode) data, yang tidak digunakan di sini. Itu sebabnyaē
karakter bekerja dengan baik. 2) Info "collation-charts" agak ketinggalan jaman. Ini untuk versi sebelumnya dari Collation ini dan mereka belum memposting apapun sejak 2009. 3) Versi Unicode di sini jelas bukan yang terbaru (Versi 10). The_100_
Seri Collations datang dengan SQL 2008, jadi ini akan menjadi Unicode 5.0 atau 5.1: unicode.org/standard/versions/#TUS_Earlier_Versions