Tìm chuỗi chứa cả chữ cái (a-z, A-Z) và số (0-9) trong MySQL
Sử dụng REGEXP BINARY (phân biệt chữ hoa/thường) kết hợp toán tử AND để kiểm tra chuỗi phải chứa ít nhất 1 ký tự từ mỗi nhóm: chữ thường, chữ hoa, chữ số.
Ví dụ minh họa
Tạo bảng DemoTable738:
mysql> CREATE TABLE DemoTable738 (UserId VARCHAR(100)); Query OK, 0 rows affected (0.81 sec)
Chèn dữ liệu:
mysql> INSERT INTO DemoTable738 VALUES('John');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable738 VALUES('sAm456');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DemoTable738 VALUES('98Carol');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DemoTable738 VALUES('67david');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable738 VALUES('69MIKE');
Query OK, 1 row affected (0.18 sec)
Xem dữ liệu:
mysql> SELECT * FROM DemoTable738;
+---------+ | UserId | +---------+ | John | | sAm456 | | 98Carol | | 67david | | 69MIKE | +---------+ 5 rows in set (0.00 sec)
Tìm chuỗi chứa CẢ BA: chữ hoa, chữ thường, số:
mysql> SELECT * FROM DemoTable738 WHERE UserId REGEXP BINARY '[A-Z]' AND UserId REGEXP BINARY '[a-z]' AND UserId REGEXP BINARY '[0-9]';
Kết quả (chỉ 'sAm456' và '98Carol' thỏa mãn):
+---------+ | UserId | +---------+ | sAm456 | | 98Carol | +---------+ 2 rows in set (0.03 sec)
Giải thích
REGEXP BINARY '[A-Z]': Có ít nhất 1 chữ HOA (A-Z)REGEXP BINARY '[a-z]': Có ít nhất 1 chữ THƯỜNG (a-z)REGEXP BINARY '[0-9]': Có ít nhất 1 SỐ (0-9)BINARY: Phân biệt chữ hoa/thường (mặc định MySQL collation thường case-insensitive)AND: Phải thỏa mãn CẢ 3 điều kiện cùng lúc
Phân tích từng giá trị
| UserId | Có A-Z? | Có a-z? | Có 0-9? | Kết quả |
|---|---|---|---|---|
| John | ✅ (J) | ✅ (ohn) | ❌ | ❌ Loại |
| sAm456 | ✅ (A) | ✅ (s,m) | ✅ (456) | ✅ Giữ |
| 98Carol | ✅ (C) | ✅ (arol) | ✅ (98) | ✅ Giữ |
| 67david | ❌ | ✅ (david) | ✅ (67) | ❌ Loại |
| 69MIKE | ✅ (MIKE) | ❌ | ✅ (69) | ❌ Loại |
Pattern Regex đơn lẻ (MySQL 8.0+)
MySQL 8.0 hỗ trợ Lookahead (positive lookahead) cho regex phức tạp hơn:
-- MySQL 8.0+ chỉ (không hoạt động MySQL 5.7) SELECT * FROM DemoTable738 WHERE UserId REGEXP '^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).+$';
Ứng dụng: Validate mật khẩu mạnh
-- Yêu cầu: ít nhất 8 ký tự, có hoa, thường, số, ký tự đặc biệt WHERE password REGEXP BINARY '[A-Z]' AND password REGEXP BINARY '[a-z]' AND password REGEXP BINARY '[0-9]' AND password REGEXP BINARY '[!@#$%^&*]' AND CHAR_LENGTH(password) >= 8