使用 LIKE '%a%' 搜尋標題含「a」的新聞時,純中文標題也會被誤判命中。主因是 MySQL 預設排序規則不區分大小寫,且中文字元比較機制導致誤判。
SELECT id, title, name FROM news WHERE BINARY title LIKE '%a%';
加上 BINARY 後,比對會逐位元進行,精準度大增,但英文會嚴格區分大小寫(Achech ≠ achech)。
SELECT id, title, name
FROM news
WHERE BINARY UCASE(title) LIKE CONCAT('%', UCASE('a'), '%');
邏輯解析:
BINARY 開啟精確模式UCASE(title) 將欄位內容全轉大寫CONCAT('%', UCASE('關鍵字'), '%') 動態產生大寫模糊模式,變數傳入無需手動加 %等效寫法:WHERE BINARY UCASE(title) LIKE UCASE('%a%')
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。IN BOOLEAN MODE 可繞過此限制。+ 必須包含(AND)- 必須不包含(NOT)空白 至少包含其一(OR)~ 降低權重> < 調整權重優先序() 分組| 場景 | 建議方案 |
|---|---|
| 小資料量、簡單關鍵字 | BINARY + UCASE + CONCAT |
| 大量文字、需相關性排序 | 全文檢索(MyISAM/InnoDB) |
| 中文分詞需求 | 搭配外部分詞器(如 SCWS、jieba)或升級 MySQL 5.7+ 內建 ngram parser |