Collation หมายถึงอะไร?


139

Collation หมายถึงอะไรใน SQL และทำอะไร?


2
@gbn: บังเอิญการเปรียบเทียบทำงานในลักษณะที่คล้ายกันมากทั้งใน MSSQL และ MySQL
Piskvor ออกจากอาคาร


@Piskvor: ยกเว้นตัวเลือกการเปรียบเทียบ mySql บางตัว (เช่น UTF8) ไม่มีใน MSSQL: msdn.microsoft.com/en-us/library/ms144250.aspx
CB

@CB: ไม่ปฏิเสธว่า; ความคล้ายคลึงกันนั้นลึกกว่าชุดอักขระที่รองรับ (un)
Piskvor ออกจากอาคาร

คำตอบ:


60

การเรียงลำดับสามารถคิดได้ง่ายๆว่าเป็นการเรียงลำดับ

ในภาษาอังกฤษ (และเป็นลูกพี่ลูกน้องแปลก ๆ อเมริกัน) การเรียงลำดับอาจเป็นเรื่องง่ายๆที่ประกอบด้วยการเรียงลำดับตามรหัสแอสกี

เมื่อคุณเข้าสู่ภาษายุโรปแปลก ๆ ที่มีสำเนียงและคุณสมบัติอื่น ๆ ทั้งหมดแล้วการเรียงจะเปลี่ยนไป ตัวอย่างเช่นแม้ว่ารูปแบบการเน้นเสียงที่แตกต่างกันaอาจมีอยู่ในจุดรหัสที่แตกต่างกัน แต่ก็อาจต้องเรียงลำดับเหมือนกันว่าเป็นตัวอักษรเดียวกัน


4
สำเนียงที่แตกต่างกันมักจะหมายความว่าพวกเขาจะต้องมีการเรียงราวกับว่าพวกเขาแตกต่างกันตัวอักษร - เช่นe, ë, é, ěและè อาจจะเป็นตัวอักษรที่แตกต่างกันเพื่อวัตถุประสงค์ในการสั่งซื้อ ( แต่อาจจะเป็นจดหมายฉบับเดียวกันเมื่อค้นหาแช่งยุโรปบ้า;))
Piskvor ออกจากอาคาร

1
@Piskvor: ไม่ได้ระบุพิกัดในข้อมูลของคุณที่ชี้ไปยังประเทศใดประเทศหนึ่งโดยใช้ตัวอักษรที่มี42ตัวอักษร15พวกเขามีเครื่องหมายกำกับหรือไม่?
Quassnoi

4
@Quassnoi: ใช่แล้วและ? ฉันบอกเป็นนัย ๆ ว่าฉันไม่ได้บ้าเหรอ? ; o) (แม้ว่าจะขอบคุณพระเจ้าสำหรับ Unicode แต่ฉันจะคลั่งไคล้อย่างสิ้นเชิงถ้าฉันยังต้องทำงานกับชุด
อักขระ

3
@Piskvor: ขอโทษขอโทษคุณบ้าไปแล้ว! :)
Quassnoi

เป็นเพียงการจัดเรียงหรือเพื่อwhere st= 'aaa'?
Royi Namir

42

นอกจาก "ตัวอักษรที่เน้นเสียงจะเรียงต่างจากอักษรที่ไม่มีสำเนียง" ในภาษายุโรปตะวันตกบางภาษาแล้วคุณยังต้องคำนึงถึงกลุ่มของตัวอักษรซึ่งบางครั้งจะเรียงต่างกันด้วย

ตามเนื้อผ้าในภาษาสเปน "ch" ถือเป็นตัวอักษรที่ถูกต้องเช่นเดียวกับ "ll" (ซึ่งทั้งสองตัวแสดงถึงหน่วยเสียงเดียว) ดังนั้นรายการจะได้รับการจัดเรียงดังนี้:

  • คาบาโล
  • cinco
  • โคเช
  • ถ่าน
  • ช็อคโกแลต
  • ชูเอโก
  • ดาโด
  • (... )
  • ลัมปารา
  • ลูโก
  • Llanta
  • ลูเวีย
  • Madera

แจ้งให้ทราบล่วงหน้าทุกคำที่ขึ้นต้นด้วยซิงเกิ้ลไปด้วยกันยกเว้นคำที่ขึ้นต้นด้วยCHที่ไปหลังจากที่พวกเขาเหมือนกันกับLL -starting คำที่ไปหลังจากที่ทุกคำที่ขึ้นต้นด้วยซิงเกิ้ลต่อลิตร นี่คือลำดับที่คุณจะเห็นในพจนานุกรมและสารานุกรมเก่าบางครั้งแม้กระทั่งในปัจจุบันโดยองค์กรที่อนุรักษ์นิยม

