萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 正則表達式 REGEXP 入門與實戰範例

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 或 sWHERE name REGEXP BINARY 'a|s'| 表示 OR
「鵬」後跟 1/2/3WHERE 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'))(需固定模式)。
copyright © 萬盛學電腦網 all rights reserved