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

MySQL: ค้นหาคอลัมน์ที่มีตัวอักษรพิมพ์ใหญ่ (Capital Letter)

การค้นหาข้อมูลที่มีตัวพิมพ์ใหญ่ด้วย 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-sensitive
  • RLIKE '[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+)