DBMS ใดมีการเปรียบเทียบที่เป็นทั้งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก


18

หมายเหตุคำถามนี้คือผู้ขาย / รุ่นที่ไม่เชื่อเรื่องพระเจ้า

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

ตามที่ฉันรำพึงใน tete-a-tete กับ Chloe the maitre d'hotel ที่ร้านอาหาร Champs-Elysees ในขณะที่รอ garcon เพื่อดึง jalapeno sateed ของฉัน ...

คุณได้รับความคิดด้วยสิ่งนั้น

ดังนั้นวันนี้ฉันคิดว่าฉันต้องการเงื่อนไขการค้นหาเพื่อใช้การเปรียบเทียบที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์เล็ก แต่เน้นเรื่องเล็ก แต่ไม่สามารถหาได้ มีเหตุผลที่ดีสำหรับสิ่งนี้หรือเป็นเพียงกรณีการใช้งานที่หายาก?


นี่คือตัวอย่างของเอกสารบางอย่างที่ฉันดู (คิดว่าผู้ขาย / รุ่นไม่เชื่อเรื่องพระเจ้า):

ชื่อเรียงเซิร์ฟเวอร์ SQL (SQL Server 2008 R2)

คำตอบ:


33

TL; DR

ไม่มีสิ่งใดในมุมมอง "ผู้ขายผู้ไม่เชื่อเรื่องพระเจ้า" ของ Collations หรือแม้แต่ "ผู้ไม่เชื่อเรื่องพระเจ้ารุ่น" เนื่องจากการใช้งานของพวกเขา - รวมถึงด้านที่สามารถทำให้ตายและแผนการตั้งชื่อของพวกเขา - เฉพาะผู้ขายและเปลี่ยนแปลงตลอดเวลา .

นี่คือบทสรุปของสิ่งที่ฉันได้พบและรายละเอียดอยู่ในส่วนที่ยาวกว่าด้านล่างบรรทัด:

RDBMS        Naming-             Combinations    Case-Sensitive and
             convention          of options?     Accent-Insensitive support?
-------      ------------        -------------   -----
SQL Server   _CS, _AI, etc       Yes             Latin1_General_100_CS_AI

DB2          _E{x}, _S{y}, etc   Yes             CLDR181_EO_S1

PostgreSQL   locale: en_US       N/A             unaccent(), not via Collation

MySQL        _cs, maybe _ai      No              No: _cs implies _as & _ci implies _ai
                                                 Yes? Create your own Collation :-)

Oracle       only _CI & _AI      No              No: _AI always implies _CI

SAP ASE      arbitrary: turdict  N/A             No: "AI" always implies "CI"

Informix     locale.codepage     N/A             No: no "AI" via Collations

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

One RDBMS - PostgreSQL - ไม่สนับสนุนชุดค่าผสมนี้ แต่คุณยังสามารถทำได้โดยการตัดสำเนียงด้วยunaccent()ฟังก์ชั่นเสริม

RDBMSs สี่อันสุดท้ายซึ่งสองอันมีหลักการตั้งชื่อที่คล้ายกันสำหรับตัวเลือกไม่สนับสนุนการรวมกันนี้โดยธรรมชาติหรือมีวิธีการทำสิ่งนี้ให้สำเร็จโดยไม่ต้องเขียนฟังก์ชันของคุณเองเพื่อลบเครื่องหมายเน้นเสียง / การออกเสียง MySQL อนุญาตให้สร้าง Collations ของคุณเอง แต่คุณต้องเพิ่มมันเข้าไปในการควบคุมซอร์สและรวมเข้ากับกระบวนการทดสอบและการปรับใช้เพื่อให้สามารถใช้กับเซิร์ฟเวอร์ทั้งหมดในทุกสภาพแวดล้อม (แต่ก็ยังเป็นตัวเลือกที่เจ๋งและยืดหยุ่นมาก) . SAP ASE กล่าวว่า SAP สามารถจัดหาคำสั่งการเรียงลำดับ Unicode เพิ่มเติม แต่ไม่พูดถึงสิ่งที่พวกเขาอาจเต็มใจที่จะจัดหา

เกี่ยวกับ:

มีเหตุผลที่ดีสำหรับสิ่งนี้หรือเป็นเพียงกรณีการใช้งานที่หายาก?

