萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 中文模糊查詢不精準?BINARY 與全文檢索完整解法

問題場景

使用 LIKE '%a%' 搜尋標題含「a」的新聞時,純中文標題也會被誤判命中。主因是 MySQL 預設排序規則不區分大小寫,且中文字元比較機制導致誤判。

方案一:BINARY 精確比對(區分大小寫)

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

加上 BINARY 後,比對會逐位元進行,精準度大增,但英文會嚴格區分大小寫(Achech ≠ achech)。

方案二:UCASE + CONCAT 統一大小寫(推薦)

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

邏輯解析:

  1. BINARY 開啟精確模式
  2. UCASE(title) 將欄位內容全轉大寫
  3. CONCAT('%', UCASE('關鍵字'), '%') 動態產生大寫模糊模式,變數傳入無需手動加 %

等效寫法:WHERE BINARY UCASE(title) LIKE UCASE('%a%')

方案三:MySQL 全文檢索(效能最佳,適合大量資料)

前置條件

  • MySQL 4.0+
  • 資料表引擎為 MyISAM(InnoDB 5.6+ 亦支援)

建立全文索引

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title, body)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

查詢語法

-- 自然語言模式(預設,忽略大小寫)
SELECT * FROM articles WHERE MATCH(title, body) AGAINST('database');

-- 布林模式(支援 + - ~ * 等運算子)
SELECT * FROM articles WHERE MATCH(title, body) AGAINST('+MySQL -YourSQL' IN BOOLEAN MODE);

常見陷阱與調整

  • 最小字元長度限制:預設 ft_min_word_len=4,搜尋「well」(4 字元)無結果。修改 my.cnf:ft_min_word_len=2 後重啟 MySQL。
  • 50% 門檻值:自然語言模式下,出現在超過 50% 記錄的詞會被忽略。改用 IN BOOLEAN MODE 可繞過此限制。
  • 布林模式運算子:
    • + 必須包含(AND)
    • - 必須不包含(NOT)
    • 空白 至少包含其一(OR)
    • ~ 降低權重
    • > < 調整權重優先序
    • () 分組

選擇建議

場景建議方案
小資料量、簡單關鍵字BINARY + UCASE + CONCAT
大量文字、需相關性排序全文檢索(MyISAM/InnoDB)
中文分詞需求搭配外部分詞器(如 SCWS、jieba)或升級 MySQL 5.7+ 內建 ngram parser
copyright © 萬盛學電腦網 all rights reserved