LIKE 僅支援 %(任意字串)、_(單字元),無法表達「開頭數字」、「郵箱格式」、「多選一」等複雜模式。REGEXP 引入正則表達式,大幅擴展模糊查詢能力。
SELECT * FROM `t_regcustomer` WHERE `name` REGEXP 'pattern';
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);
| 需求 | REGEXP 模式 | 說明 |
|---|---|---|
| 包含「鵬」 | '鵬' | 任意位置匹配 |
| 以「王」開頭 | '^王' | ^ 鎖定開頭 |
| 以「2」結尾 | '2$' | $ 鎖定結尾 |
| 任意單字元 + 鵬 + 任意單字元 | '.鵬.' | . 匹配任意一字元 |
| 大小寫敏感匹配「s」開頭 | BINARY '^s' | BINARY 區分大小寫 |
| 或運算:包含 a 或 s | BINARY 'a|s' | | 表示或 |
| 字元集合:鵬後跟 1/2/3 | '鵬[123]' | [] 字元類別 |
| 範圍:鵬後跟 1-9 | '鵬[1-9]' | - 表示範圍 |
| 排除:鵬後非數字 | '鵬[^0-9]' | ^ 在 [] 內表示非 |
| 量詞:一個或多個數字 | '[0-9]+' | + ≥1,* ≥0,? 0或1 |
| 分組:郵箱簡易 | '^[^@]+@[^@]+\\.[^@]+$' | () 分組,\\. 轉義點 |
SELECT * FROM `t_regcustomer` WHERE `name` REGEXP '^大鵬[0-9]*$' AND `age` > 18;
REGEXP_REPLACE)SELECT REGEXP_REPLACE(`name`, '[0-9]', '') AS `clean_name` FROM `t_regcustomer`;
REGEXP_SUBSTR)SELECT REGEXP_SUBSTR(`name`, '[0-9]+') AS `first_number` FROM `t_regcustomer`;
REGEXP 不使用索引(全表掃描),大表慎用。LIKE 粗略過濾再 REGEXP 精確匹配:WHERE name LIKE '%鵬%' AND name REGEXP '^大鵬[0-9]*$'\\d、\\w、前瞻/後顧)。utf8mb4 下中文字元視為單字元,. 可匹配。REGEXP 讓 MySQL 具備強大的模式匹配能力,適合資料清洗、異常檢測、格式驗證等場景。掌握^ $ . [] | + * ? () BINARY 核心語法,配合 LIKE 索引預過濾,能在不引入外部引擎下完成 90% 複雜匹配需求。