การค้นหาข้อมูลที่มีตัวพิมพ์ใหญ่ด้วย CAST ... BINARY และ RLIKE
MySQL ค้นหาข้อความแบบ Case-insensitive โดยค่าเริ่มต้น (ขึ้นกับ Collation) หากต้องการค้นหาเฉพาะแถวที่มีตัวอักษรพิมพ์ใหญ่ (A-Z) ต้องบังคับให้เปรียบเทียบแบบ Binary (Case-sensitive) ด้วย CAST(... AS BINARY) แล้วค่อยใช้ RLIKE (Regular Expression Like)
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูลผสมพิมพ์เล็ก/ใหญ่:
mysql> CREATE TABLE contains_capital_letterDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name VARCHAR(100)
-> );
Query OK, 0 rows affected (1.42 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('Larry');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('larry');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('john');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('JOHN');
Query OK, 1 row affected (0.36 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('mike');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('Mike');
Query OK, 1 row affected (0.27 sec)
ข้อมูลทั้งหมด:
mysql> SELECT * FROM contains_capital_letterDemo;
+----+-------+
| Id | Name |
+----+-------+
| 1 | Larry |
| 2 | larry |
| 3 | john |
| 4 | JOHN |
| 5 | mike |
| 6 | Mike |
+----+-------+
6 rows in set (0.00 sec)
ค้นหาที่มีตัวพิมพ์ใหญ่ (A-Z) อย่างน้อย 1 ตัว:
mysql> SELECT * FROM contains_capital_letterDemo
-> WHERE CAST(Name AS BINARY) RLIKE '[A-Z]';
ผลลัพธ์ (Larry, JOHN, Mike):
+----+-------+
| Id | Name |
+----+-------+
| 1 | Larry |
| 4 | JOHN |
| 6 | Mike |
+----+-------+
3 rows in set (0.00 sec)
คำอธิบาย
CAST(Name AS BINARY)แปลงสตริงเป็น Binary String ทำให้การเปรียบเทียบ Case-sensitiveRLIKE '[A-Z]'ตรงกับอักขระ A-Z อย่างน้อย 1 ตัว (RLIKE = REGEXP)- หากไม่ใช้ CAST BINARY และ Collation เป็น ci (case-insensitive) จะจับ 'larry' ด้วยเพราะ 'L' ≈ 'l'
ทางเลือกอื่น
-- ใช้ COLLATE บังคับ Case-sensitive
WHERE Name COLLATE utf8mb4_bin RLIKE '[A-Z]'
-- หรือใช้ REGEXP โดยตรงกับ Binary String
WHERE Name REGEXP BINARY '[A-Z]'
วิธี REGEXP BINARY สั้นที่สุดและอ่านง่าย (รองรับ MySQL 8.0+)