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

Tìm kiếm theo mẫu cụ thể trong MySQL với REGEXP?

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

PatternMô 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 '%-%-%'