首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

解決 MySQL 中文模糊查詢誤判問題:BINARY 與大小寫轉換實戰

     編輯:MySQL 資料庫相關知識

在 MySQL 中進行中文模糊查詢時,常會遇到一個棘手的問題:搜尋英文關鍵字(如 %a%)時,結果卻混雜了不含該字母的中文記錄。這是因為預設的字符集排序規則導致匹配邏輯失準。

問題複現

假設我們要從新聞表 news 的 title 欄位搜尋包含 "a" 的標題:

SELECT id, title, name FROM achech_com.news WHERE title LIKE '%a%';

執行結果會發現,部分返回的標題明明只有中文,卻也被匹配上了。

初步解決:使用 BINARY 屬性

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'), '%');

邏輯解析

  1. BINARY:啟用精確二進位比較,排除字符集排序干擾。
  2. UCASE(title):將欄位內容全轉為大寫,消除大小寫差異。
  3. 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 用法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved