Câu hỏi này không liên quan đến cơ sở dữ liệu mà nhiều hơn về quy tắc và xử lý Unicode.
Dựa trên https://docs.microsoft.com/en-us/sql/t-sql/statements/windows-collation-name-transact-sql Latin1_General_100_CS_AS có nghĩa là: "Collation sử dụng quy tắc sắp xếp từ điển chung của Latin1 và bản đồ 1252 "có thêm CS = Case Sensitive và AS = Accent Sensitive.
Ánh xạ giữa trang mã Windows 1252 và Unicode ( http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT ) hiển thị cùng các giá trị cho tất cả các ký tự chúng ta đang xử lý (ngoại trừ e với macron điều đó không tồn tại trong bản đồ của Microsoft, vì vậy không biết nó làm gì với trường hợp này), vì vậy chúng ta có thể tập trung vào các công cụ và thuật ngữ Unicode ngay bây giờ.
Trước tiên, hãy cho chúng tôi biết chính xác những gì chúng tôi đang xử lý, cho tất cả các chuỗi của bạn:
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
Thuật toán đối chiếu Unicode được mô tả tại đây: https://www.unicode.org/reports/tr10/
Hãy xem phần 1.3 "Độ nhạy theo ngữ cảnh" giải thích rằng việc sắp xếp không thể phụ thuộc vào chỉ một ký tự sau khi một số quy tắc nhạy cảm theo ngữ cảnh.
Cũng lưu ý những điểm này trong 1.8:
Đối chiếu không phải là một thuộc tính của chuỗi. Thứ tự đối chiếu không được bảo toàn trong các hoạt động nối hoặc chuỗi con, nói chung.
Theo mặc định, thuật toán sử dụng ba cấp độ tùy biến hoàn toàn. Đối với tập lệnh Latin, các mức này tương ứng với:
alphabetic ordering
diacritic ordering
case ordering.
Nhưng thuật toán tự nó là một chút dày đặc. Ý chính của nó là: Nói ngắn gọn, Thuật toán đối chiếu Unicode lấy một chuỗi Unicode đầu vào và Bảng thành phần đối chiếu, chứa dữ liệu ánh xạ cho các ký tự. Nó tạo ra một khóa sắp xếp, là một mảng các số nguyên 16 bit không dấu. Hai hoặc nhiều khóa sắp xếp được tạo ra sau đó có thể được so sánh nhị phân để so sánh chính xác giữa các chuỗi mà chúng được tạo.
Bạn có thể xem các quy tắc sắp xếp tiếng Latin cụ thể tại đây: http://developer.mimer.com/collations/charts/latin.htm
hoặc trực tiếp hơn và cụ thể hơn cho MS SQL:
http://collation-charts.org/mssql/mssql. 0409.1252.Latin1_General_CS_AS.html
Đối với e
nhân vật nó thể hiện:
e é É è È ê Ê ë
Điều này giải thích kết quả của bạn khi đặt hàng col1
ngoại trừ ē không tồn tại trong trang mã 1252, vì vậy tôi hoàn toàn không biết nó làm gì với nó.
Hoặc nếu chúng tôi thực hiện thuật toán Unicode bằng tay, sử dụng giá trị khóa của DUCET tại http://www.unicode.org/Public/UCA/latest/allkeys.txt :
Bước 1: Chuẩn hóa mẫu D, vì vậy mỗi trường hợp trở thành:
e => U+0065
é => U+0065 U+0301
ë => U+0065 U+0308
è => U+0065 U+0300
ê => U+0065 U+0302
ē => U+0065 U+0304
Bước 2, Tạo mảng đối chiếu (tra cứu trong tệp 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]
Bước 3, Tạo các khóa sắp xếp (cho mỗi cấp độ, lấy từng giá trị bên trong mỗi mảng đối chiếu, sau đó đặt 0000 làm dấu phân cách và bắt đầu lại cho cấp độ tiếp theo)
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
Bước 4, So sánh các khóa sắp xếp (so sánh nhị phân đơn giản của từng giá trị một): Giá trị thứ tư là đủ để sắp xếp tất cả chúng, vì vậy thứ tự cuối cùng trở thành:
e
é
è
ê
ë
ē
Theo cách tương tự để đặt hàng trên col2
:
bước 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
Bước 2: Mảng đối chiếu
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]
Bước 3: Tạo các phím sắp xếp
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
Bước 4: So sánh các khóa sắp xếp: Giá trị thứ hai là đủ để sắp xếp tất cả chúng, và thực tế nó đã theo thứ tự tăng dần, vì vậy thứ tự cuối cùng thực sự là:
eA
éB
ëC
èD
êE
ēF
Cập nhật : thêm trường hợp thứ ba của Solomon Rutzky, khó khăn hơn vì không gian cho phép các quy tắc mới (tôi đã chọn "trường hợp không thể bỏ qua"):
bước 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
Bước 2, Tạo mảng đối chiếu:
è 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]
Bước 3, Phím sắp xếp biểu mẫu:
è 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
Bước 4, So sánh các phím sắp xếp:
Về cơ bản giá trị thứ ba xác định thứ tự và trên thực tế nó chỉ dựa trên chữ số cuối cùng, vì vậy thứ tự phải là:
è 1
e 2
ē 3
é 4
ê 5
ë 6
Cập nhật thứ hai dựa trên nhận xét của Solomon Rutzky về các phiên bản Unicode.
Tôi đã sử dụng allkeys.txt
dữ liệu về phiên bản Unicode mới nhất tại thời điểm này, đó là phiên bản 10.0
Thay vào đó, nếu chúng ta cần đưa vào tài khoản Unicode 5.1 , đây sẽ là:
http://www.unicode.org/Public/UCA/5.1.0/allkeys.txt
Tôi chỉ kiểm tra, đối với tất cả các ký tự ở trên, các mảng đối chiếu là như sau:
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]
và:
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]
và:
è 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]
mà sau đó tính toán với các phím sắp xếp sau:
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
và:
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
và:
è 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
một lần nữa cho ba kết quả được sắp xếp sau:
e
é
è
ê
ë
ē
và
eA
éB
ëC
èD
êE
ēF
và
è 1
e 2
ē 3
é 4
ê 5
ë 6
VARCHAR
dữ liệu (không phải là Unicode), không được sử dụng ở đây. Đó là lý do tại saoē
nhân vật hoạt động tốt. 2) Thông tin "biểu đồ đối chiếu" hơi lỗi thời. Đây là phiên bản trước của Collation này và họ chưa đăng bất cứ thứ gì kể từ năm 2009. 3) Phiên bản Unicode ở đây chắc chắn không phải là phiên bản mới nhất (Phiên bản 10). Các_100_
loạt Collations đi kèm với SQL 2008, vì vậy đây sẽ là Unicode 5.0 hoặc 5.1: unicode.org/standard/versions/#TUS_Earlier_Versions