ปัญหา
MySQL Default Collation (เช่น utf8_general_ci, utf8mb4_general_ci) เป็น Case-Insensitive (ci = Case Insensitive) การค้นหา 'mysql' = 'MySQL' จะเป็น TRUE
วิธีแก้: ใช้ COLLATE utf8_bin (หรือ utf8mb4_bin)
WHERE column COLLATE utf8_bin = 'ExactValue'
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล (Case ต่างกัน)
CREATE TABLE DemoTable1620 (Subject VARCHAR(20));
INSERT INTO DemoTable1620 VALUES ('mysql');
INSERT INTO DemoTable1620 VALUES ('MySql');
INSERT INTO DemoTable1620 VALUES ('mYSQL');
INSERT INTO DemoTable1620 VALUES ('MySQL');
INSERT INTO DemoTable1620 VALUES ('MYSQL');
2. ข้อมูลทั้งหมด
SELECT * FROM DemoTable1620;
+---------+
| Subject |
+---------+
| mysql |
| MySql |
| mYSQL |
| MySQL |
| MYSQL |
+---------+
3. ค้นหาแบบ Case-Sensitive: ตรง 'MySQL' เท่านั้น
SELECT * FROM DemoTable1620
WHERE Subject COLLATE utf8_bin = 'MySQL';
4. ผลลัพธ์ (ได้ 1 แถวเท่านั้น)
+---------+
| Subject |
+---------+
| MySQL |
+---------+
Collation ที่ใช้ได้สำหรับ Case-Sensitive
| Collation | Charset | คำอธิบาย |
|---|---|---|
| utf8_bin | utf8 (3-byte) | Binary comparison, Case-sensitive |
| utf8mb4_bin | utf8mb4 (4-byte) | รองรับ Emoji, Case-sensitive (แนะนำ) |
| latin1_bin | latin1 | Legacy |
| ascii_bin | ascii | ASCII เท่านั้น |
การใช้งานเพิ่มเติม
กำหนด Collation ตอนสร้างตาราง (Permanent)
CREATE TABLE DemoTable (
Subject VARCHAR(20) COLLATE utf8mb4_bin
);
กำหนด Collation ตอนสร้าง Database
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
ใช้ใน JOIN (ทั้งสองฝั่งต้อง Collate เหมือนกัน)
SELECT * FROM Table1 t1
JOIN Table2 t2 ON t1.Name COLLATE utf8mb4_bin = t2.Name COLLATE utf8mb4_bin;
ORDER BY แบบ Case-Sensitive
SELECT * FROM DemoTable ORDER BY Subject COLLATE utf8mb4_bin;
-- ผลลัพธ์: MYSQL, MySQL, MySql, mYSQL, mysql (ตัวใหญ่หน้า)
ประสิทธิภาพ
COLLATEใน WHERE → ไม่ใช้ Index (Non-SARGable)- หาก Query บ่อย ควรสร้าง Index ด้วย Collation นั้น หรือเก็บค่า Normalized แยกคอลัมน์
- MySQL 8.0+: ใช้
CAST(col AS BINARY)ได้ผลเท่ากัน
สรุป
ใช้ WHERE column COLLATE utf8mb4_bin = 'ExactValue' เพื่อค้นหาค่าที่ตรง Case-Sensitive แม่นยำ utf8mb4_bin แนะนำกว่า utf8_bin (รองรับ Unicode เต็ม)