- 1 1. Giới thiệu
- 2 2. Cơ bản về biểu thức chính quy và cú pháp trong MySQL
- 3 Tóm tắt
- 4 3. Các hàm biểu thức chính quy được thêm vào MySQL 8.0 và các phiên bản sau
- 5 4. Các ví dụ thực tế về Regular Expressions trong MySQL
- 6 Tóm Tắt
- 7 5. Các Lưu Ý Quan Trọng Khi Sử Dụng Biểu Thức Chính Quy (Hiệu Suất và Bảo Mật)
- 8 Tóm Tắt
- 9 6. Câu Hỏi Thường Gặp (FAQ)
- 9.1 6.1 Tôi có thể sử dụng mẫu regex nào trong MySQL?
- 9.2 6.2 Sự khác biệt giữa LIKE và REGEXP là gì?
- 9.3 6.3 Sự khác biệt về tính năng regex giữa MySQL 5.x và MySQL 8.x là gì?
- 9.4 6.4 Tôi nên làm gì nếu một regex không hoạt động như mong đợi?
- 9.5 6.5 Làm thế nào để cải thiện hiệu suất của các truy vấn REGEXP?
- 10 Tóm Tắt
- 11 7. Tóm tắt
1. Giới thiệu
Sử dụng biểu thức chính quy trong MySQL
MySQL là một hệ quản trị cơ sở dữ liệu mạnh mẽ cho việc tìm kiếm và thao tác dữ liệu, đồng thời nó cũng hỗ trợ biểu thức chính quy (REGEXP) để cho phép tìm kiếm linh hoạt hơn. Với biểu thức chính quy, bạn có thể trích xuất dữ liệu khớp với các mẫu cụ thể một cách hiệu quả, cũng như định dạng hoặc kiểm tra tính hợp lệ của dữ liệu.
Lợi ích của việc sử dụng biểu thức chính quy trong MySQL
Việc sử dụng biểu thức chính quy trong MySQL mang lại các lợi ích như:
- Tìm kiếm nâng cao : Dễ dàng trích xuất dữ liệu chứa các chuỗi hoặc mẫu cụ thể.
- Kiểm tra tính toàn vẹn dữ liệu : Hữu ích cho việc xác thực đầu vào (ví dụ, kiểm tra định dạng địa chỉ email).
- Mạnh hơn so với toán tử LIKE : So với LIKE, vốn chỉ sử dụng các ký tự đại diện (
%và_), REGEXP cho phép bạn định nghĩa các điều kiện tìm kiếm phức tạp một cách linh hoạt hơn.
Mục đích và cấu trúc của bài viết này
Bài viết này giải thích mọi thứ từ những kiến thức cơ bản về biểu thức chính quy trong MySQL đến các cách sử dụng nâng cao, tối ưu hiệu năng, và các hàm biểu thức chính quy mới được giới thiệu trong MySQL 8.0 trở lên. Với các ví dụ thực tế, nội dung được thiết kế để người mới bắt đầu cũng có thể nắm bắt dễ dàng.
Cấu trúc bài viết:
- Cơ bản về biểu thức chính quy và cú pháp trong MySQL
- Các hàm biểu thức chính quy được thêm vào MySQL 8.0 trở lên
- Các ví dụ thực tiễn (xác thực, trích xuất dữ liệu, chuyển đổi định dạng)
- Những lưu ý quan trọng khi sử dụng biểu thức chính quy (hiệu năng, bảo mật)
- Câu hỏi thường gặp (FAQ)
- Tổng kết
2. Cơ bản về biểu thức chính quy và cú pháp trong MySQL
Cách sử dụng biểu thức chính quy trong MySQL
Trong MySQL, bạn sử dụng toán tử REGEXP (hoặc RLIKE) để làm việc với biểu thức chính quy. Tương tự như toán tử LIKE, nó được dùng để xác định xem giá trị của một cột có khớp với mẫu regex được chỉ định hay không.
Cú pháp cơ bản
SELECT * FROM table_name WHERE column_name REGEXP 'regex_pattern';
Hoặc
SELECT * FROM table_name WHERE column_name RLIKE 'regex_pattern';
RLIKE là một bí danh của REGEXP, và cả hai đều hoạt động giống nhau.
Ví dụ
Ví dụ, để tìm các bản ghi mà trường tên chứa ký tự “山”:
SELECT * FROM users WHERE name REGEXP '山';
Các mẫu biểu thức chính quy cơ bản
Trong biểu thức chính quy của MySQL, bạn có thể sử dụng các mẫu như sau.
| Symbol | Meaning | Example | Result |
|---|---|---|---|
. | Any single character | a.c | Matches “abc”, “aac”, “adc” |
^ | Start of the string | ^abc | Matches “abcde” but not “dabc” |
$ | End of the string | xyz$ | Matches “axyz” but not “xyzb” |
[] | Any one of the specified characters | [abc] | Matches “a”, “b”, or “c” |
[^] | Any character not in the specified set | [^abc] | Matches any character except “a”, “b”, or “c” |
* | Repeat the preceding character 0 or more times | a* | Matches “”, “a”, “aa”, “aaa”, etc. |
+ | Repeat the preceding character 1 or more times | a+ | Matches “a”, “aa”, “aaa”, etc. (does not match the empty string) |
{n} | Repeat the preceding character exactly n times | a{3} | Matches “aaa” |
{n,} | Repeat the preceding character at least n times | a{2,} | Matches “aa”, “aaa”, “aaaa”, etc. |
{n,m} | Repeat the preceding character between n and m times | a{2,4} | Matches “aa”, “aaa”, “aaaa” |
Khác biệt so với toán tử LIKE
MySQL cũng cung cấp toán tử LIKE, thường được dùng cho việc khớp mẫu đơn giản. Tuy nhiên, REGEXP mạnh hơn LIKE và hỗ trợ tìm kiếm với các điều kiện phức tạp hơn.
Ví dụ 1: Sử dụng toán tử LIKE
SELECT * FROM users WHERE name LIKE '%山%';
- Với
LIKE, bạn có thể tìm dữ liệu chứa山, nhưng chỉ có thể dùng các ký tự đại diện đơn giản (%và_).
Ví dụ 2: Sử dụng toán tử REGEXP
SELECT * FROM users WHERE name REGEXP '^山';
- Với
REGEXP, bạn có thể trích xuất chỉ những dữ liệu mà tên bắt đầu bằng 山.
Cách chỉ định nhiều mẫu
Bạn có thể dùng | để chỉ định nhiều mẫu với điều kiện OR.
Ví dụ: Lấy người dùng có họ là “佐藤” hoặc “田中”
SELECT * FROM users WHERE name REGEXP '佐藤|田中';
Khớp phủ định
Nếu bạn dùng ^ bên trong dấu ngoặc vuông, bạn có thể lấy dữ liệu “không chứa các ký tự được chỉ định”.
Ví dụ: Dữ liệu bắt đầu bằng ký tự khác “山”
SELECT * FROM users WHERE name REGEXP '^[^山]';
Trong trường hợp này, nó sẽ trả về các bản ghi mà tên không bắt đầu bằng 山.
Tóm tắt
- Trong MySQL,
REGEXPcho phép tìm kiếm mẫu mạnh mẽ hơn so vớiLIKE. - Hiểu cú pháp và các mẫu cơ bản (
.,^,$,[],*,+, v.v.) giúp thực hiện tìm kiếm linh hoạt. - Việc nắm rõ sự khác biệt so với
LIKEvà sử dụng mỗi công cụ một cách phù hợp là quan trọng. - Sử dụng
|cho phép tìm kiếm với nhiều mẫu. - Sử dụng lớp ký tự phủ định
[^ ]giúp bạn tìm dữ liệu không bắt đầu bằng các ký tự cụ thể.
3. Các hàm biểu thức chính quy được thêm vào MySQL 8.0 và các phiên bản sau
Trong MySQL 8.0, bên cạnh toán tử REGEXP truyền thống, bốn hàm mới đã được thêm vào để cho phép tìm kiếm biểu thức chính quy linh hoạt hơn. Những hàm này cho phép lấy vị trí khớp, trích xuất chuỗi con và thực hiện thay thế, mở rộng đáng kể những gì bạn có thể làm với regex trong MySQL.
Trong phần này, chúng tôi sẽ giải thích chi tiết từng hàm biểu thức chính quy mới và đưa ra các ví dụ cụ thể.
3.1 REGEXP_LIKE()
Tổng quan
REGEXP_LIKE(), giống như toán tử REGEXP, kiểm tra xem giá trị của cột có khớp với mẫu regex được chỉ định hay không.
Cú pháp
REGEXP_LIKE(column_name, 'regex_pattern' [, flags])
column_name: cột cần tìm kiếm'regex_pattern': mẫu regex được sử dụng làm điều kiệnflags (optional): độ nhạy chữ hoa/thường (sử dụngiđể không phân biệt chữ hoa/thường)
Ví dụ
“Lấy danh sách người dùng có email kết thúc bằng gmail.com hoặc yahoo.co.jp”
SELECT * FROM users WHERE REGEXP_LIKE(email, '(@gmail\.com|@yahoo\.co\.jp)$');
“Tìm kiếm tên người dùng chứa ‘admin’ (không phân biệt chữ hoa/thường)”
SELECT * FROM users WHERE REGEXP_LIKE(username, 'admin', 'i');
✅ REGEXP_LIKE() có cùng mục đích với toán tử REGEXP, nhưng nó cho phép một phong cách thân thiện hơn với chuẩn SQL.
3.2 REGEXP_INSTR()
Tổng quan
REGEXP_INSTR() trả về vị trí (chỉ số bắt đầu) nơi một khớp regex xuất hiện trong một chuỗi.
Cú pháp
REGEXP_INSTR(column_name, 'regex_pattern' [, start_position, occurrence, return_option, flags])
start_position(tùy chọn): vị trí bắt đầu tìm kiếm (mặc định: 1)occurrence(tùy chọn): lần xuất hiện nào của khớp cần trả về (mặc định: 1)return_option(tùy chọn): 0 (trả về vị trí bắt đầu) hoặc 1 (trả về vị trí kết thúc của khớp)flags(tùy chọn): sử dụngiđể không phân biệt chữ hoa/thường
Ví dụ
“Nếu số điện thoại bắt đầu bằng 090 hoặc 080, lấy vị trí bắt đầu”
SELECT phone, REGEXP_INSTR(phone, '^(090|080)') AS match_pos FROM users;
“Lấy vị trí bắt đầu của phần miền trong địa chỉ email”
SELECT email, REGEXP_INSTR(email, '@') AS domain_start FROM users;
- Nó trả về vị trí mà ký tự
@được tìm thấy (ví dụ,user@example.comtrả về5).
✅ Với REGEXP_INSTR(), bạn có thể lấy thông tin vị trí, mở rộng các tùy chọn xử lý chuỗi của mình.
3.3 REGEXP_SUBSTR()
Tổng quan
REGEXP_SUBSTR() trích xuất chuỗi con khớp với mẫu regex từ một chuỗi.
Cú pháp
REGEXP_SUBSTR(column_name, 'regex_pattern' [, start_position, occurrence, flags])
occurrence(tùy chọn): lấy khớp thứ n (mặc định: 1)flags(tùy chọn): độ nhạy chữ hoa/thường (iđể bỏ qua phân biệt)
Ví dụ
“Trích xuất chỉ phần miền từ địa chỉ email”
SELECT email, REGEXP_SUBSTR(email, '@[a-zA-Z0-9.-]+') AS domain FROM users;
“Lấy chuỗi số đầu tiên trong một tin nhắn”
SELECT message, REGEXP_SUBSTR(message, '[0-9]+') AS first_number FROM logs;
✅ Với REGEXP_SUBSTR(), bạn có thể trích xuất các mẫu cụ thể và sử dụng chúng để tổ chức và chuyển đổi dữ liệu.
3.4 REGEXP_REPLACE()
Tổng quan
REGEXP_REPLACE() thay thế các chuỗi con khớp với mẫu regex bằng một chuỗi khác.
Cú pháp
REGEXP_REPLACE(column_name, 'regex_pattern', 'replacement' [, occurrence, flags])
replacement: chuỗi sẽ thay thế phần khớpoccurrence(tùy chọn): chỉ thay thế lần khớp thứ n (nếu bỏ qua, sẽ thay thế tất cả các khớp)flags(tùy chọn): sử dụngiđể khớp không phân biệt chữ hoa chữ thường
Ví dụ
“Xóa dấu gạch nối (-) khỏi số điện thoại”
SELECT phone, REGEXP_REPLACE(phone, '-', '') AS clean_phone FROM users;
“Xóa thẻ HTML”
SELECT comment, REGEXP_REPLACE(comment, '<[^>]+>', '') AS clean_text FROM reviews;
✅ Với REGEXP_REPLACE(), việc chuyển đổi định dạng và làm sạch dữ liệu trở nên dễ dàng.
3.5 Tóm tắt
| Function | Purpose | Example |
|---|---|---|
REGEXP_LIKE() | Check whether a value matches a regex pattern | SELECT * FROM users WHERE REGEXP_LIKE(email, '@gmail\.com$'); |
REGEXP_INSTR() | Get the start position of the matched substring | SELECT REGEXP_INSTR(email, '@') FROM users; |
REGEXP_SUBSTR() | Extract the matched substring | SELECT REGEXP_SUBSTR(email, '@[a-zA-Z0-9.-]+') FROM users; |
REGEXP_REPLACE() | Replace the matched substring | SELECT REGEXP_REPLACE(phone, '-', '') FROM users; |
4. Các ví dụ thực tế về Regular Expressions trong MySQL
Bằng cách tận dụng regular expressions của MySQL, bạn có thể tối ưu hoá các tác vụ xử lý dữ liệu thực tế như xác thực dữ liệu, trích xuất dữ liệu cụ thể, và chuyển đổi định dạng. Trong phần này, chúng tôi giới thiệu các trường hợp sử dụng thực tế kèm mã SQL và giải thích.
4.1 Xác thực địa chỉ Email
Tổng quan
Sử dụng regular expressions để kiểm tra xem các địa chỉ email lưu trong cơ sở dữ liệu có tuân theo định dạng hợp lệ hay không.
SQL cần dùng
SELECT email FROM users
WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';
Giải thích
^[a-zA-Z0-9._%+-]+→ một hoặc nhiều ký tự alphanumeric, dấu chấm, gạch dưới, hoặc dấu cộng trước@@[a-zA-Z0-9.-]+→ một tên miền sau@\.[a-zA-Z]{2,}$→ kết thúc bằng TLD (Tên miền cấp cao nhất) có ít nhất 2 ký tự (ví dụ:.com,.jp,.net)
Với truy vấn này, bạn có thể loại bỏ các địa chỉ email không hợp lệ (ví dụ: user@@example.com, user@.com).
4.2 Kiểm tra định dạng số điện thoại Nhật Bản
Tổng quan
Xác định xem các số điện thoại Nhật Bản thông dụng (ví dụ: 090-1234-5678, 03-1234-5678) có tuân theo định dạng đúng hay không.
SQL cần dùng
SELECT phone FROM users
WHERE phone REGEXP '^(0[789]0-[0-9]{4}-[0-9]{4}|0[1-9]-[0-9]{4}-[0-9]{4})$';
Giải thích
0[789]0-[0-9]{4}-[0-9]{4}→ số di động (090-xxxx-xxxx,080-xxxx-xxxx, v.v.)0[1-9]-[0-9]{4}-[0-9]{4}→ số cố định (03-xxxx-xxxx,06-xxxx-xxxx, v.v.)
Bằng cách này, regular expressions hữu ích khi cần đảm bảo tính nhất quán của định dạng.
4.3 Xác thực định dạng số thẻ tín dụng
Tổng quan
Xác thực định dạng của các số thẻ tín dụng (Visa, Mastercard, American Express, v.v.).
SQL cần dùng
SELECT card_number FROM payments
WHERE card_number REGEXP '^(4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})$';
Giải thích
^4[0-9]{12}(?:[0-9]{3})?$→ Visa (16 chữ số hoặc 13 chữ số)^5[1-5][0-9]{14}$→ Mastercard (16 chữ số)^3[47][0-9]{13}$→ American Express (15 chữ số)
Với truy vấn này, bạn có thể lọc bỏ các số thẻ không hợp lệ trong cơ sở dữ liệu (ví dụ: độ dài không đúng hoặc số đầu không hợp lệ).
4.4 Xóa thẻ HTML
Tổng quan
Nếu dữ liệu do người dùng gửi chứa thẻ HTML, bạn có thể xóa chúng và chuyển nội dung thành văn bản thuần.
SQL cần dùng
SELECT REGEXP_REPLACE(comment, '<[^>]+>', '') AS clean_comment FROM reviews;
Giải thích
'<[^>]+>'→ xóa tất cả các thẻ HTML nằm giữa<và>
Ví dụ
| Input | Output |
|---|---|
<b>Hello</b> World! | Hello World! |
<p>これはサンプルです</p> | これはサンプルです |
Điều này hữu ích cho việc loại bỏ thẻ HTML khỏi bình luận và bài viết blog của người dùng.
4.5 Xác thực định dạng mã bưu điện (Nhật Bản)
Tổng quan
Xác thực xem mã bưu điện Nhật Bản (ví dụ: 123-4567) có tuân theo định dạng đúng hay không.
SQL cần dùng
SELECT postal_code FROM addresses
WHERE postal_code REGEXP '^[0-9]{3}-[0-9]{4}$';
Giải thích
^[0-9]{3}-[0-9]{4}$→ một mã bưu điện ở định dạng “3 chữ số-4 chữ số”
Sử dụng regex này giúp duy trì tính nhất quán dữ liệu và ngăn ngừa các định dạng sai.
4.6 Lọc tên người dùng (Phát hiện từ không cho phép)
Tổng quan
Kiểm tra xem tên người dùng có chứa các từ bị cấm dành riêng cho hệ thống (ví dụ: admin, root, system) trong quá trình đăng ký.
SQL để Sử Dụng
SELECT username FROM users
WHERE username REGEXP 'admin|root|system';
Giải Thích
admin|root|system→ phát hiện tên người dùng chứa các thuật ngữ này
Truy vấn này giúp ngăn chặn người dùng thông thường sử dụng tên dành cho quản trị viên hệ thống.
Tóm Tắt
- Biểu thức chính quy có thể được sử dụng để xác thực địa chỉ email, số điện thoại và số thẻ tín dụng .
- Chúng cũng có thể được áp dụng để loại bỏ các thẻ HTML và chuyển đổi định dạng dữ liệu .
- Chúng hiệu quả trong việc cải thiện an toàn và tính nhất quán của cơ sở dữ liệu thông qua các nhiệm vụ như lọc các từ bị cấm và xác thực mã bưu điện .

