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

MySQL 中文模糊查詢亂碼問題:BINARY + UCASE + CONCAT 精準解決方案

     編輯:MySQL 資料庫相關知識

現象

WHERE title LIKE '%a%' 卻匹配到不含 'a' 的中文標題,因字符集排序規則導致某些中文字符編碼包含 0x61 ('a') 位元組。

解決步驟演進

1. 加 BINARY 強制二進位比較

WHERE BINARY title LIKE '%a%'

副作用:英文大小寫敏感,'Achech' ≠ 'achech'。

2. 統一轉大寫再比對

WHERE BINARY UCASE(title) LIKE UCASE('%a%')

或用 CONCAT 組裝萬用字元,避免參數帶入 '%':

WHERE BINARY UCASE(title) LIKE CONCAT('%', UCASE('a'), '%')

完整範例

SELECT id, title, name
FROM achech_com.news
WHERE BINARY UCASE(title) LIKE CONCAT('%', UCASE(?), '%');

參數綁定 '?=' 為關鍵字,安全防注入。

效能考量

  • BINARY + 函數會導致全表掃描,無法使用索引。
  • 資料量 > 10 萬建議:
    ① 全文索引 FULLTEXT(title) + MATCH(title) AGAINST('+keyword' IN BOOLEAN MODE)(需 ngram 分詞器支援中文)。
    ② 外部搜尋引擎。
    ③ 觸發器維護 title_upper 欄位 + 一般索引。

字符集根因補充

若資料庫/表/欄位均為 utf8mb4 + utf8mb4_unicode_ci,MySQL 5.6+ 已大幅改善中文模糊查詢誤判,仍建議顯式指定 COLLATE utf8mb4_bin 於關鍵查詢。

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