Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ค้นหาค่าที่ตรงกันแม่นยำ (Case-sensitive) ใน MySQL ด้วย COLLATE

ปัญหา

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

CollationCharsetคำอธิบาย
utf8_binutf8 (3-byte)Binary comparison, Case-sensitive
utf8mb4_binutf8mb4 (4-byte)รองรับ Emoji, Case-sensitive (แนะนำ)
latin1_binlatin1Legacy
ascii_binasciiASCII เท่านั้น

การใช้งานเพิ่มเติม

กำหนด 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 เต็ม)