5. Các Lưu Ý Quan Trọng Khi Sử Dụng Biểu Thức Chính Quy (Hiệu Suất và Bảo Mật)
Việc sử dụng biểu thức chính quy trong MySQL cho phép tìm kiếm mạnh mẽ và làm sạch dữ liệu. Tuy nhiên, sử dụng không đúng cách có thể gây suy giảm hiệu suất và giới thiệu rủi ro bảo mật. Phần này giải thích các lưu ý chính để sử dụng biểu thức chính quy MySQL một cách an toàn và hiệu quả.
5.1 Tối Ưu Hóa Hiệu Suất Cho Biểu Thức Chính Quy
Tìm kiếm regex của MySQL rất tiện lợi, nhưng nó có nhược điểm: các chỉ mục thường không áp dụng, điều này có thể làm cho các truy vấn chậm hơn.
Các Biện Pháp Để Cải Thiện Hiệu Suất
- Kết hợp
LIKEhoặc chỉ mụcFULLTEXTSELECT * FROM users WHERE email LIKE '%gmail.com';
- Sử dụng biểu thức chính quy đơn giản hơn
SELECT * FROM users WHERE name REGEXP '^admin|admin$';
- Lọc dữ liệu mục tiêu trước
SELECT * FROM users WHERE email LIKE 'a%' AND email REGEXP '^[a-zA-Z0-9._%+-]+@gmail\.com$';
5.2 Rủi Ro Bảo Mật và Các Biện Pháp Đối Phó
1. DoS Biểu Thức Chính Quy (ReDoS)
- Tránh các khớp không giới hạn như
.*. - Sử dụng
^và$để giới hạn phạm vi tìm kiếm. - Không truyền đầu vào của người dùng trực tiếp vào
REGEXP.
2. Tiêm Mã SQL và Biểu Thức Chính Quy
❌ Truy vấn không an toàn
SELECT * FROM users WHERE username REGEXP '$input';
✅ Truy vấn an toàn (sử dụng placeholder)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username REGEXP ?");
$stmt->execute([$sanitized_input]);
5.3 Tương Thích Phiên Bản
| Version | Main Features |
|---|---|
| MySQL 5.x | Only the REGEXP operator is available |
| MySQL 8.x | Adds REGEXP_LIKE(), REGEXP_INSTR(), REGEXP_SUBSTR(), and REGEXP_REPLACE() |
Tóm Tắt
- Vì
REGEXPkhông sử dụng chỉ mục, các biện pháp hiệu suất rất quan trọng. - Để ngăn chặn ReDoS (DoS Biểu Thức Chính Quy), tránh sử dụng quá mức các ký tự đại diện.
- Để ngăn chặn tiêm mã SQL, không áp dụng đầu vào của người dùng trực tiếp vào
REGEXP.
6. Câu Hỏi Thường Gặp (FAQ)
Dưới đây là các câu hỏi phổ biến về việc sử dụng biểu thức chính quy MySQL (REGEXP). Giải quyết các vấn đề này sẽ giúp bạn sử dụng regex hiệu quả hơn.
6.1 Tôi có thể sử dụng mẫu regex nào trong MySQL?
| Symbol | Description | Example | Result |
|---|---|---|---|
. | Any single character | a.c | "abc", "aac", "adc" |
^ | Start of the string | ^abc | "abcde" (does not match "dabc") |
$ | End of the string | xyz$ | "axyz" (does not match "xyzb") |
[] | Any of the specified characters | [abc] | "a", "b", "c" |
[^] | Any character not in the specified set | [^abc] | Any character except "a", "b", "c" |
* | Repeat the preceding character 0 or more times | a* | "", "a", "aa", "aaa" |
+ | Repeat the preceding character 1 or more times | a+ | "a", "aa", "aaa" (does not match "") |
6.2 Sự khác biệt giữa LIKE và REGEXP là gì?
| Comparison | LIKE | REGEXP |
|---|---|---|
| Functionality | Simple pattern matching | Searching with complex regular expressions |
| Wildcards | % (any string), _ (any single character) | .* (any string), ^, $, [a-z], etc. |
| Search speed | Fast because indexes can apply | Often slower due to full table scans |
| Use cases | Simple searches (contains, prefix matching, etc.) | Complex searches based on specific patterns |
✅ Vì LIKE nhanh hơn, hãy ưu tiên LIKE cho các tìm kiếm đơn giản và sử dụng REGEXP khi cần khớp phức tạp.
6.3 Sự khác biệt về tính năng regex giữa MySQL 5.x và MySQL 8.x là gì?
| Version | Main Features |
|---|---|
| MySQL 5.x | Only the REGEXP operator is available |
| MySQL 8.x | Adds REGEXP_LIKE(), REGEXP_INSTR(), REGEXP_SUBSTR(), and REGEXP_REPLACE() |
6.4 Tôi nên làm gì nếu một regex không hoạt động như mong đợi?
✅ Danh sách kiểm tra
- Kiểm tra xem việc thoát ký tự có đúng không
SELECT * FROM users WHERE email REGEXP '\.com$';
- Thử cờ
ivớiREGEXP_LIKE()SELECT * FROM users WHERE REGEXP_LIKE(username, 'admin', 'i');
- Kiểm tra mã hóa dữ liệu
SHOW VARIABLES LIKE 'character_set_database';
6.5 Làm thế nào để cải thiện hiệu suất của các truy vấn REGEXP?
- Lọc trước với
LIKESELECT * FROM users WHERE email LIKE '%gmail.com' AND email REGEXP '^[a-zA-Z0-9._%+-]+@gmail\.com$';
- Sử dụng chỉ mục khi phù hợp
ALTER TABLE users ADD FULLTEXT(email);
Tóm Tắt
REGEXPmạnh hơn LIKE , nhưng bạn phải chú ý đến hiệu năng.- Trong MySQL 8.0, các hàm regex mới (như
REGEXP_LIKE()) đã được thêm vào, cho phép xử lý linh hoạt hơn. - Để cải thiện hiệu năng: kết hợp với LIKE, sử dụng chỉ mục, và thiết kế các mẫu regex đơn giản.
7. Tóm tắt
Biểu thức chính quy MySQL (REGEXP) rất hữu ích cho việc tìm kiếm dữ liệu, xác thực và chuyển đổi định dạng. Bài viết này đã đề cập đến các kiến thức cơ bản về regex trong MySQL, các tính năng mới được thêm vào MySQL 8.0 trở lên, các ví dụ thực tế, các lưu ý quan trọng, và các câu hỏi thường gặp.
7.1 Những điểm chính
Dưới đây là tóm tắt nhanh các điểm quan trọng nhất.
1. Kiến thức cơ bản về Biểu thức chính quy MySQL
- Sử dụng toán tử
REGEXPcho phép khớp mẫu linh hoạt hơn so vớiLIKE. - Các mẫu regex phổ biến
^(bắt đầu),$(kết thúc),.(bất kỳ ký tự đơn nào),[](lớp ký tự),+(một hoặc nhiều lần lặp), v.v.
2. Các hàm Biểu thức chính quy mới trong MySQL 8.0+
Trong MySQL 8.0, bốn hàm sau đã được thêm vào, cho phép xử lý linh hoạt hơn:
REGEXP_LIKE(): một lựa chọn thay thế cho toán tửREGEXPREGEXP_INSTR(): lấy vị trí bắt đầu của chuỗi con khớpREGEXP_SUBSTR(): trích xuất chuỗi con khớpREGEXP_REPLACE(): thay thế các chuỗi con bằng regex
3. Các ví dụ thực tế
- Xác thực địa chỉ email
- Kiểm tra số điện thoại và số thẻ tín dụng
- Xóa thẻ HTML
- Xác thực định dạng mã bưu chính
- Phát hiện các từ không cho phép
- Làm sạch dữ liệu (cắt bỏ khoảng trắng, loại bỏ dấu phẩy, v.v.)
4. Các lưu ý quan trọng khi sử dụng Biểu thức chính quy
- Tối ưu hoá hiệu năng
- Vì
REGEXPkhông sử dụng chỉ mục, nó có thể dẫn đến quét toàn bộ bảng. - Bạn có thể cải thiện hiệu năng bằng cách kết hợp
LIKEhoặc chỉ mụcFULLTEXT. - Các biện pháp bảo mật
- Để ngăn ReDoS (Regular Expression DoS), tránh sử dụng quá mức
.*. - Để ngăn SQL injection, sử dụng
placeholders.
5. Câu hỏi thường gặp (FAQ)
- Các mẫu regex có sẵn trong MySQL
- Sự khác nhau giữa
LIKEvàREGEXP - Sự khác nhau về tính năng giữa MySQL 5.x và 8.x
- Xử lý sự cố khi regex không hoạt động như mong đợi
- Các cách cải thiện hiệu năng
7.2 Các thực hành tốt nhất khi sử dụng Biểu thức chính quy
- Giữ mẫu regex đơn giản
- Ví dụ: Tránh lạm dụng
.*và sử dụng^(bắt đầu) và$(kết thúc).
- Kết hợp với
LIKEhoặcFULLTEXTkhi phù hợp
- Lọc trước bằng
LIKE, sau đó áp dụngREGEXPđể giảm chi phí truy vấn.
- Sử dụng
REGEXP_REPLACE()để làm sạch dữ liệu
- Ví dụ: Xóa thẻ HTML và chuẩn hoá các khoảng trắng không cần thiết.
- Tận dụng MySQL 8.0 trở lên
- Sử dụng các hàm mới như
REGEXP_LIKE()có thể làm cho SQL dễ đọc hơn.
- Áp dụng các biện pháp bảo mật một cách kỹ lưỡng
- Không áp dụng đầu vào của người dùng trực tiếp vào
REGEXP(ngăn ngừa SQL injection). - Sử dụng
placeholderscho các truy vấn động.
7.3 Tài nguyên để học thêm
Dưới đây là các tài liệu tham khảo giúp bạn học sâu hơn về biểu thức chính quy MySQL.
Tài liệu chính thức
7.4 Lưu ý cuối cùng
Biểu thức chính quy MySQL có thể được sử dụng trong nhiều tình huống, bao gồm tìm kiếm dữ liệu, làm sạch và xác thực. Tuy nhiên, cần sử dụng chúng một cách phù hợp đồng thời hiểu rõ các lưu ý về hiệu năng và bảo mật.
Chúng tôi hy vọng bài viết này sẽ giúp bạn khi làm việc với biểu thức chính quy MySQL. Hãy thử áp dụng các kỹ thuật này trong dự án của bạn!


