REGEXP vs LIKE
LIKE:整欄匹配,通配符 %(任意長度)、_(單字元),功能有限。
REGEXP:欄值內部模式匹配,支援正則元字元,功能強大。
建立測試資料
CREATE TABLE t_regcustomer (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(256),
age INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
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 '.鵬.' | . 匹配任意單字元 |
| 以「王」開頭 | WHERE name REGEXP '^王' | ^ 鎖定開頭 |
| 大小寫敏感匹配「s」開頭 | WHERE name REGEXP BINARY '^s' | BINARY 區分大小寫 |
| 包含 a 或 s | WHERE name REGEXP BINARY 'a|s' | | 表示 OR |
| 「鵬」後跟 1/2/3 | WHERE name REGEXP BINARY '鵬[123]' | [] 字元類別 |
| 「鵬」後跟任意數字 | WHERE name REGEXP BINARY '鵬[0-9]' | [0-9] 範圍 |
| 匹配字面「.」 | WHERE name REGEXP '\\.' | \\ 轉義(MySQL 需雙反斜線) |
| POSIX 字元類別:數字 | WHERE name REGEXP '[[:digit:]]' | 外層 [] 內含 [:digit:] |
| 數字出現 1-3 次 | WHERE name REGEXP '[0-9]{1,3}' | {n,m} 量詞 |
| 詞邊界:以 name 開頭 | WHERE name REGEXP '[[:<:]]name' | [[:<:]] 詞首 |
| 詞邊界:以 name 結尾 | WHERE name REGEXP 'name[[:>:]]' | [[:>:]] 詞尾 |
效能提示
REGEXP 無法使用普通 B-Tree 索引,會全表掃描。
- 大表建議:
1. 先用 LIKE 'prefix%' 利用索引過濾大部分行。
2. 再在應用層或用戶定義函數(UDF)做精細正則。
3. MySQL 8.0+ 可建立函數索引:CREATE INDEX idx_name_regex ON t((name REGEXP 'pattern'))(需固定模式)。