ฉันสามารถพูดได้ว่าในการทำวิจัยสำหรับคำตอบนี้ฉันเจอผู้คนจำนวนมากที่ต้องการตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ - เล็กสำหรับ MySQL แต่มีน้อยคนที่ถามหาชุดค่าผสมที่คุณต้องการ


ฉันต้องการเงื่อนไขการค้นหาที่จะใช้การเปรียบเทียบที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่ไม่เน้นเสียง แต่ไม่สามารถหาได้
...
คำถามนี้คือผู้ขาย / รุ่นที่ไม่เชื่อเรื่องพระเจ้า

คุณไม่ประสบความสำเร็จในการค้นหาของคุณเพราะไม่เหมาะสมที่จะมองหา RDBMS ตามข้อกำหนดการจัดเรียง นั่นไม่ใช่วิธีการทำงานของ Collations และในขณะที่คุณต้องการที่จะเข้าถึงสิ่งนี้ในฐานะผู้ไม่เชื่อเรื่องพระเจ้าผู้ผลิตความจริงก็คือการเรียงอย่างน้อยส่วนที่เราโต้ตอบด้วยนั้นเป็นเรื่องเฉพาะของผู้จำหน่ายมากและไม่เหมาะกับรูปแบบที่คุณค้นหาอยู่เสมอ .

การเปรียบเทียบสตริงและการเรียงลำดับมีความซับซ้อนสูงและมีวิธีต่าง ๆ ในการปฏิบัติตามกฎเหล่านี้ วิธีหนึ่งคือการมีการแมปที่คำนึงถึงกฎอย่างน้อยหนึ่งกฎ ดังนั้นการรวมกันของ Sensitive และ Insensitive ทั้งสี่สำหรับ Case และ Accent จะเท่ากับการแมปสี่แบบที่แยกกัน ตัวอย่างเช่นคุณเห็นเกี่ยวกับเรื่องนี้ว่าหน้า MSDN สำหรับSQL Server เปรียบเทียบชื่อ Sort Order IDหากเลื่อนลงคุณจะเห็นว่าคอลัมน์ด้านซ้ายของแผนภูมิเป็น แต่ละการเรียงมี ID ที่แตกต่าง: SQL_Latin1_General_Cp1_CI_AS= 52 ในขณะที่SQL_Latin1_General_Cp1_CS_AS= 51 แม้ว่าความแตกต่างเพียงอย่างเดียวคือในกรณีที่ความไว

หรืออาจเป็นไปตามกฎเช่น Unicode ให้บริการผ่านขั้นตอนวิธีการจัดเรียง Unicode (UCA) ในวิธีการนี้ทุกตัวละครจะได้รับน้ำหนักตั้งแต่หนึ่งน้ำหนักขึ้นไป จากนั้นแต่ละวัฒนธรรม / สถานที่มีตัวเลือกเพื่อแทนที่น้ำหนักใด ๆ เหล่านั้นหรือลบกฎหรือเพิ่มกฎ อัลกอริทึมคำนึงถึงกฎเฉพาะโลแคลและจากนั้นอาจจัดการกับน้ำหนักเหล่านั้นตามตัวเลือกที่เลือก (ความไวซึ่งกรณีนี้มาก่อนเมื่อทำการเรียงลำดับตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ฯลฯ ) นี่คือเหตุผลหนึ่งว่าทำไมการจัดเรียง Unicode ช้ากว่าการเรียงลำดับที่ไม่ใช่ Unicode เล็กน้อย

เพื่อให้เข้าใจถึงจำนวนตัวเลือกที่มี (เช่นความซับซ้อนที่แท้จริง) ให้ตรวจสอบการสาธิตนี้จากโครงการ ICU (International Components for Unicode):

ICU Collation Demo

มี 8 ตัวเลือกที่แยกต่างหากเพื่อระบุมีและบางส่วนของพวกเขาได้รับการแสดงในหลายองค์ประกอบของสเปคชื่อเรียงว่าคุณมีความคิดของ (เช่นCS, CI, AS, AIฯลฯ ) กำหนดว่ามีรูปแบบจำนวนเท่าใดการใช้วิธีการแมปไฟล์ที่ชุดค่าผสมแต่ละชุดมี ID ของตัวเองจะส่งผลให้มีไฟล์หลายพันไฟล์ ไฟล์เหล่านั้นจำนวนมากจะต้องได้รับการอัปเดตทุกครั้งที่มีการเปลี่ยนแปลงในภาษานั้น ๆ หรือเมื่อพบข้อบกพร่อง นี่อาจเป็นสาเหตุที่มีเพียง 75 ประเภทการเปรียบเทียบใน SQL Server 2012 (เช่นที่มีชื่อขึ้นต้นด้วยSQL_) _CS_AIดังนั้นการรวมกันไม่มี