Royal Academy of the Language ได้เปลี่ยนแปลงสิ่งนี้เพื่อให้ภาษาสเปนเข้ามาอยู่ในโลกแห่งคอมพิวเตอร์ได้ง่ายขึ้น อย่างไรก็ตามñถือว่ายังคงเป็นตัวอักษรที่แตกต่างกันกว่าnและไปหลังจากนั้นและก่อนo นี่คือรายการสั่งซื้อที่ถูกต้อง:

  • นามิเบีย
  • นูเมโร
  • ñandú
  • ñú
  • obra
  • ojo

เมื่อเลือกการเปรียบเทียบที่ถูกต้องคุณจะทำสิ่งนี้ให้คุณโดยอัตโนมัติ :-)


ตกลงดังนั้นการเปรียบเทียบจึงมีประโยชน์มากสำหรับการเรียงลำดับที่ถูกต้อง แต่ยังมีประโยชน์สำหรับการเปรียบเทียบหรือไม่? เช่นฉันต้องการให้ 'ñandú' และ 'nandu' มีค่าเท่ากันด้วยเหตุผลในทางปฏิบัติ ... กลไกการจัดเรียงจะช่วยฉันในงานนี้ได้หรือไม่?
CB

@CB: หากคุณหมายถึงบางอย่างเช่นการเลือกแถวทั้งหมดที่ค่าของคอลัมน์เท่ากับ 'Aéreo' และ SQL S. จะส่งคืนแถวด้วย 'aereo', 'aereó', 'AerEO' และอื่น ๆ - ใช่การตั้งค่าการเรียงเฉพาะสำหรับ a แบบสอบถามสามารถทำได้ คุณจะมีปัญหาด้านประสิทธิภาพหากการเปรียบเทียบนี้แตกต่างจากเนทีฟของฐานข้อมูลมาก และถ้าคุณใช้ตารางชั่วคราวคุณต้องติดตามการจัดเรียงของ tempdb ด้วย ... แต่คุณสามารถทำได้
Joe Pineda

ในกรณีนี้โปรดอธิบายเพิ่มเติมอีกเล็กน้อยได้ไหม โดยเฉพาะอย่างยิ่งการสืบค้นที่ตรงไปตรงมา "คำที่เลือกจากการทดสอบคำที่ชอบ 'nandu'" จะสามารถทำได้หรือไม่ และควรใช้การจัดเรียงแบบใดเพื่อให้ได้ผล (โปรดทราบว่าฉันกังวลเกี่ยวกับเครื่องหมายกำกับเสียงไม่ใช่แค่สำเนียง ... )
CB

2
@CB ดูส่วน 'AI' หรือ 'AS' ของการเปรียบเทียบ (เน้นเสียงไม่ไวและเน้นเสียง)
Dustin Kendall

14

กฎที่บอกวิธีเปรียบเทียบและจัดเรียงสตริง: ลำดับตัวอักษร; ไม่ว่าจะเป็นกรณีสำคัญหรือไม่ว่าจะเป็นเรื่องการกำกับเสียงเป็นต้น

ตัวอย่างเช่นหากคุณต้องการให้ตัวอักษรทั้งหมดแตกต่างกัน (เช่นถ้าคุณเก็บชื่อไฟล์ไว้UNIX) คุณจะใช้การUTF8_BINเรียง:

SELECT  'A' COLLATE UTF8_BIN = 'a' COLLATE UTF8_BIN

---
0

หากคุณต้องการละเว้นความแตกต่างของตัวพิมพ์และตัวกำกับเสียง (เช่นสำหรับเครื่องมือค้นหา) คุณใช้การUTF8_GENERAL_CIเปรียบเทียบ:

SELECT  'A' COLLATE UTF8_GENERAL_CI = 'ä' COLLATE UTF8_GENERAL_CI

---
1

ดังที่คุณเห็นการเปรียบเทียบนี้ (กฎการเปรียบเทียบ) จะพิจารณาตัวพิมพ์ใหญ่Aและลดขนาดäตัวอักษรเดียวกันโดยไม่สนใจความแตกต่างของตัวพิมพ์และตัวกำกับเสียง


เพียงเพื่อทราบ: ชุดอักขระ utf8mb3 เลิกใช้งานแล้วและคุณควรคาดหวังว่าจะถูกลบออกในรุ่น MySQL ในอนาคต โปรดใช้ utf8mb4 แทน แม้ว่าปัจจุบัน utf8 จะเป็นนามแฝงของ utf8mb3แต่ในบางจุด utf8 คาดว่าจะกลายเป็นข้อมูลอ้างอิงถึง utf8mb4 เพื่อหลีกเลี่ยงความคลุมเครือเกี่ยวกับความหมายของ utf8 ให้พิจารณาระบุ utf8mb4 อย่างชัดเจนสำหรับการอ้างอิงชุดอักขระแทน utf8 dev.mysql.com/doc/refman/8.0/th/charset-unicode-sets.html
Sonny D

