在 MySQL 中使用 LIKE '%李%' 查詢包含「李」字的記錄時,結果中混雜了不包含該字的數據。這是因為早期 MySQL 版本默認使用 ISO-8859-1 字符集,對中文雙字節編碼的大小寫不敏感比較導致匹配錯誤。
MySQL 在編譯時默認採用 ISO-8859-1 字符集,進行字符串比較時會嘗試大小寫轉換。中文 GBK/Big5 編碼的高位字節落在 ASCII 字母範圍內,被誤判為大小寫字符而觸發轉換,破壞了原始字節序列,導致模糊匹配失效。
ALTER TABLE `table_name` MODIFY `field_name` CHAR(10) BINARY;
-- 或建表時指定
CREATE TABLE `t` (`name` CHAR(10) BINARY);
強制該字段按二進制字節比較,繞過字符集轉換層,查詢精確高效。
./configure --with-charset=gbk --with-collation=gbk_chinese_ci
從源碼編譯 MySQL 時內建 GBK 支持,根治排序與查找問題,適合自建數據庫服務器場景。
SELECT * FROM `table` WHERE LOCATE(`field`, '李') > 0;
LOCATE() 進行字節級位置查找,不受字符集大小寫規則干擾,性能與 LIKE 相當。
SELECT * FROM `table` WHERE `field` LIKE BINARY '%李%';
無需修改表結構,臨時指定二進制比較模式,靈活適用於臨時查詢。
utf8mb4_bin 校對規則,從根源避免編碼問題。