資料髒污導致欄位值含有前後空格、內部空格,或查詢條件與資料空格不一致,是模糊比對失效的常見主因。本文系統講解 REPLACE、TRIM 組合拳,解決空格干擾比對問題。
| 函數 | 語法 | 作用 | 範例 |
|---|---|---|---|
| REPLACE | REPLACE(str, from_str, to_str) | 將字串中所有 from_str 替換為 to_str | REPLACE('a b c', ' ', '') → 'abc' |
| TRIM | TRIM([{BOTH|LEADING|TRAILING} [remstr] FROM] str) | 移除字串首尾指定字元(預設空格) | TRIM(' abc ') → 'abc' |
UPDATE `news` SET `content` = REPLACE(`content`, ' ', '');
移除 content 欄位**所有空格**,後續可直接用 LIKE 比對。謹慎使用:會合併單詞("hello world" → "helloworld"),若需保留單詞間距,請改用正則或應用層處理。
**原則**:對資料欄位與查詢條件**同樣處理**,確保比對基準一致。
SELECT * FROM `table`
WHERE TRIM(REPLACE(`title`, ' ', '')) = TRIM(REPLACE('李楊 技術 博客', ' ', ''));
SELECT * FROM `table`
WHERE TRIM(REPLACE(`title`, ' ', '')) LIKE TRIM(REPLACE('%李楊 技術 博客%', ' ', ''));
**執行順序**:REPLACE 先移除內部空格 → TRIM 再移除可能殘留的首尾空格。
TRIM(LEADING 'x' FROM 'xxxabcxxx') → 'abcxxx' TRIM(BOTH 'x' FROM 'xxxabcxxx') → 'abc' TRIM(TRAILING 'xyz' FROM 'abcxyz') → 'abc'
WHERE TRIM(REPLACE(col,...)))導致**無法使用索引**,全表掃描。ALTER TABLE `table` ADD COLUMN `title_clean` VARCHAR(200)
GENERATED ALWAYS AS (TRIM(REPLACE(`title`, ' ', ''))) VIRTUAL;
CREATE INDEX idx_title_clean ON `table`(`title_clean`);
-- 查詢直接用 title_clean 比對,命中索引
FULLTEXT INDEX + MATCH() AGAINST(),原生支援詞邊界、停用詞、相關度排序。| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
| WHERE title = 'abc' -- 資料有空格 | 永遠匹配失敗 | WHERE TRIM(REPLACE(title,' ','')) = 'abc' |
| WHERE REPLACE(title,' ','') LIKE '%abc%' | 未 TRIM,首尾空格干擾 | WHERE TRIM(REPLACE(title,' ','')) LIKE '%abc%' |
| UPDATE SET col=REPLACE(col,' ','') -- 未備份 | 不可逆資料遺失 | 先備份/加 WHERE 測試/分批執行 |
掌握 REPLACE+TRIM 組合拳,配合虛擬欄位索引或全文檢索,徹底解決空格干擾查詢難題。