使用 LIKE '%a%' 查詢中文標題時,會誤命中不含 'a' 的中文記錄(因字符集排序規則導致某些多位元組字元被誤判)。
SELECT id, title FROM news WHERE BINARY title LIKE '%a%';
結果精準,但區分大小寫,'Achech' 與 'achech' 結果不同。
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'), '%');
-- 參數化版本(防注入)
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)。SELECT * FROM news
WHERE title COLLATE utf8mb4_bin LIKE CONCAT('%', 'a', '%');
utf8mb4_bin 同樣逐位元組比較,但不自動處理大小寫,仍需搭配 UCASE()。