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

解決 MySQL 中文模糊查詢誤判:BINARY、UCASE 與 CONCAT 精準檢索實戰

     編輯:MySQL 資料庫相關知識

問題現象

在 WHERE title LIKE '%a%' 查詢中,純中文標題也會被誤判匹配,原因是預設校對規則 (Collation) 將英文字母與部分中文編碼視為相等。

解決方案演進

方案一:BINARY 精確匹配

SELECT * FROM news WHERE BINARY title LIKE '%a%';
  • 優點:立即生效,不需改表結構。
  • 缺點:區分大小寫,'Achech' 與 'achech' 結果不同。

方案二:UCASE 統一大寫 + BINARY

SELECT * FROM news WHERE BINARY UCASE(title) LIKE UCASE('%a%');
  • 優點:不區分大小寫,精準匹配。
  • 缺點:無法使用索引 (Full Table Scan),大表效能差。

方案三:CONCAT 動態組裝模式 (推薦)

SELECT * FROM news 
WHERE BINARY UCASE(title) LIKE CONCAT('%', UCASE('搜尋關鍵字'), '%');
  • 優點:程式碼端只需傳入關鍵字變數,自動處理萬用字元與大小寫。
  • 缺點:同樣導致全表掃描。

進階優化:全文檢索與生成欄位

  1. MySQL 5.7+ 原生全文索引:ALTER TABLE news ADD FULLTEXT(title) WITH PARSER ngram; (支援中文分詞)。
  2. 生成欄位 + 索引 (MySQL 5.7+):
    ALTER TABLE news 
      ADD COLUMN title_upper VARCHAR(200) 
      GENERATED ALWAYS AS (UPPER(title)) STORED,
      ADD INDEX idx_title_upper (title_upper);
    
    -- 查詢可用索引
    SELECT * FROM news WHERE title_upper LIKE CONCAT('%', UPPER('關鍵字'), '%');
  3. 外部搜尋引擎:Elasticsearch、Meilisearch 處理複雜中文分詞、同義詞、權重排序。

效能對比

方案可用索引大小寫敏感適用場景
BINARY LIKE否是小表、臨時查詢
UCASE + BINARY否否中小表、不區分大小寫
生成欄位 + 索引是否大表、高頻查詢
ngram 全文索引是否專業搜尋、分詞需求
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved