คำถามนี้ไม่เกี่ยวข้องกับฐานข้อมูล แต่เพิ่มเติมเกี่ยวกับการจัดการ 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 = Accent Sensitive
การแมประหว่างรหัส Windows หน้า 1252 และ Unicode ( http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT ) จะแสดงค่าเดียวกันสำหรับอักขระทั้งหมดที่เรากำลังจัดการกับ (ยกเว้น e กับ macron ที่ไม่มีอยู่ในการแมปของ 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: 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: อาร์เรย์ Collation
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
อัปเดต : เพิ่มโซโลมอน Rutzky กรณีที่สามซึ่งมีเล่ห์เหลี่ยมเนื่องจากพื้นที่ที่เปิดใช้งานกฎใหม่ (ฉันเลือก "กรณีที่ไม่สนใจ"):
ขั้นตอนที่ 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
อัปเดตที่สองตามความคิดเห็นของโซโลมอน 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) "การเปรียบเทียบแผนภูมิ" ข้อมูลเป็นบิตล้าสมัย มันมีไว้สำหรับ Collation รุ่นก่อนหน้านี้และพวกเขาไม่ได้โพสต์อะไรตั้งแต่ปี 2009 3) Unicode version ที่นี่ไม่ใช่รุ่นล่าสุด (เวอร์ชั่น 10)_100_
ชุด Collations มาพร้อมกับ SQL 2008 ดังนั้นนี้จะเป็น Unicode 5.0 หรือ 5.1: unicode.org/standard/versions/#TUS_Earlier_Versions