วิธีการที่พบบ่อยที่สุดคือการพิมพ์เล็กหรือสตริงการค้นหาและตัวพิมพ์ใหญ่ แต่มีสองปัญหาด้วยกัน
- มันทำงานได้ในภาษาอังกฤษ แต่ไม่ได้อยู่ในทุกภาษา (อาจไม่ได้เป็นในภาษาส่วนใหญ่) ไม่ใช่ตัวอักษรพิมพ์เล็กทุกตัวที่มีตัวพิมพ์ใหญ่ที่ตรงกัน ไม่ใช่ตัวอักษรตัวพิมพ์ใหญ่ทุกตัวที่มีตัวพิมพ์เล็กที่สอดคล้องกัน
- การใช้ฟังก์ชั่นเช่นด้านล่าง () และด้านบน () จะให้การสแกนตามลำดับ ไม่สามารถใช้ดัชนีได้ ในระบบทดสอบของฉันการใช้ lower () จะใช้เวลานานกว่าแบบสอบถามประมาณ 2000 เท่าที่สามารถใช้ดัชนีได้ (ข้อมูลทดสอบมีจำนวนแถวน้อยกว่า 100k เล็กน้อย)
มีอย่างน้อยสามโซลูชันที่ใช้บ่อยซึ่งอาจมีประสิทธิภาพมากขึ้น
- ใช้โมดูล citextซึ่งส่วนใหญ่เลียนแบบพฤติกรรมของชนิดข้อมูลที่ไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก เมื่อโหลดโมดูลนั้นแล้วคุณสามารถสร้างดัชนีตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
CREATE INDEX ON groups (name::citext);
ได้ (แต่ดูด้านล่าง)
- ใช้การเปรียบเทียบแบบ case-insensitive ชุดนี้ถูกตั้งค่าเมื่อคุณเริ่มต้นฐานข้อมูล การใช้การเรียงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่หมายความว่าคุณสามารถยอมรับรูปแบบใดก็ได้จากรหัสลูกค้าและคุณจะยังคงแสดงผลลัพธ์ที่มีประโยชน์ (นอกจากนี้ยังหมายความว่าคุณไม่สามารถทำแบบสอบถามที่เป็นกรณี ๆ ไปได้ Duh.)
- สร้างดัชนีการทำงาน
CREATE
INDEX ON groups (LOWER(name));
สร้างดัชนีโดยใช้ตัวพิมพ์เล็ก เมื่อทำอย่างนั้นแล้วคุณสามารถใช้ประโยชน์จากดัชนีที่มีคำสั่งเช่นSELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
หรือSELECT id FROM groups WHERE LOWER(name) = 'administrator';
คุณต้องจำไว้ว่าให้ใช้ LOWER ()
โมดูล citext ไม่มีประเภทข้อมูลที่ไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก มันจะทำงานเหมือนว่าแต่ละสตริงมีค่าลดลง นั่นคือมันจะทำงานเหมือนกับว่าคุณได้โทรlower()
ไปยังแต่ละสายดังที่แสดงไว้ในข้อ 3 ข้างต้น ข้อดีคือโปรแกรมเมอร์ไม่จำเป็นต้องจำสตริงตัวพิมพ์เล็ก แต่คุณต้องอ่านหัวข้อ "พฤติกรรมการเปรียบเทียบสตริง" และ "ข้อ จำกัด " ในเอกสารก่อนที่คุณจะตัดสินใจใช้ citext