MySQL 的 LIKE 雖支援模糊查詢,但功能有限。REGEXP 引入正則表達式,大幅增強模式匹配能力。本文通過實戰數據集,系統講解核心用法。
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);
.SELECT * FROM t_regcustomer WHERE name REGEXP '.鵬.';
匹配包含「鵬」且前後各有一字符的記錄(如「大鵬」、「鵬鵬」)。
^ 開頭、$ 結尾SELECT * FROM t_regcustomer WHERE name REGEXP '^王';
僅匹配以「王」開頭的姓名。
BINARYSELECT * FROM t_regcustomer WHERE name REGEXP BINARY '^s';
區分大小寫,僅匹配小寫「s」開頭。
|SELECT * FROM t_regcustomer WHERE name REGEXP BINARY 'a|s';
匹配包含「a」或「s」的記錄。
[...] 與範圍 [a-z]-- 匹配「鵬」後跟 1/2/3 SELECT * FROM t_regcustomer WHERE name REGEXP BINARY '鵬[123]'; -- 匹配「鵬」後跟任意數字 SELECT * FROM t_regcustomer WHERE name REGEXP BINARY '鵬[1-9]';
\\MySQL 需雙重轉義,如匹配字面點號:\\.
更多語法(量詞、POSIX 字符類、定位符等)請參考《MySQL必知必會》第 68 頁正則表達式章節。
REGEXP 無法使用普通索引,大表查詢建議配合全文索引或應用層預過濾掌握 REGEXP,讓 SQL 查詢不再受限於 LIKE 的簡陋模式。