ฉันควรเลือกชุดเปรียบเทียบใดสำหรับเว็บไซต์ภาษา muiti


25

การเปรียบเทียบมีผลกับความเร็วการสืบค้นหรือไม่? ขนาดของตารางเปลี่ยนไปตามการเปรียบเทียบหรือไม่?

หากฉันต้องการสร้างเว็บไซต์ที่ต้องรองรับภาษาที่เป็นไปได้ทั้งหมด (ลองทำเช่น Google) ซึ่งจะเป็นการเปรียบเทียบที่แนะนำหรือไม่

ฉันจะต้องเก็บตัวอักษรเช่น日本語การค้นหาของฉันในเว็บไซต์จะต้องส่งคืนsomethingค่าsóméthíngอินพุตนั้นจะต้องตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

ฉันจะรู้ได้อย่างไรว่าทางเลือกใดที่ดีที่สุด? การเปรียบเทียบชุดไหนที่เหมาะกับกรณีนี้มากที่สุด


4
คุณอาจต้องการที่จะเรียบเรียงคำถามใหม่เพื่อที่ว่ามันจะไม่ได้ฟังอัตนัย - การเรียง "ที่ดีที่สุด" โดยการวัดอะไร? :)
TML

ชื่อใหม่อ่านดีขึ้นมาก
TML

คำตอบ:


16

โดยทั่วไปแล้วหนึ่งในตัวแปร Unicode น่าจะดีที่สุดสำหรับการสนับสนุนภาษาแบบกว้าง UTF-8 กำลังใช้หน่วยความจำน้อยกว่า codepoint ต่อหนึ่งหน่วยดังนั้นจึงมีข้อได้เปรียบเล็กน้อยในการแลกเปลี่ยนพื้นที่ / เวลาที่คุณต้องการ อย่างไรก็ตามฉันคิดว่ามีภาษา / สคริปต์ลึกลับมากกว่าที่ UTF-8 ไม่สามารถแสดงได้ (แต่ฉันไม่แน่ใจ 100% ในเรื่องนั้นฉันยังไม่ได้ทำการศึกษาอย่างละเอียดในเรื่องนี้)

บทความ Wikipedia นี้อาจ enlightening ใน dis / ประโยชน์ของแต่ละ


ใช่ UTF-8 สามารถจัดการกับจุดโค้ด Unicode ได้ 1.1 ล้านจุด
vz0

ขอบคุณ - ฉันคิดว่ามีตัวละครฮันบางตัวหรือไม่ชอบที่ไม่รองรับใน UTF-8 ดีที่มีคำตอบที่ดี
TML


8

ฉันคิดว่าคำถามตามที่ระบุไว้ (เมื่อวันที่ 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) == 3838> 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 เช่นเคยศึกษาเอกสารประกอบกับระบบฐานข้อมูลเฉพาะของคุณ

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