WHERE title LIKE '%a%' 卻匹配到不含 'a' 的中文標題,因字符集排序規則導致某些中文字符編碼包含 0x61 ('a') 位元組。
WHERE BINARY title LIKE '%a%'
副作用:英文大小寫敏感,'Achech' ≠ 'achech'。
WHERE BINARY UCASE(title) LIKE UCASE('%a%')
或用 CONCAT 組裝萬用字元,避免參數帶入 '%':
WHERE BINARY UCASE(title) LIKE CONCAT('%', UCASE('a'), '%')
SELECT id, title, name
FROM achech_com.news
WHERE BINARY UCASE(title) LIKE CONCAT('%', UCASE(?), '%');
參數綁定 '?=' 為關鍵字,安全防注入。
BINARY + 函數會導致全表掃描,無法使用索引。FULLTEXT(title) + MATCH(title) AGAINST('+keyword' IN BOOLEAN MODE)(需 ngram 分詞器支援中文)。title_upper 欄位 + 一般索引。若資料庫/表/欄位均為 utf8mb4 + utf8mb4_unicode_ci,MySQL 5.6+ 已大幅改善中文模糊查詢誤判,仍建議顯式指定 COLLATE utf8mb4_bin 於關鍵查詢。