และสาเหตุที่คุณไม่พบชุดค่าผสมสำหรับ Collations ที่ใช้ UCA มี 3810 Collations ใน SQL Server 2012 ที่ไม่ได้ขึ้นต้นด้วยSQL_ดังนั้น 3885 Collations จึงมีทั้งหมด รายการนั้นดูเหมือนจะยาวเกินไปที่จะระบุอย่างสมบูรณ์บนหน้าเว็บ แต่นี่ไม่ได้อธิบายอย่างสมบูรณ์ว่าทำไมคุณไม่พบชุดค่าผสมนี้สำหรับผู้ขายรายอื่น

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

เซิร์ฟเวอร์ SQL (Microsoft)

ความแตกต่างระหว่างสิ่งที่คุณเห็นบนหน้าเอกสารทั้งสองของ MSDN และข้อความค้นหาที่ @MartinSmith จัดหาให้ในความคิดเห็นเกี่ยวกับคำถาม (แก้ไขเล็กน้อยด้านล่าง):

SELECT *
FROM   sys.fn_helpcollations()
WHERE  [name] LIKE '%[_]CS[_]AI%';

คือเพจ MSDN ทั้งสองนั้นอ้างถึงการเปรียบเทียบ SQL Server ที่คัดค้านโดยเฉพาะอย่างยิ่งในขณะที่การเปรียบเทียบที่ปรากฏขึ้นเป็นผลมาจากการสืบค้นนั้น (888 ในนั้นเป็น SQL Server 2012, SP3) คือการเปรียบเทียบของ Windows

เริ่มต้นใน SQL Server 2000, SQL Server Collation ที่เก่ากว่า (สร้างขึ้นก่อน SQL Server ที่สามารถแตะเข้าไปใน Windows Collations) เลิกใช้แล้วและไม่ได้รับการอัพเดตด้วยกฎหรือฟังก์ชั่นใหม่ ตัวอย่างเช่นการเริ่มต้นใน SQL Server 2012 ชุดของการเปรียบเทียบถูกเพิ่มเข้ามาที่สนับสนุนการจัดการที่เหมาะสมของฟังก์ชั่นในตัวสำหรับอักขระเสริม (เช่นตัวอักษร UTF-16 ที่เหลือเกินกว่าตัวอักษร "ฐาน" 65,536 ตัวแรกที่กำหนดใน UCS-2 ) Collation ที่ใหม่กว่าเหล่านี้ลงท้ายด้วย_SC(เช่นเดียวกับS h อุปกรณc เสริม )

ที่ดีที่สุดคือไม่ได้ใช้เซิร์ฟเวอร์ SQL Collations - SQL_ผู้ที่มีชื่อขึ้นต้นด้วย ดังนั้นคุณสามารถเข้าถึง Collations มากมายที่สนับสนุนการรวมกันของตัวเลือกที่คุณกำลังมองหา (เช่น Case-Sensitive และ Accent-Insensitive) เมื่อใดก็ตามที่มีก็เป็นการดีที่สุดที่จะใช้ปลายด้านหนึ่ง_SCตราบใดที่มีตัวเลือกอื่น ๆ ทั้งหมดที่คุณต้องการ

ในขณะที่ SQL Server ใช้หลักการ_CS_AIตั้งชื่อไม่มีรายการของ 3810 ทั้งหมด (เป็นของ SQL Server 2012) Windows Collations มีเพียงหน้าชื่อคอลเลคชั่นของWindowsที่แสดงรายการตำแหน่งที่ตั้งและรุ่นทั้งหมดและวิธีการทำงานของการตั้งชื่อ

SQL Server ยังรองรับการสลับทั้งความไวและความไว Kana

MySQL (ซื้อโดย Oracle)

รุ่น MySQL 5.7 เอกสารระบุว่ามันไม่สนับสนุน_ai, _as, _ciและ_csต่อท้าย (และ_binเพื่อความสมบูรณ์) แต่ยังระบุ:

