MySQL 默認排序規則下,LIKE '%a%' 會誤匹配不含 'a' 的中文記錄。根因:字符集排序權重導致部分中文字符與 ASCII 字母權重重疊。
SELECT id, title FROM news WHERE title LIKE '%a%';
-- 返回標題含 'a' 的記錄,同時混入純中文標題記錄
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%')
BINARY 導致無法使用索引,全表掃描,查詢時間增加 N 毫秒。FULLTEXT)或外部搜尋引擎(Elasticsearch)。中英文混合、大小寫不敏感、精確字符匹配的中小表模糊查詢。