MySQL 字串比較看似簡單,實則暗藏「隱式轉換」、「大小寫敏感度」、「二進位比較」等關鍵細節。本文深度解析 LIKE、REGEXP、STRCMP 核心函數與運算符,並釐清常見誤區,助你精準掌控字串匹配邏輯。
SELECT 1 + '1'; -- 2,SELECT CONCAT(2, ' test'); -- '2 test'CAST(38.8 AS CHAR) 或 CONCAT(38.8),推薦 CAST()。BINARY、BLOB、數字轉字串),比較將以位元組級別進行,區分大小寫、依編碼權重排序。expr LIKE pat [ESCAPE 'escape_char']
%:匹配任意長度字元(含 0 個)_:匹配單一字元SELECT 'David_' LIKE 'David\_'; -- 1 (預設 \ 為轉義)
SELECT 'David_' LIKE 'David|_' ESCAPE '|'; -- 1 (自定義 | 為轉義)
注意:MySQL 字串常值以 \ 轉義,LIKE 再解析一次,故匹配字面 \ 需寫 \\\\(四個反斜線)。
SELECT 'abc' LIKE 'ABC'; -- 1 (預設不區分,依排序規則)
SELECT 'abc' LIKE BINARY 'ABC'; -- 0 (強制二進位比較,區分大小寫)
也可用 COLLATE 指定排序規則:'abc' LIKE 'ABC' COLLATE utf8mb4_bin。
SELECT 10 LIKE '1%'; -- 1 (數值隱式轉字串 '10' 再匹配)
expr REGEXP pat
expr RLIKE pat -- 同義詞,兼容 mSQL
.、*、+、?、[]、^$、|、() 等)。BINARY:'a' REGEXP BINARY 'A' -- 0。\ 雙重轉義影響:'new*\n*line' REGEXP 'new\\\\*\\\\.\\\\*line'。SELECT 'Monty!' REGEXP '.*'; -- 1
SELECT 'a' REGEXP '^[a-d]'; -- 1
SELECT 'new*\n*line' REGEXP 'new\\\\*.\\\\*line'; -- 1
0:兩字串相等-1:第一參數 < 第二參數(依當前排序規則)1:第一參數 > 第二參數SELECT STRCMP('text', 'text2'); -- -1
SELECT STRCMP('text2', 'text'); -- 1
SELECT STRCMP('text', 'text'); -- 0
同樣遵循「二進位字串優先、排序規則決定大小寫敏感度」原則。
expr NOT LIKE pat [ESCAPE ...] -- 等價 NOT (expr LIKE pat)
expr NOT REGEXP pat -- 等價 NOT (expr REGEXP pat)
LIKE '%abc' 無法使用索引,全表掃描;LIKE 'abc%' 可用索引。MATCH() AGAINST() 或外部引擎。LIKE。COLLATE utf8mb4_bin 或查詢時 COLLATE,避免隱式行為差異。