ภาพรวม
MySQL Default Collation เป็น Case-Insensitive (ci) แล้ว แต่หากต้องการบังคับหรือใช้กับ Binary Collation ให้ใช้ UPPER() หรือ LOWER() ทั้งคอลัมน์และค่าใน IN()
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล
CREATE TABLE DemoTable1460 (Name VARCHAR(20));
INSERT INTO DemoTable1460 VALUES ('Chris');
INSERT INTO DemoTable1460 VALUES ('David');
INSERT INTO DemoTable1460 VALUES ('Bob');
INSERT INTO DemoTable1460 VALUES ('Robert');
2. Query: Case-Insensitive Search ด้วย UPPER()
SELECT * FROM DemoTable1460
WHERE UPPER(Name) IN ('CHRIS', 'BOB');
3. ผลลัพธ์ (จับ 'Chris' และ 'Bob' ไม่สนใจ Case)
+-------+
| Name |
+-------+
| Chris |
| Bob |
+-------+
วิธีต่างๆ สำหรับ Case-Insensitive
| วิธี | ตัวอย่าง | หมายเหตุ |
|---|---|---|
| UPPER() ทั้งสองฝั่ง | WHERE UPPER(col) IN ('A','B') | มาตรฐาน ANSI |
| LOWER() ทั้งสองฝั่ง | WHERE LOWER(col) IN ('a','b') | เหมือน UPPER |
| COLLATE ..._ci | WHERE col COLLATE utf8mb4_general_ci IN ('a','b') | ระบุ Collation |
| Default Collation | WHERE col IN ('a','b') | ถ้า Table เป็น _ci แล้ว |
ประสิทธิภาพ
UPPER(col)/LOWER(col)→ ไม่ใช้ Index (Function on column)- หาก Table ใหญ่ ควร:
- ใช้ Collation _ci ตั้งแต่สร้างตาราง
- เพิ่ม Computed/Generated Column:
name_upper VARCHAR(20) GENERATED ALWAYS AS (UPPER(Name)) STOREDแล้ว Index คอลัมน์นั้น - MySQL 8.0+: Functional Index
INDEX idx_upper ((UPPER(Name)))
ตัวอย่าง Functional Index (MySQL 8.0+)
CREATE TABLE DemoTable1460 (
Name VARCHAR(20),
INDEX idx_name_upper ((UPPER(Name)))
);
-- Query นี้จะใช้ Index ได้
SELECT * FROM DemoTable1460 WHERE UPPER(Name) IN ('CHRIS', 'BOB');
สรุป
ใช้ WHERE UPPER(column) IN ('VAL1', 'VAL2') สำหรับ Case-Insensitive Search กับ IN() แต่ระวัง Index ใช้ Functional Index (MySQL 8.0+) หรือ Generated Column แทน