ฉันคิดว่าคำถามตามที่ระบุไว้ (เมื่อวันที่ 2015-04-25, "การเปรียบเทียบที่ [... ]") ไม่ใช่สิ่งที่มีความหมายเนื่องจากคำตอบที่ได้รับการยอมรับพูดถึงการเข้ารหัสมากกว่าการเปรียบเทียบ ให้ฉันตอบคำถามที่ระบุไว้ไม่ใช่คำถามที่ตั้งใจไว้เพียงเพราะฉันคิดว่ามันน่าสนใจ :-)
Wikipedia กล่าวว่า "Collation คือการรวมข้อมูลที่เป็นลายลักษณ์อักษรไว้ในคำสั่งมาตรฐาน" ในการคำนวณการเปรียบเทียบมีความหมายของ "ข้อกำหนดของคำสั่ง" กล่าวอีกนัยหนึ่งการเปรียบเทียบคือ (หรือนัย) ความหมายของฟังก์ชั่นการเปรียบเทียบสามทาง
ฉันคิดว่าคำตอบสั้น ๆ คือ "อาจจะแน่นอน" อย่างน้อยฉันก็รู้ถึงสิ่งต่าง ๆ เหล่านี้:
#!/usr/bin/python
name = u"Jonas K\xf6lker" # \xf6 is o-umlaut
enc = name.encode('utf-8')
assert len(name) == 12 # \xf6 is one character
assert len(enc) == 13 # but two bytes in utf-8
import locale
locale.setlocale(locale.LC_COLLATE, "da_DK.utf8") # works on my machine
long_form = locale.strxfrm(enc)
assert len(long_form) == 38
locale.strxfrm
เป็นฟังก์ชั่นซึ่งReturns a string that behaves for cmp locale-aware
ก็คือมันจะเข้ารหัสสตริงที่การเปรียบเทียบมาตรฐานพจนานุกรมแบบไบต์ต่อไบต์กับสตริงอื่นที่เข้ารหัสในทำนองเดียวกันจะสร้างผลลัพธ์เดียวกันกับการเปรียบเทียบสตริงตามฟังก์ชั่นการเรียงที่ระบุโดยสถานที่เกิดเหตุ
ข้อสังเกตบางอย่าง: ในda_DK.utf8
, สตริงouüö
จะถูกจัดเรียง ในde_DE.utf8
สตริงoöuü
จะถูกเรียงลำดับ หมายเหตุที่len(long_form) == 38
38> 13. (ความยาวยังเป็น 38 de_DE.utf8
.)
หากฐานข้อมูลของคุณมีดัชนีในบางฟิลด์สตริงเรียงตามda_DK.utf8
มันอาจจะทำสิ่งstrxfrm
ภายในเพื่อให้มีการเปรียบเทียบง่าย (ในทางกลับกันดิสก์จะช้ามันอาจจะเร็วกว่าในการสร้างดัชนีจากการเป็นตัวแทนที่กะทัดรัดกว่าถ้าต้นทุนการเปรียบเทียบต่ออักขระที่สูงกว่านั้นถูกชดเชยมากกว่าโดยการเปรียบเทียบอักขระที่น้อยลง)
คุณถามว่า "การเปรียบเทียบมีอิทธิพลต่อความเร็วการสืบค้นหรือไม่" ซึ่งฉันค่อนข้างแน่ใจว่าคำตอบคือใช่: การเปรียบเทียบ "C" (หรือที่รู้จักว่า "POSIX") เป็นเพียงการเปรียบเทียบค่าจุดโค้ดในขณะที่ภาษาเดนมาร์ก ( da_DK.utf8
) และสถานที่เยอรมัน ( de_DE.utf8
) ทำสิ่งที่ยุ่งยากมากขึ้น นี้จะมีบางอย่างที่ส่งผลกระทบต่อความเร็วแบบสอบถาม แต่ผมสงสัยว่ามันจะไม่เป็นมูลค่าประมาณกังวล
"ขนาดของตารางเปลี่ยนไปตามการเปรียบเทียบหรือไม่" - ฉันสามารถจินตนาการว่ามีดัชนีตามการเปรียบเทียบหนึ่งและดัชนีที่แตกต่างกันตามการเปรียบเทียบอื่นหรือเพียงแค่หนึ่งในสองดัชนีดังกล่าวโดยมีการstrxfrm
แปลงที่คล้ายกันบ้าง ในสถานการณ์สมมตินั้นถ้ามีการเปรียบเทียบสองครั้งที่มีลักษณะขนาดต่างกันคำตอบคือใช่
"การเปรียบเทียบที่แนะนำคืออะไร" - ขึ้นอยู่กับสาเหตุที่คุณต้องเรียงลำดับสตริง ถ้ามันเท่านั้นที่จะมีบางวิธีที่เป็นที่ยอมรับในการสั่งซื้อสตริงผมอาจจะไปกับ "C" ถ้ามันจะนำเสนอข้อมูลให้กับผู้ใช้ในการเรียงลำดับตามความคาดหวังของมนุษย์และความคาดหวังเหล่านั้นถูกสร้างขึ้นตามวัฒนธรรมของพวกเขาและคุณต้องการฐานข้อมูล (และไม่ใช่เลเยอร์อื่น ๆ ) ทำการเรียงลำดับบางทีคุณควรสร้างดัชนีหนึ่งรายการ คืออย่างน้อยหนึ่งตัวอ้างอิงda_DK.utf8
จากชาวเดนมาร์กและอีกคนหนึ่งอ้างอิงกับde_DE.utf8
ชาวเยอรมัน ฉันคิดว่านี่อาจจะค่อนข้างใหญ่เร็วพอสมควร
ทั้งหมดนี้ขึ้นอยู่กับการทำงานภายในของฐานข้อมูลของคุณเป็นอย่างมาก ฉันคิดว่ามันไปได้ดีกว่า "มาตรฐาน" (lol!) SQL เช่นเคยศึกษาเอกสารประกอบกับระบบฐานข้อมูลเฉพาะของคุณ