การค้นหาสตริงแบบ Case-Sensitive ใน MySQL ด้วย COLLATE
MySQL ค้นหาสตริงแบบ Case-Insensitive โดยค่าเริ่มต้น (ขึ้นอยู่กับ Collation) หากต้องการค้นหาที่ตรงกันแม่นยำรวมถึงตัวพิมพ์เล็ก/ใหญ่ ใช้ COLLATE กำหนด collation แบบ binary
สร้างตารางและข้อมูลทดสอบ
mysql> create table DemoTable1620 (
-> Subject varchar(20)
-> );
Query OK, 0 rows affected (0.42 sec)
mysql> insert into DemoTable1620 values('mysql');
mysql> insert into DemoTable1620 values('MySql');
mysql> insert into DemoTable1620 values('mYSQL');
mysql> insert into DemoTable1620 values('MySQL');
mysql> insert into DemoTable1620 values('MYSQL');
ข้อมูลทั้งหมด
+---------+ | Subject | +---------+ | mysql | | MySql | | mYSQL | | MySQL | | MYSQL | +---------+
คำสั่งค้นหาแบบ Case-Sensitive
mysql> select * from DemoTable1620 where Subject collate utf8_bin = 'MySQL';
ผลลัพธ์
+---------+ | Subject | +---------+ | MySQL | +---------+
Collation แบบ Binary ที่นิยมใช้
| Collation | ลักษณะ |
|---|---|
utf8_bin | เปรียบเทียบแบบไบต์ต่อไบต์ (Case-sensitive, Accent-sensitive) |
utf8mb4_bin | รองรับ Unicode เต็มรูปแบบ (emoji, ตัวอักษรพิเศษ) |
latin1_bin | สำหรับ latin1 legacy |
วิธีอื่น: ใช้ BINARY operator
SELECT * FROM DemoTable1620 WHERE BINARY Subject = 'MySQL';
BINARY เป็น shorthand สำหรับ COLLATE ..._bin ทำงานเหมือนกัน
การตั้งค่า Collation ระดับคอลัมน์/ตาราง
หากต้องการ Case-sensitive ตลอดเวลา ให้กำหนด collation ตอนสร้างตาราง:
CREATE TABLE t (col VARCHAR(20) COLLATE utf8_bin);
หมายเหตุ: การใช้ COLLATE ใน WHERE clause อาจทำให้ไม่สามารถใช้ index ได้ (non-sargable) หากคอลัมน์มี collation ต่างกัน ควรพิจารณาเปลี่ยน collation ระดับคอลัมน์ถ้าค้นหาบ่อย