LIKE 僅支持 %(任意字符)與 _(單字符)通配,無法表達「以某字符開頭」、「包含數字」、「多選一」等複雜模式。MySQL 的 REGEXP 引入 POSIX 正則子集,彌補此短板。
CREATE TABLE t_regcustomer (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(256),
age INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO t_regcustomer (name, age) VALUES
('王明',20), ('王大',21), ('小王',22), ('小王2',22),
('敲不死',23), ('憨憨',24), ('憨憨2',24),
('郭靖名',25), ('郭靖2',25), ('郭靖3',25),
('郭得缸',25), ('大鵬',20), ('大鵬2',20), ('大鵬3',20),
('二鵬',19), ('鵬鵬',18), ('鵬鵬1',18), ('小鵬',17),
('AAA',17), ('aaa',17), ('SS',17), ('s2',17), ('ss',17);
| 需求 | SQL 片段 | 說明 |
|---|---|---|
| 包含「鵬」 | WHERE name REGEXP '鵬' | 等同 LIKE '%鵬%' |
| 任意單字符 + 鵬 + 任意單字符 | WHERE name REGEXP '.鵬.' | . 匹配任意單字符 |
| 以「王」開頭 | WHERE name REGEXP '^王' | ^ 錨定行首 |
| 以「2」結尾 | WHERE name REGEXP '2$' | $ 錨定行尾 |
| 大小寫敏感匹配「s」開頭 | WHERE name REGEXP BINARY '^s' | BINARY 強制二進制比較 |
| 包含 a 或 s | WHERE name REGEXP BINARY 'a|s' | | 表示或 |
| 「鵬」後跟 1/2/3 | WHERE name REGEXP BINARY '鵬[123]' | [] 字符組 |
| 「鵬」後跟任意數字 | WHERE name REGEXP BINARY '鵬[0-9]' | - 表示範圍 |
| 轉義特殊字符 | WHERE name REGEXP '\\.' | 雙反斜杠轉義 |
REGEXP 不區分大小寫(預設),加 BINARY 區分REGEXP_REPLACE()、REGEXP_SUBSTR() 等新函數更多語法請參考《MySQL必知必會》第 68 頁正則表達式章節。