Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Dùng Regex tìm chuỗi chứa a-z, A-Z và 0-9 trong MySQL

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ị

UserIdCó 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