| 特性 | SQL 標準模式 (LIKE) | 擴展正則表達式 (REGEXP/RLIKE) |
|---|---|---|
| 操作符 | `LIKE` / `NOT LIKE` | `REGEXP` / `NOT REGEXP` (`RLIKE` 同義) | 通配符 | `%` (任意長度字符,含 0) `_` (單個字符) | 標準 POSIX 正則元字符 (見下表) |
| 大小寫敏感 | **默認不敏感** (依字符集校對規則,如 `utf8mb4_general_ci`) | **默認敏感** (可用字符類 `[aA]` 或 `LOWER()` 實現不敏感) |
| 匹配語義 | **整列匹配** (需顯式 `%` 包裹實現包含) | **子串匹配** (模式出現在值任意位置即匹配) |
| 性能特徵 | 可利用索引 (前綴匹配 `abc%`) | 通常**全表掃描**,不可用索引 (MySQL 8.0+ 部分優化) |
-- 以 "b" 開頭
WHERE name LIKE 'b%'
-- 以 "fy" 結尾
WHERE name LIKE '%fy'
-- 包含 "w"
WHERE name LIKE '%w%'
-- 精確 5 個字符
WHERE name LIKE '_____' -- 5 個下劃線
-- 轉義特殊字符 (查詢字面值 "%" 或 "_")
WHERE name LIKE '%\%%' ESCAPE '\'
WHERE name LIKE '%\_%' ESCAPE '\'
※ 索引利用鐵律:**只有前綴固定模式 (`abc%`) 才可能走索引**;`%abc`、`%abc%`、`_abc` 均導致全表掃描。
| 元字符 | 含義 | 示例匹配 |
|---|---|---|
| `.` | 任意單個字符 | `a.c` → `abc`, `axc`, `a-c` |
| `[...]` | 字符類:括號內任一字符 | `[abc]` → `a` `b` `c` |
| `[^...]` | 否定字符類:除括號外任一字符 | `[^abc]` → 非 `a/b/c` 的字符 |
| `-` (在 [] 內) | 範圍 | `[a-z]` 小寫字母, `[0-9]` 數字 |
| `*` | 前導元素 0 次或多次 | `ab*c` → `ac`, `abc`, `abbc`... |
| `+` | 前導元素 1 次或多次 | `ab+c` → `abc`, `abbc`... |
| `?` | 前導元素 0 次或 1 次 | `ab?c` → `ac`, `abc` |
| `{n}` / `{n,}` / `{n,m}` | 精確 n 次 / 至少 n 次 / n 到 m 次 | `a{3}` → `aaa` |
| `^` | 字串**開始**錨點 | `^abc` → 以 `abc` 開頭 |
| `$` | 字串**結束**錨點 | `abc$` → 以 `abc` 結尾 |
| `|` | 或 (分支) | `cat|dog` → `cat` 或 `dog` |
| `()` | 分組/捕獲 | `(ab)+` → `ab`, `abab`... |
-- 1. 以 "b" 或 "B" 開頭 (不敏感)
WHERE name REGEXP '^[bB]'
-- 或
WHERE name REGEXP '^b' -- 若列校對規則 _ci 則自動不敏感
-- 2. 以 "fy" 結尾
WHERE name REGEXP 'fy$'
-- 3. 包含 "w" 或 "W"
WHERE name REGEXP '[wW]'
-- 4. 精確 5 個字符 (^ 錨點開始,$ 錨點結尾,5 個任意字符 .)
WHERE name REGEXP '^.....$'
-- 簡寫量詞
WHERE name REGEXP '^.{5}$'
-- 5. 包含數字 (任意位置)
WHERE name REGEXP '[0-9]'
-- 6. 純字母 (全字符皆為字母)
WHERE name REGEXP '^[a-zA-Z]+$'
-- 7. 郵箱簡易校驗
WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
MySQL 模糊查詢雙雄:`LIKE` 以簡潔、索引友好佔據 90%+ 業務場景;`REGEXP` 以強大表達力處理複雜格式校驗、數據清洗、異構解析。掌握「前綴 `LIKE` 走索引、含 `%` 走掃描、複雜轉 `REGEXP`、大表上搜索引擎」的分層決策鏈,是 SQL 調優與業務落地的基本功。