MySQL 模糊匹配雙引擎:SQL 模式(LIKE)vs 正則模式(REGEXP)
一、SQL 模式(LIKE)
預設**不區分大小寫**。**必須用 LIKE/NOT LIKE,不能用 =/!=**。
兩大通配符
| 符號 | 含義 | 範例 | 匹配結果 |
% | 任意長度(含 0) | LIKE '%三%' | 張三、張貓三、三腳貓、唐三藏 |
_ | 單個任意字符 | LIKE '_三_' | 唐三藏(三字、中間是三) |
多條件組合
-- 同時含「三」和「貓」
WHERE u_name LIKE '%三%' AND u_name LIKE '%貓%'
-- 以「三」開頭、以「貓」結尾
WHERE u_name LIKE '三%貓'
二、正則模式(REGEXP / RLIKE)
**區分大小寫**。支援擴展正則表達式。
核心元字符
| 符號 | 含義 | 範例 |
. | 任意單字符(單字節) | REGEXP 'a.c' 匹配 abc、axc |
[...] | 字符集合 | [abc]、[a-z]、[0-9] |
[^...] | 排除集合 | [^0-9] 非數字 |
* | 前面元素 0~n 次 | ab*c 匹配 ac、abc、abbc |
+ | 前面元素 1~n 次 | ab+c 匹配 abc、abbc |
^ | 字符串開頭 | ^三 以三開頭 |
$ | 字符串結尾 | 三$ 以三結尾 |
{n} | 重複 n 次 | b{2}$ 以 bb 結尾 |
大小寫不敏感技巧
WHERE u_name REGEXP '[aA]' -- 匹配 a 或 A
WHERE u_name REGEXP '[a-zA-Z]' -- 任意字母
三、REGEXP 重寫 LIKE 經典場景
| 需求 | LIKE 寫法 | REGEXP 寫法 |
| 以「三」開頭 | LIKE '三%' | REGEXP '^三' |
| 以「三」結尾 | LIKE '%三' | REGEXP '三$' |
| 含「三」 | LIKE '%三%' | REGEXP '三' |
| 第三字符是「三」 | LIKE '__三%' | REGEXP '^..三' |
四、中文注意事項
- 正則中
. 匹配**單字節**,UTF8 中文佔 3 字節 → . 會拆散中文
- 建議中文場景優先用 LIKE,或用
CHAR_LENGTH 配合 SUBSTR
- MySQL 8.0+
REGEXP 支援 Unicode 字符屬性(\p{Han})
選擇建議
- 簡單前綴/後綴/包含:**LIKE**(可走索引前綴)
- 複雜模式、邊界、數量詞:**REGEXP**
- 效能敏感:避免開頭通配符
%xxx,考慮全文索引或外部搜索引擎