10

การเรียงลำดับกำหนดวิธีการเรียงลำดับและเปรียบเทียบค่าสตริง

ตัวอย่างเช่นกำหนดวิธีจัดการกับ

  • สำเนียง ( äàaฯลฯ )
  • กรณี ( Aa)
  • บริบทของภาษา:
    • ในการเรียงแบบฝรั่งเศส cote < côte < coté < côté.
    • ในค่าเริ่มต้นของ SQL Server Latin1 cote < coté < côte < côté
  • ASCII เรียงลำดับ (การเปรียบเทียบแบบไบนารี)

5

การเรียงลำดับหมายถึงการกำหนดลำดับบางอย่างให้กับอักขระใน Alphabet เช่น ASCII หรือ Unicode เป็นต้น

สมมติว่าคุณมีอักขระ 3 ตัวในตัวอักษรของคุณ - {A, B, C} คุณสามารถกำหนดการจัดเรียงตัวอย่างได้โดยกำหนดค่าอินทิกรัลให้กับอักขระ

  1. ตัวอย่าง 1 = {A = 1, B = 2, C = 3}
  2. ตัวอย่าง 2 = {C = 1, B = 2, A = 3}
  3. ตัวอย่าง 3 = {B = 1, C = 2, A = 3}

ตามความเป็นจริงคุณสามารถกำหนด n! collations บนตัวอักษรขนาด n. ด้วยคำสั่งดังกล่าวรูทีนการเรียงลำดับที่แตกต่างกันเช่นประเภทสตริง LSD / MSD จะใช้ประโยชน์จากมันสำหรับการเรียงลำดับสตริง


3

การจัดเรียงจะกำหนดวิธีการจัดเรียงและเปรียบเทียบข้อมูลของคุณ บ่อยครั้งที่สำคัญมากเกี่ยวกับการทำให้เป็นสากลเช่นคุณเรียงคันจิภาษาญี่ปุ่นอย่างไร?

หากคุณใช้ google collation และ sql server คุณจะพบบทความมากมายที่พูดถึงมัน!


3

อ้างอิงมาจากบทความนี้: การเปรียบเทียบเป็นชุดของกฎสำหรับการเปรียบเทียบอักขระในชุดอักขระ นอกจากนี้ยังควบคุมการเรียงลำดับอักขระและลำดับที่เหมาะสมของอักขระสองตัวจะแตกต่างกันไปในแต่ละภาษา การเรียงลำดับเปรียบเทียบสองสตริงเช่นถ้าคำมากกว่าอีกคำหนึ่งให้เรียงลำดับตามนั้น

หากคุณใช้ชุดอักขระ“ latin1” คุณสามารถใช้การเรียงลำดับ“ latin1_swedish_ci”

คุณต้องเลือกการจัดเรียงที่ถูกต้องเนื่องจากการจัดเรียงผิดอาจส่งผลต่อประสิทธิภาพฐานข้อมูล


2

http://en.wikipedia.org/wiki/Collation

Collation คือการประกอบข้อมูลที่เป็นลายลักษณ์อักษรให้เป็นลำดับมาตรฐาน (... ) อัลกอริทึมการจัดเรียงเช่นอัลกอริทึมการเปรียบเทียบ Unicodeกำหนดลำดับผ่านกระบวนการเปรียบเทียบสตริงอักขระที่กำหนดสองสตริงและตัดสินใจว่าควรจะมาก่อนสตริงอื่น



1
บทความนี้อธิบายได้ทั้งหมดจริงๆ
Joe Pineda

3
@ โจพีเนด้า. บางทีมันอาจจะอธิบายได้ทั้งหมด แต่ผู้อ่านต้องการที่จะรู้ทั้งหมดหรือไม่? หรือเป็นไปได้หรือไม่ที่ผู้อ่านต้องการคำตอบที่กระชับและเชื่อถือได้ซึ่งครอบคลุมองค์ประกอบพื้นฐานและหน้าที่ของการเรียงลำดับที่ใช้บ่อยที่สุดเพื่อให้เขา / เธอสามารถอ่านได้อย่างรวดเร็วและกลับมาทำงานต่อในงานการมอบหมายหรือโครงการใด ๆ ที่ก่อให้เกิดคำถาม เริ่มด้วย?
cfwschmidt

2
@TJCrowder ขอขอบคุณที่ประชดในสิ่งนี้

1

การเปรียบเทียบเป็นวิธีที่เซิร์ฟเวอร์ SQL ตัดสินใจว่าจะเรียงลำดับและเปรียบเทียบข้อความอย่างไร

ดูMSDN

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.