Case Insensitive Comparison ด้วย LOWER() หรือ UPPER()
MySQL Default Collation (utf8mb4_general_ci, utf8_general_ci) เป็น Case Insensitive แล้ว แต่ถ้า Column ใช้ Collation Case Sensitive (_cs, _bin) ต้อง Normalize เอง
ตัวอย่าง: Smith vs smith, Brown vs brown
CREATE TABLE DemoTable623 (
FirstName VARCHAR(100),
LastName VARCHAR(100),
Age INT
);
INSERT INTO DemoTable623 VALUES
('John', 'Smith', 23),
('Adam', 'smith', 23),
('Chris', 'Brown', 24),
('Robert', 'brown', 21);
Query: หา FirstName ที่ LastName = 'smith' (Case Insensitive)
SELECT FirstName FROM DemoTable623
WHERE LOWER(LastName) = 'smith';
ผลลัพธ์: John, Adam
+-----------+
| FirstName |
+-----------+
| John |
| Adam |
+-----------+
วิธีอื่นๆ สำหรับ Case Insensitive
| Method | Query | Performance | หมายเหตุ |
|---|---|---|---|
| LOWER() | WHERE LOWER(col) = 'value' | Full Scan (Non-SARGable) | Standard |
| UPPER() | WHERE UPPER(col) = 'VALUE' | Full Scan | Standard |
| COLLATE | WHERE col = 'value' COLLATE utf8mb4_general_ci | อาจใช้ Index ได้ | MySQL Specific |
| Default Collation | WHERE col = 'value' (ถ้า Table _ci) | ใช้ Index ได้ | Best Practice |
Best Practice: ใช้ Collation Case Insensitive ตั้งแต่ Schema Design
CREATE TABLE users (
last_name VARCHAR(100) COLLATE utf8mb4_general_ci -- _ci = Case Insensitive
);
แล้ว Query ธรรมดา:
SELECT FirstName FROM DemoTable623 WHERE LastName = 'smith'; -- Match Smith, smith, SMITH
Functional Index สำหรับ Case Insensitive Search บน Column _cs/_bin
-- MySQL 8.0.13+
ALTER TABLE DemoTable623
ADD INDEX idx_lower_lastname ((LOWER(LastName)));
-- Query ใช้ Index ได้
SELECT FirstName FROM DemoTable623 WHERE LOWER(LastName) = 'smith';
Case Sensitive Search (เมื่อ Collation เป็น _ci)
-- บังคับ Case Sensitive
SELECT * FROM DemoTable623 WHERE LastName = 'Smith' COLLATE utf8mb4_bin;
-- หรือ
SELECT * FROM DemoTable623 WHERE BINARY LastName = 'Smith';
Unicode/Thai Consideration
ภาษาไทยไม่มี Upper/Lower Case - LOWER()/UPPER() ไม่เปลี่ยนแปลงตัวอักษรไทย
SELECT LOWER('สมชาย'), UPPER('สมชาย'); -- สมชาย, สมชาย