สำหรับชื่อการเปรียบเทียบแบบไม่ใช่ไบนารีที่ไม่ได้ระบุความไวของสำเนียงจะถูกกำหนดโดยความไวของตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ นั่นคือถ้าชื่อเรียงไม่ได้มี_aiหรือ_as, _ciในชื่อที่มีความหมาย_aiและในชื่อที่แสดงถึง _cs_as

ตัวอย่างเช่นlatin1_general_ciเป็นตัวพิมพ์เล็กและตัวพิมพ์เล็กและตัวพิมพ์ใหญ่latin1_general_csและเล็ก

สิ่งนี้บ่งบอกว่าเป็นไปได้ที่จะมีการlatin1_general_cs_aiเปรียบเทียบ อย่างไรก็ตามเซิร์ฟเวอร์ MySQL 5.5.50 ว่าฉันมีการเข้าถึงไม่ได้เรียงใด ๆ ที่มีมากกว่าหนึ่งต่อท้ายและส่วนต่อท้ายเดียวที่ฉันเห็นคือ: _cs, _ciและ_binข้าม 198 Collations ทั้งหมด ฉันใช้คำสั่งSHOW COLLATIONเพื่อแสดงรายการ

ดังนั้นในขณะที่ฟังดูเหมือนว่า MySQL ใช้หลักการตั้งชื่อที่คล้ายกัน (อย่างน้อยที่สุดเท่าที่สองตัวเลือกไป) ฉันไม่สามารถหา Collation ที่ตรงกับสิ่งที่คุณต้องการได้ อย่างไรก็ตามอาจเป็นไปได้ที่จะตัดเครื่องหมายเน้นเสียง (และเครื่องหมายกำกับออกเสียงอื่น ๆ ) และใช้การ_csเปรียบเทียบเพื่อให้ได้สิ่งที่คุณต้องการ (คล้ายกับวิธีที่คุณทำใน PostgreSQL - ดูด้านล่าง) แต่ฉันไม่แน่ใจเกี่ยวกับตัวเลือกนี้และไม่มีเวลาทำการวิจัยเพิ่มเติม

หรือคุณอาจสร้าง Collation ของคุณเองเพื่อทำสิ่งที่คุณต้องการ แตกต่างจาก RDBMS อื่น ๆ , MySQL ดูเหมือนจะค่อนข้างง่ายในการเพิ่ม Collations ของคุณเอง, ซึ่งในกรณีนี้คุณสามารถควบคุมน้ำหนักของตัวละครแต่ละตัวได้อย่างเต็มที่ โปรดดูการเพิ่มการจัดเรียงอย่างง่ายในชุดอักขระ 8 บิตและการเพิ่มการจัดเรียง UCA ให้กับชุดอักขระ Unicodeสำหรับรายละเอียดเพิ่มเติม

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ MySQL จัดการกับการเรียงประเภทต่าง ๆ โปรดดูที่หน้าประเภทการใช้การเรียงหน้า

PostgreSQL

การเรียงข้อมูลใน PostgreSQL นั้นมีความยืดหยุ่นน้อยกว่ามาก คุณระบุเฉพาะวัฒนธรรม / สถานที่: en_US, de_DEฯลฯ โปรดดูหน้าเอกสารประกอบของพวกเขาสำหรับการสนับสนุนการจัดเรียงสำหรับรายละเอียด ดังนั้นโดยค่าเริ่มต้นคุณจะได้รับการแทนที่เฉพาะวัฒนธรรม แต่การจัดเรียงจะเป็นอย่างอื่นทุกอย่างที่ละเอียดอ่อน (ซึ่งโดยวิธีการจะไม่เหมือนกับการเปรียบเทียบ "ไบนารี")

คุณสามารถใช้ILIKE (ส่วน 9.7.1) เพื่อรับความรู้สึกตัวพิมพ์เล็กและตัวพิมพ์เล็ก แต่ไม่มีตัวดำเนินการที่คล้ายกันสำหรับการเน้นความไว แต่ผมพบว่าพวกเขาทำมีunaccentฟังก์ชั่นที่สามารถใช้ในการตัดออกสำเนียงและการออกเสียงวรรณยุกต์อื่น ๆ โปรดทราบว่าฟังก์ชั่นนี้เป็นโมดูลเพิ่มเติมที่ให้มาด้วยเหตุนี้จึงไม่จำเป็นต้องอยู่ในเซิร์ฟเวอร์ PostgreSQL ใด ๆ โดยเฉพาะเพื่อใช้งาน เอกสารประกอบที่เชื่อมโยงล่าสุดระบุว่า:

