ใน MySQL การเปรียบเทียบสตริงเริ่มต้นเป็น Case-Insensitive (ไม่แยกตัวพิมพ์ใหญ่/เล็ก) หากต้องการเปรียบเทียบแบบ Case-Sensitive ให้ใช้คีย์เวิร์ด BINARY
ตัวอย่างเปรียบเทียบ
Case 1: Case-Insensitive (ค่าเริ่มต้น)
SELECT 'joHN' = 'JOHN' AS Result;
ผลลัพธ์: 1 (True - ถือว่าเท่ากัน)
Case 2: Case-Sensitive ด้วย BINARY
SELECT BINARY 'joHN' = 'JOHN' AS Result;
ผลลัพธ์: 0 (False - ไม่เท่ากัน)
SELECT BINARY 'JOHN' = 'JOHN' AS Result;
ผลลัพธ์: 1 (True - เท่ากันทุกตัว)
ใช้ BINARY กับคอลัมน์ใน WHERE
SELECT * FROM table_name
WHERE BINARY column_name = 'exact_value';
กำหนด Case-Sensitive ตั้งแต่สร้างตาราง
เพิ่ม BINARY หลังชนิดข้อมูลคอลัมน์:
CREATE TABLE binaryKeywordDemo (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(10) BINARY, -- คอลัมน์นี้ Case-Sensitive ตลอด
PRIMARY KEY (Id)
);
เพิ่มข้อมูลทดสอบ
INSERT INTO binaryKeywordDemo (Name) VALUES
('bOB'), ('bob'), ('BOB'), ('Bob'), ('bOb'), ('boB');
ข้อมูลในตาราง (เก็บทุก case แยกกันได้):
+----+------+
| Id | Name |
+----+------+
| 1 | bOB |
| 2 | bob |
| 3 | BOB |
| 4 | Bob |
| 5 | bOb |
| 6 | boB |
+----+------+
ค้นหาแบบ Case-Sensitive
SELECT * FROM binaryKeywordDemo WHERE Name = 'Bob';
ผลลัพธ์: คืนแถว Id=4 เท่านั้น (Bob พิมพ์ใหญ่ตัวแรกอย่างเดียว)
+----+------+
| Id | Name |
+----+------+
| 4 | Bob |
+----+------+
สรุปการใช้ BINARY
| รูปแบบ | ผลลัพธ์ | ใช้เมื่อ |
|---|---|---|
col = 'val' | Case-Insensitive | ค้นหาทั่วไป |
BINARY col = 'val' | Case-Sensitive | ต้องการแมตช์ตัวพิมพ์ใหญ่/เล็กตรงกัน |
col = BINARY 'val' | Case-Sensitive | เท่ากับข้างบน |
VARCHAR(n) BINARY | คอลัมน์ Case-Sensitive ตลอด | ออกแบบตารางตั้งแต่แรก |
ข้อสังเกต
BINARYทำให้เปรียบเทียบแบบ byte-by-byte (เร็วกว่า COLLATE)- สำหรับ Unicode/Thai ควรใช้
COLLATE utf8mb4_binแทน เพื่อรองรับอักขระหลายไบต์ BINARYสร้างดัชนีไม่ได้ (non-indexable) หากใช้บ่อย ควรสร้างคอลัมน์ BINARY แยกหรือใช้ functional index (MySQL 8.0+)