Giải pháp: Regular Expression (REGEXP)
MySQL hỗ trợ REGEXP (hoặc RLIKE) để so khớp mẫu phức tạp.
Ví dụ: Mẫu UserId dạng XXXX-XXX-X
4 ký tự alphanumeric - 3 ký tự alphanumeric - 1 ký tự alphanumeric
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (
UserId VARCHAR(100)
);
mysql> INSERT INTO DemoTable VALUES('User-123-G');
mysql> INSERT INTO DemoTable VALUES('Us-453-GO');
mysql> INSERT INTO DemoTable VALUES('TRUE-908-K');
Dữ liệu gốc
+------------+ | UserId | +------------+ | User-123-G | | Us-453-GO | | TRUE-908-K | +------------+
Truy vấn REGEXP
mysql> SELECT * FROM DemoTable
-> WHERE UserId REGEXP '^[[:alnum:]]{4}-[[:alnum:]]{3}-[[:alnum:]]{1}$';
Kết quả
+------------+ | UserId | +------------+ | User-123-G | | TRUE-908-K | +------------+
Giải thích Pattern
| Phần | Ý nghĩa |
|---|---|
^ | Bắt đầu chuỗi |
[[:alnum:]] | Chữ cái hoặc số (a-z, A-Z, 0-9) |
{4} | Đúng 4 lần |
- | Ký tự gạch ngang literal |
{3} | Đúng 3 lần |
{1} | Đúng 1 lần |
$ | Kết thúc chuỗi |
Các Pattern thường dùng
| Pattern | Mô tả |
|---|---|
'^[0-9]+$' | Chỉ chứa số |
'^[a-zA-Z]+$' | Chỉ chứa chữ |
'^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$' | Email (đơn giản) |
'^0[0-9]{9,10}$' | SĐT VN (0 + 9-10 số) |
'^[0-9]{3}-[0-9]{3}-[0-9]{4}$' | Số điện thoại US xxx-xxx-xxxx |
Lưu ý hiệu năng
- REGEXP không sử dụng index thông thường
- MySQL 8.0+: Có thể tạo functional index cho REGEXP
- Tránh REGEXP phức tạp trên bảng lớn, cân nhắc xử lý ở application layer
Thay thế đơn giản: LIKE
-- Chỉ kiểm tra prefix/suffix/simple pattern WHERE UserId LIKE 'User-%-%' WHERE UserId LIKE '%-%-%'