ความแตกต่างระหว่างการเปรียบเทียบและชุดอักขระคืออะไร?


24

ฉันมีคำถามทั่วไปเกี่ยวกับฐานข้อมูล เรามักจะใช้คำเปรียบเทียบกับฐานข้อมูล ฉันอยากจะรู้ว่ามันแตกต่างจากชุดตัวละครอย่างไร ฉันเดาว่า collation เป็นเซตย่อยของชุดตัวละคร หากเป็นจริงวัตถุประสงค์ในการเปรียบเทียบหลายครั้งภายใต้ชุดอักขระคืออะไร


นอกจากนี้อ้างถึงstackoverflow.com/questions/341273/…
Sanghyun Lee

คำตอบ:


27

ชุดตัวละครเป็นรายการสัญลักษณ์ หากคุณเปรียบเทียบASCIIกับlatin1กับlatin1คุณจะสามารถเขียนคำอเมริกันทั้งหมดได้เนื่องจากlatin1มีอักขระ ASCIIทั้งหมดซึ่งเพียงพอที่จะเขียนคำภาษาอังกฤษใด ๆ ในทางตรงกันข้ามกับASCIIคุณจะไม่สามารถเขียนคำทั้งหมดของภาษาเฉพาะของยุโรปตะวันตกได้เพราะตัวอย่างเช่นตัวอักษร 'À', 'ë', 'õ', 'Ñ' หายไป

การจัดเรียงเป็นเรื่องเกี่ยวกับการเปรียบเทียบระหว่างตัวละคร มันกำหนดชุดของกฎเพื่อเปรียบเทียบอักขระของชุดอักขระ

ใน MySQL การเปรียบเทียบมักเกี่ยวข้องกับหนึ่งภาษา (เช่น 'latin1_swedish_ci', 'latin1_german1_ci' เป็นต้น) เมื่อคุณเรียงลำดับข้อความค้นหาที่เลือกคำที่เริ่มต้นด้วย 'ö' จะอยู่ระหว่างคำสองคำที่ขึ้นต้นด้วย 'o' และ 'p' ในบางภาษา (มีการเรียงบาง) แต่ด้วยการเปรียบเทียบอื่นตัวละครนี้อาจถูกวางไว้อย่างสมบูรณ์ในตอนท้ายซึ่งทำให้การเลือกผลลัพธ์แตกต่างกัน


ขอบคุณมันเกือบจะชัดเจนแล้ว ดังนั้นฉันคิดว่าการเลือกการเปรียบเทียบเป็นข้อกังวลอย่างจริงจังขณะวางแผนไซต์หลายภาษา ตัวอย่างเช่นหากการเรียงเป็น 'latin1_swedish_ci' ฉันจะไม่ได้รับผลลัพธ์ที่คาดหวังในขณะที่จัดการกับภาษา unicode
Shameer

1
ฉันขอแนะนำให้คุณไป unicode หรือคุณจะมีปัญหาในบางจุด (ภาษา asiatics สำหรับตัวอย่าง) การเรียงจะขึ้นอยู่กับภาษาของผู้ใช้ นี่คือสิ่งที่คุณต้องระวังหากคุณต้องการเครื่องมือพูดได้หลายภาษา
deadalnix

6

ตามคำตอบก่อนหน้าชุดอักขระคือชุดของอักขระ (ตัวอักษรตัวเลขอุดมคติเป็นต้น) ที่กำหนดให้กับตัวเลข เพื่อให้สามารถดูได้คุณต้องมีแบบอักษร ("รูปภาพ" เล็ก ๆ ที่เราอ่าน) พวกเขามีความสำคัญในการใช้ LatinX เพราะสำหรับแต่ละ X หมายเลขเดียวกัน (ไบต์) สามารถอ้างถึงอักขระอื่น

ทุกวันนี้การเลือกการเข้ารหัสมีความสำคัญมากกว่า: มาตรฐานคือ UTF-8 ซึ่งเป็นตัวแทนที่ประสบความสำเร็จมากที่สุดของ Unicode (เข้ากันได้กับ ASCII แต่มีความยืดหยุ่นในการรวมทุกภาษาแม้แต่จีนและญี่ปุ่น) และมาตรฐาน W3C มันรวมชุดอักขระทั้งหมด

การเรียงหน้า: เป็นคำโบราณที่มาจากภาษาละติน หมายความว่า: เปรียบเทียบสำเนา (ต้นฉบับ) กับต้นฉบับเพื่อค้นหาความแตกต่าง (ข้อผิดพลาดหรือการเปลี่ยนแปลง) มันมีประโยชน์มากในอดีต แต่ตอนนี้มันเกือบจะเป็นโบราณวัตถุเพราะเอกสารและหนังสือของเราเขียนโดยใช้คอมพิวเตอร์และสำเนามักจะเหมือนกับต้นฉบับเสมอ ตัวอย่าง: ในอิตาลี (มาจากละติน) มีคำกริยา "collazionare" แต่มันอยู่ในพจนานุกรมและไม่มีใครใช้มัน

ดังนั้นการเปรียบเทียบจะกำหนดพฤติกรรมของตัวดำเนินการเปรียบเทียบ: =,>, <, <=,> = ...

แน่นอนว่าโอเปอเรเตอร์เหล่านั้นถูกใช้เพื่อตัดสินใจว่าสองสายเหมือนกันหรือถ้าคำว่า "มากกว่า" อีกคำหนึ่งสำคัญมากถ้าเราต้องการเรียงลำดับ ตัวอักษรไม่อยู่ในลำดับเดียวกันสำหรับทุกภาษาดังนั้นคำอาจมากกว่าหนึ่งอีกคำหนึ่งโดยใช้การเรียงหน้า แต่ไม่ใช้อีกตัว ดู [1] สำหรับตัวอย่างที่ใช้งานได้จริง

  • การเรียง "bin" นั้นเข้มงวดมากที่สุด: SELECT "b" = "B" => FALSE

  • การเปรียบเทียบ "ci" ไม่คำนึงถึงขนาดตัวพิมพ์: เลือก "b" = "B" => TRUE

  • "ทั่วไป" มักจะมองข้ามความแตกต่าง: SELECT "a" = "à" => TRUE

  • อื่น ๆ มีความเฉพาะสำหรับหนึ่งภาษาขึ้นไป ตัวอย่าง "สวีดิช" (ฉันไม่รู้ว่าทำไมชาวสวีดิชมักเป็นค่าเริ่มต้น)

ฉันยังคงค้นหาเว็บไซต์ที่อธิบายพฤติกรรมของการเปรียบเทียบทุกครั้งโดยละเอียด ... ตัวอย่างเหล่านั้นเกิดจากประสบการณ์ของฉัน

[1] http://www.olcot.co.uk/sql-blogs/revised-difference-between-collation-sql_latin1_general_cp1_ci_as-and-latin1_general_ci_as


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