在 MySQL 中進行中文模糊查詢時,常會遇到一個棘手的問題:搜尋英文關鍵字(如 %a%)時,結果卻混雜了不含該字母的中文記錄。這是因為預設的字符集排序規則導致匹配邏輯失準。
假設我們要從新聞表 news 的 title 欄位搜尋包含 "a" 的標題:
SELECT id, title, name FROM achech_com.news WHERE title LIKE '%a%';
執行結果會發現,部分返回的標題明明只有中文,卻也被匹配上了。
MySQL 手冊指出,加上 BINARY 關鍵字可強制進行二進位比較,避免字符集排序干擾:
SELECT id, title, name FROM achech_com.news WHERE BINARY title LIKE '%a%';
此時結果精準許多,但副作用是英文字母變成區分大小寫,搜尋 "Achech" 與 "achech" 會得到不同結果,不夠靈活。
結合 UCASE()(轉大寫)與 CONCAT()(字符串拼接)函數,可同時解決「誤判中文」與「大小寫敏感」兩大痛點:
SELECT id, title, name
FROM achech_com.news
WHERE BINARY UCASE(title) LIKE CONCAT('%', UCASE('a'), '%');
%,方便程式傳參。簡寫版同樣有效:
SELECT id, title, name
FROM achech_com.news
WHERE BINARY UCASE(title) LIKE UCASE('%a%');
雙重函數轉換會導致索引失效,查詢速度會較慢(約增加 N 毫秒)。若資料量極大且頻繁查詢,建議考慮全文索引或專用搜尋引擎。
MySQL 官方手冊 20.16 Case Sensitivity in Searches 詳細說明了預設大小寫不敏感的行為與 BINARY 用法。