เมื่อสร้างจากการกระจายแหล่งที่มาส่วนประกอบเหล่านี้จะไม่ถูกสร้างขึ้นโดยอัตโนมัติเว้นแต่คุณจะสร้างเป้าหมาย "โลก"
...
หากคุณใช้ PostgreSQL รุ่นที่จัดทำแพ็กเกจไว้ล่วงหน้าโดยทั่วไปโมดูลเหล่านี้จะทำให้พร้อมใช้งานเป็นแพ็คเกจย่อยแยกต่างหากเช่น PostgreSQL-contrib

โปรดดูเอกสารประกอบสำหรับคำแนะนำเกี่ยวกับวิธีการใช้ฟังก์ชั่นนั้นถ้าคุณไม่มีและต้องการ

ข้อมูลเพิ่มเติมสามารถพบได้ในคำตอบ Stack Overflow ต่อไปนี้:

PostgreSQL รองรับ "การเน้นเสียงที่ไม่ตอบสนอง" หรือไม่?

DB2 (IBM)

คล้ายกับ Microsoft SQL Server, DB2 มีการเปรียบเทียบสองประเภท:

  • "ระบบ" Collations SYSTEM_{codepage}_[optional-territory]ซึ่งมีการระบุโดยใช้รูปแบบต่อไปนี้: สิ่งเหล่านี้ไม่ยืดหยุ่นมากและดูเหมือนจะไม่สนับสนุนการปรับความไวของตัวพิมพ์เล็กและตัวเล็กหรือเสียงใด ๆ คุณสามารถค้นหารายการ Collations ที่สนับสนุนได้ที่นี่: รหัสอาณาเขตและหน้ารหัสที่รองรับ

  • Unicode Collation Algorithm (UCA) - การเปรียบเทียบการอ้างอิง สิ่งเหล่านี้สนับสนุนการปรับแต่งเล็กน้อย โปรดดูหน้าการจัดเรียงตามอัลกอริทึม Unicode Collationของพวกเขาสำหรับรายละเอียดเกี่ยวกับวิธีกำหนดค่าลักษณะการทำงานการตั้งชื่อและรายการสถานที่ที่ถูกต้อง โปรดทราบว่าในตารางที่ 1 ตัวอย่างในแถวที่สาม ("ระดับกรณี") เริ่มต้นด้วย:

    การตั้งค่าแอตทริบิวต์ Case Level เป็น on และแอตทริบิวต์ Strength เป็นระดับหลักจะไม่เน้นเครื่องหมายเน้นเสียง แต่ไม่ใช่ตัวพิมพ์ใหญ่และเล็ก

    นั่นคือสิ่งที่คุณกำลังมองหา CLDR181_EO_S1แต่ไวยากรณ์สำหรับที่อยู่: และนี่คือสาเหตุที่การค้นหาของคุณไม่พบสิ่งใดที่เกี่ยวข้องกับ DB2

คำพยากรณ์

Oracle 10g เพิ่มการสนับสนุนสำหรับการเปรียบเทียบและการเรียงลำดับแบบเน้นข้อความ อย่างไรก็ตาม:

  • พวกเขามีตัวเลือกเพื่อแสดงการดำเนินงาน "ตาย": _CIและ_AI
  • คุณสามารถระบุได้เพียงหนึ่งตัวเลือกเท่านั้นในแต่ละครั้ง
  • ตัวเลือกตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ - _CI- ยังคงเน้นความสำคัญ
  • ตัวเลือกสำเนียงที่ไม่รู้สึกตัว - _AI- "เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เสมอ" (อ้างจากเอกสารของพวกเขาซึ่งมีลิงค์ด้านล่าง)

โปรดดูหน้าเอกสารการเรียงลำดับและการค้นหาสตริงสำหรับรายละเอียดและตัวอย่างเพิ่มเติม

SAP ASE (เดิมชื่อ Sybase ASE, aka Sybase)

ASE สนับสนุนการรวมกันของความไวต่อไปนี้อย่างน้อยหนึ่งรายการต่อแต่ละโลแคล / ชุดอักขระ:

  • ตรงตามตัวพิมพ์ใหญ่ - เล็กและเน้นเสียง
  • ตรงตามตัวพิมพ์ใหญ่ - เล็ก
  • ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์ใหญ่ - เล็ก
  • ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

