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

MySQL 中文模糊查詢精準化:BINARY + UCASE + CONCAT 組合技巧

     編輯:MySQL 資料庫相關知識

問題現象

使用 LIKE '%a%' 查詢中文標題時,會誤命中不含 'a' 的中文記錄(因字符集排序規則導致某些多位元組字元被誤判)。

解決方案演進

第一步:加上 BINARY 強制二進位比較

SELECT id, title FROM news WHERE BINARY title LIKE '%a%';

結果精準,但區分大小寫,'Achech' 與 'achech' 結果不同。

第二步:統一轉大寫 + BINARY

SELECT id, title FROM news
WHERE BINARY UCASE(title) LIKE UCASE('%a%');

或使用 CONCAT 組裝萬用字元,程式碼更簡潔:

SELECT id, title FROM news
WHERE BINARY UCASE(title) LIKE CONCAT('%', UCASE('a'), '%');

完整 SQL 範本

-- 參數化版本(防注入)
SET @keyword = '搜尋關鍵字';
SELECT id, title, name
FROM news
WHERE BINARY UCASE(title) LIKE CONCAT('%', UCASE(@keyword), '%');

原理解析

元件作用
BINARY將字串比較改為逐位元組比較,忽略排序規則的等權重字元分組
UCASE() / UPPER()將欄位與關鍵字統一轉大寫,消除大小寫差異
CONCAT('%', ..., '%')動態組裝 LIKE 模式,呼叫端只需傳純關鍵字

效能影響與優化

  • 全表掃描:BINARY 導致無法使用索引,大表會慢。
  • 優化建議:
    • 加上 FULLTEXT 索引(MySQL 5.6+ InnoDB 支援中文分詞需配置 ngram parser)。
    • 引入 Elasticsearch / Meilisearch 等專用搜尋引擎。
    • 若資料量中等(<10萬),可接受毫秒級延遲。

替代方案:COLLATE 指定二進位排序規則

SELECT * FROM news
WHERE title COLLATE utf8mb4_bin LIKE CONCAT('%', 'a', '%');

utf8mb4_bin 同樣逐位元組比較,但不自動處理大小寫,仍需搭配 UCASE()。

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