Sử dụng REGEXP BINARY để tìm kiếm phân biệt chữ hoa/chữ thường (case-sensitive) các ký tự in hoa trong chuỗi.
Cú pháp
SELECT * FROM tên_bảng WHERE tên_cột REGEXP BINARY '[A-Z]{2}';
[A-Z]{2} khớp với ít nhất 2 chữ in hoa liên tiếp.
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE FindCapitalLettersDemo (
-> StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentFirstName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.52 sec)
Chèn dữ liệu (có chữ hoa, chữ thường, viết hoa toàn bộ):
mysql> INSERT INTO FindCapitalLettersDemo(StudentFirstName) VALUES
-> ('JOHN'), ('Carol'), ('bob'), ('carol'), ('John');
Xem dữ liệu:
mysql> SELECT * FROM FindCapitalLettersDemo;
+-----------+------------------+ | StudentId | StudentFirstName | +-----------+------------------+ | 1 | JOHN | | 2 | Carol | | 3 | bob | | 4 | carol | | 5 | John | +-----------+------------------+
Tìm tên có ít nhất 2 chữ in hoa liên tiếp:
mysql> SELECT * FROM FindCapitalLettersDemo
-> WHERE StudentFirstName REGEXP BINARY '[A-Z]{2}';
+-----------+------------------+ | StudentId | StudentFirstName | +-----------+------------------+ | 1 | JOHN | +-----------+------------------+
Giải thích
JOHN: có "JO", "OH", "HN" → khớpCarol: chỉ 'C' in hoa, 'arol' thường → không khớpJohn: chỉ 'J' in hoa → không khớpbob,carol: toàn chữ thường → không khớp
Các pattern REGEXP hữu ích khác
| Pattern | Ý nghĩa | Ví dụ khớp |
|---|---|---|
[A-Z] | Ít nhất 1 chữ in hoa | John, JOHN, aBc |
^[A-Z] | Bắt đầu bằng chữ in hoa | John, Carol |
[A-Z]$ | Kết thúc bằng chữ in hoa | johnA |
[A-Z]{3,} | Tối thiểu 3 chữ in hoa liên tiếp | ABC, HELLO |
[A-Z][a-z]+ | Chữ in hoa + chữ thường (Title Case) | John, Carol |
BINARY | Phân biệt hoa/thường (mặc định MySQL không phân biệt) |
Lưu ý hiệu năng
REGEXP không sử dụng index → full table scan. Với bảng lớn, cân nhắc:
- Tạo cột computed lưu phiên bản chuẩn hóa
- Dùng FULLTEXT search nếu cần phức tạp
- Xử lý ở tầng ứng dụng