คุณสามารถเห็นความสัมพันธ์ระหว่างสถานชุดตัวอักษรและคำสั่งซื้อการจัดเรียงที่มีอยู่บนของพวกเขาเลือกเริ่มต้นเรียงหน้า และคุณสามารถดูรายการเต็มรูปแบบของพวกเขาใน Collations ชื่อและรหัส Collationหน้า

รูปแบบการตั้งชื่อ Collation ของพวกเขาเป็นกฎเกณฑ์ว่าพวกเขามีอักขระ 4 - 8 ตัวและพยายามจับชื่อโลแคลหรือหน้ารหัสและความรู้สึกของการเรียงลำดับ ตัวอย่างเช่น:

altnoacc== "ทางเลือก CP 850 - ไม่มีการเน้นเสียง"
rusdict== "การสั่งซื้อพจนานุกรมภาษารัสเซีย"
dynix== "การสั่งการออกเสียงภาษาจีน"

มีหมายเหตุเกี่ยวกับการเลือกหน้าเรียงลำดับ Unicode เริ่มต้นที่ระบุ:

คุณสามารถเพิ่มการเรียงลำดับโดยใช้ไฟล์ภายนอกใน$/collate/Unicodeไดเรกทอรี syscharsetsชื่อและรหัสการเปรียบเทียบจะถูกเก็บไว้ใน ชื่อของคำสั่งการเรียงลำดับ Unicode ภายนอกไม่จำเป็นต้องอยู่ในsyscharsetsก่อนที่คุณจะสามารถตั้งค่าการเรียงลำดับ Unicode เริ่มต้นได้
...
คำสั่งการเรียงลำดับ Unicode ภายนอกจัดทำโดย SAP อย่าพยายามสร้างคำสั่งการเรียงลำดับ Unicode ภายนอก

ไม่ชัดเจนว่า SAP จะจัดหาคำสั่งการจัดเรียงภายนอกเพื่ออนุญาตให้ใช้ Case-Sensitive และ Accent-Insensitive หรือไม่ บางทีสักวันหนึ่งฉันจะส่งอีเมลถึงพวกเขาและถามว่าจะมีใครได้รับการร้องขอหรือไม่

เพื่อให้ได้ชุดที่ต้องการความไวคุณควรจะสามารถสร้างฟังก์ชันที่ผู้ใช้กำหนดแบบสเกลาร์เพื่อตัดการเน้นเสียงและเครื่องหมายกำกับออกเสียงอื่น ๆ

Informix (ซื้อโดย IBM)

Informix ดูเหมือนจะสนับสนุนการเรียงลำดับเริ่มต้นและพฤติกรรมการเปรียบเทียบของ Collation เป็นส่วนใหญ่เท่านั้น ดังนั้นการเรียงหน้าเป็นเพียงโลแคลและชุดอักขระ การพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่นั้นถูกจัดการในระดับฐานข้อมูล คุณสามารถตั้งค่าฐานข้อมูล (ไม่ใช่ตารางหรือคอลัมน์หรือแบบสอบถามหรือแม้แต่เพรดิเคต) เป็นแบบไม่ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็กโดยระบุ NLSCASE INSENSITIVEในCREATE DATABASEคำสั่ง

ในขณะที่การจัดเรียงฐานข้อมูล - โลแคลและชุดอักขระ - สามารถถูกเขียนทับต่อการเชื่อมต่อไคลเอนต์ดูเหมือนจะไม่มีวิธีการแทนที่การตั้งค่า case-sensitive และNLSCASEตัวเลือกมี "NLS" ในชื่อด้วยเหตุผล: มันมีผลNCHARกับNVARCHARข้อมูลเท่านั้น CHARและVARCHARคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เสมอ

ไม่เน้นความไวของสำเนียงและไม่มีฟังก์ชั่นในตัวเพื่อตัดเครื่องหมายเน้นเสียง / เครื่องหมายกำกับเสียง

ระเบียบการตั้งชื่อ Informix Collation คือ:

<lang>_<country>.<code set>

ที่อยู่:

  • <lang> = รหัสภาษา 2 ตัวอักษรหรือ 3 ตัวอักษร
  • <country> = รหัสประเทศหรือภูมิภาค 2 ตัวอักษร
  • <code set> = หน้ารหัสที่ระบุในหนึ่งใน 3 วิธีที่เทียบเท่าดังต่อไปนี้:
    • ชื่อ: 8859-1
    • ค่าทศนิยมของหมายเลข IBM CCSID: 819
    • ค่าเลขฐานสิบหกของหมายเลข IBM CCSID: 0333

