MySQL REGEXP(及同義詞 RLIKE)支援 POSIX 正則表達式,比 LIKE 更強大,適用於複雜模式匹配場景。本文系統整理語法、元字符、實戰案例與性能建議。
SELECT * FROM table WHERE column REGEXP 'pattern';
SELECT * FROM table WHERE column RLIKE 'pattern';
SELECT * FROM table WHERE column NOT REGEXP 'pattern';
BINARY 區分:REGEXP BINARY '^A'^、$ 錨定首尾| 元字符 | 含義 | 示例 |
|---|---|---|
. | 任意單字符 | 'a.c' 匹配 abc、axc |
[...] | 字符類,匹配括號內任一字符 | '[abc]'、'[a-z]'、'[0-9]' |
[^...] | 否定字符類 | '[^0-9]' 非數字 |
* | 前一元素 0 次或多次 | 'ab*c' 匹配 ac、abc、abbc |
+ | 前一元素 1 次或多次 | 'ab+c' 匹配 abc、abbc |
? | 前一元素 0 次或 1 次 | 'ab?c' 匹配 ac、abc |
{n} | 恰好 n 次 | 'a{3}' = aaa |
{m,n} | m 到 n 次 | 'a{2,4}' = aa~aaaa |
^ | 字符串開頭 | '^abc' |
$ | 字符串結尾 | 'abc$' |
| | 或運算 | 'cat|dog' |
(...) | 分組 | '(ab)*' 匹配空、ab、abab |
[:class:] | POSIX 字符類 | '[[:digit:]]' = '[0-9]' |
[[:<:]] [[:>:]] | 單詞邊界 | '[[:<:]]word[[:>:]]' |
[:alnum:] 字母數字[:alpha:] 字母[:digit:] 數字[:lower:] 小寫[:upper:] 大寫[:space:] 空白字符[:punct:] 標點[:xdigit:] 十六進制-- 以 b 開頭
SELECT * FROM pet WHERE name REGEXP '^b';
-- 以 fy 結尾
SELECT * FROM pet WHERE name REGEXP 'fy$';
-- 包含 w
SELECT * FROM pet WHERE name REGEXP 'w';
-- 精確 5 字符
SELECT * FROM pet WHERE name REGEXP '^.{5}$';
-- 查詢包含底線 _ 的記錄(LIKE 需轉義,REGEXP 更直觀)
SELECT * FROM t WHERE col RLIKE '.[_].';
字段 t1 值如 1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2,需求:第 1、3、10 個逗號前的數字在 3-5 之間,其餘 1-5。
SELECT * FROM tb WHERE t1 REGEXP
'^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]$';
-- 匹配字面量 '1+2'(+ 是元字符,需雙反斜槓轉義)
SELECT '1+2' REGEXP '1\\+2'; -- 返回 1
LIKE 'prefix%' 可用索引,REGEXP 通常全表掃描REGEXP '^abc' 可利用索引,REGEXP 'abc' 不能SELECT 'test' REGEXP 'pattern' 快速驗證| 特性 | LIKE | REGEXP |
|---|---|---|
| 通配符 | %、_ | 完整正則語法 |
| 匹配模式 | 整串匹配 | 子串匹配(除非用 ^$) |
| 索引利用 | 前綴可用 | 極難利用 |
| 性能 | 快 | 慢 |
| 適用場景 | 前綴/後綴/簡單包含 | 複雜格式驗證、數據清洗 |
REGEXP 是 MySQL 處理複雜文本模式的利器,但性能代價高。遵循「能用 LIKE 就不用 REGEXP,能用索引就不用全表掃描」原則,在數據驗證、清洗、異構數據遷移等場景發揮最大價值。