MySQL 提供 LIKE、REGEXP、FULLTEXT 三種模糊匹配機制,適用場景、效能特性、語法能力截然不同。本文系統對比三大方案,含轉義規則、正則元字元、全文搜尋閾值配置、實戰選型建議。
%:匹配任意長度字串 (含 0 字元)_:匹配任意單一字元WHERE col LIKE 'm%' -- 以 m/M 開頭 (不區分大小寫,依照 collation)
WHERE col LIKE '%m%' -- 包含 m/M
WHERE col LIKE '%m' -- 以 m/M 結尾
WHERE col LIKE '_m_' -- 長度 3 且中間為 m/M
-- 預設反斜線轉義
WHERE col LIKE '%50\%%' -- 包含 "50%"
WHERE col LIKE '%\_get%' -- 包含 "_get"
-- 自定義轉義字元 (ESCAPE)
WHERE col LIKE '%50/%%' ESCAPE '/' -- '/' 轉義下一個 '%'
WHERE col LIKE '%/_get%' ESCAPE '/' -- '/' 轉義 '_'
COLLATION 決定 (如 utf8mb4_general_ci 不敏感,utf8mb4_bin 敏感)。| 符號 | 含義 | 範例 |
|---|---|---|
| . | 任意單字元 | 'a.c' 匹配 abc, axc |
| ^ | 字串開頭 | '^abc' 以 abc 開頭 |
| $ | 字串結尾 | 'abc$' 以 abc 結尾 |
| [...] | 字元集合 | '[aeiou]' 匹配任一母音 |
| [^...] | 排除集合 | '[^0-9]' 非數字 |
| * | 前導出現 0 次或多次 | 'ab*c' 匹配 ac, abc, abbc |
| + | 前導出現 1 次或多次 | 'ab+c' 匹配 abc, abbc |
| ? | 前導出現 0 次或 1 次 | 'ab?c' 匹配 ac, abc |
| {n} | 前導出現 n 次 | '[0-9]{5}' 5 位數字 |
| {m,n} | 前導出現 m 到 n 次 | '[0-9]{5,11}' 5-11 位數字 |
| | | 或邏輯 | 'cat|dog' 匹配 cat 或 dog |
| (...) | 分組 | '(ab)+' 匹配 ab, abab |
WHERE col REGEXP '^50%{1,3}' -- 以 50%、50%%、50%%% 開頭
WHERE col REGEXP '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' -- 日期格式 YYYY-MM-DD
REGEXP_LIKE() 並支援函數索引,但仍不建議高頻核心查詢使用。CREATE TABLE articles (
id INT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT KEY ft_title_body (title, body)
) ENGINE=InnoDB;
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('mysql performance');
計算相關性分數,按分數降序返回。50% 閾值規則:若詞項出現在超過 50% 行中,視為噪音詞自動忽略 (導致搜「the」無結果)。
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('+mysql -oracle' IN BOOLEAN MODE);
-- + 必須包含, - 必須排除, * 萬用字元, "精確短語"
繞過 50% 閾值,支援邏輯運算,不計算相關性分數。
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('mysql' WITH QUERY EXPANSION);
-- 先自然語言搜尋,取高分文檔關鍵詞再二次搜尋
-- 最小索引詞長度 (預設 4,導致搜 "you" 無果)
SET GLOBAL innodb_ft_min_token_size = 2; -- InnoDB
SET GLOBAL ft_min_word_len = 2; -- MyISAM
-- 修改後需 REPAIR TABLE / ALTER TABLE ... FORCE 重建索引,並重啟生效
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 前綴匹配、簡單包含、固定模式 | LIKE | 可用索引、語法簡單、標準 SQL |
| 複雜格式驗證 (郵箱、手機號、身分證) | REGEXP / 應用層驗證 | 表達力強,但 DB 層慎用 |
| 文章/日志/文檔關鍵字搜尋、相關性排序 | FULLTEXT | 專業檢索功能、支援分詞、權重 |
| 高併發、毫秒級響應、精確匹配 | Elasticsearch / OpenSearch | 專業搜尋引擎、分散式、功能完整 |
innodb_ft_min_token_size 並重建索引。架構建議: 業務搜尋功能上線即接入 Elasticsearch/OpenSearch,MySQL FULLTEXT 僅作為極簡單場景或原型驗證備選。REGEXP 僅用於 DDL/遷移腳本/低頻管理查詢,嚴禁核心業務高頻路徑。