ดังนั้นข้อมูลจำเพาะโลแคลสามตัวต่อไปนี้ทั้งหมดอ้างถึงโลแคลเดียวกันทั้งหมด:

  • fr_fr.8859-1
  • fr_fr.819
  • fr_fr.0333

สำหรับข้อมูลเพิ่มเติมโปรดดู:


1
@onedaywhen ขออภัยในความเข้าใจผิด คำถามของผู้จำหน่ายที่ไม่เชื่อเรื่องพระเจ้าไม่ชัดเจนอย่างสมบูรณ์เนื่องจากแนวคิดนั้นไม่มีอยู่จริงและ Collations ไม่ได้ใช้หลักการตั้งชื่อนั้นเสมอไป ฉันรวบรวมข้อมูลเพิ่มเติม (สำหรับ RDBMS อีก 3 ครั้ง) และกำลังอัปเดตคำตอบของฉัน
โซโลมอน Rutzky

4
ขออภัยสำหรับการพิมพ์ผิด แต่ฉันหมายถึง 'coloration' เช่นตัวพิมพ์ใหญ่ในสีน้ำเงินและเน้นสีแดง ... ล้อเล่นเท่านั้น! นี่เป็นคำตอบที่ดีที่สุดที่ฉันเคยได้รับ ขอบคุณมาก :)
59

@onedaywhen oooohhhh ... สี ... ตอนนี้ฉันเข้าใจแล้ว ... โชคดีที่มันง่าย: แค่ใช้--colorธง อย่างไรก็ตามฉันคิดว่าใช้งานได้เฉพาะเมื่อคุณส่งแบบสอบถามโดยใช้ JCL ;-) หรือถ้าคุณต้องการที่จะเห็นสีแดงและสีน้ำเงินบางทีภาพที่ใช้ในคำตอบของฉันนี้จะพอเพียง? แต่ในหมายเหตุที่จริงจัง: ขอบคุณมากสำหรับคำชมที่ยอดเยี่ยมนั้น😺 นอกจากนี้ฉันเพิ่งเพิ่มข้อมูลสำหรับ SAP ASE และทำการแก้ไขอื่น ๆ สองสามรายการดังนั้นโปรดดูประวัติการแก้ไขสำหรับรายละเอียด
โซโลมอน Rutzky

อัปเดต: Postgres 10 ได้รับการสนับสนุนสำหรับการเปรียบเทียบ ICU ดูโพสต์บล็อกนี้โดย Peter Eisentraut
Basil Bourque

@BasilBourque ขอบคุณที่พูดถึงเรื่อง PG10 โพสต์บล็อกนั้นในตอนท้ายระบุว่า "ICU มีฟังก์ชันการทำงานจำนวนมากในพื้นที่นี้ซึ่งเรายังไม่เปิดเผยผ่าน PostgreSQL ยังมีตัวเลือกสำหรับการเรียงลำดับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่การเรียงลำดับสำเนียงที่ไม่รู้สึกตัว สำหรับผู้ที่ต้องการเผยแพร่ PostgreSQL ในอนาคต " ดังนั้นในการใช้งานครั้งแรก / ปัจจุบันมันจะไม่เปลี่ยนแปลงข้อมูลใด ๆ ในคำตอบของฉัน หากข้อเสนอในอนาคตอนุญาตให้มีการควบคุมตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ฉันจะอัปเดตคำตอบด้วยข้อมูลนั้น ขั้นตอนแรกที่ยอดเยี่ยมสำหรับ PG แม้ว่า :-)
โซโลมอน Rutzky

-3

ชื่อตัวเลือกคำอธิบาย NLS_LANG ชุดภาษาขอบเขตและฐานข้อมูลปัจจุบันซึ่งกำหนดโดยพารามิเตอร์โกลบอลไลเซชั่นทั่วโลก NLS_LANGUAGE ภาษาปัจจุบันของเซสชัน NLS_SORT ลำดับของค่าอักขระที่ใช้เมื่อเรียงลำดับหรือเปรียบเทียบข้อความ

หากต้องการตรวจสอบการตั้งค่า NLS ปัจจุบันให้พิมพ์:

เลือก * จาก v $ NLS_PARAMETERS;

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