首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

解決 MySQL 中文 LIKE 查詢失效的四種實用方法

     編輯:MySQL 資料庫相關知識

問題現象

在 MySQL 中使用 LIKE '%李%' 查詢包含「李」字的記錄時,結果中混雜了不包含該字的數據。這是因為早期 MySQL 版本默認使用 ISO-8859-1 字符集,對中文雙字節編碼的大小寫不敏感比較導致匹配錯誤。

核心原因

MySQL 在編譯時默認採用 ISO-8859-1 字符集,進行字符串比較時會嘗試大小寫轉換。中文 GBK/Big5 編碼的高位字節落在 ASCII 字母範圍內,被誤判為大小寫字符而觸發轉換,破壞了原始字節序列,導致模糊匹配失效。

四種解決方案

方法一:字段聲明添加 BINARY 屬性(推薦)

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 支持,根治排序與查找問題,適合自建數據庫服務器場景。

方法三:使用 LOCATE 函數替代 LIKE

SELECT * FROM `table` WHERE LOCATE(`field`, '李') > 0;

LOCATE() 進行字節級位置查找,不受字符集大小寫規則干擾,性能與 LIKE 相當。

方法四:查詢語句中顯式指定 BINARY 比較

SELECT * FROM `table` WHERE `field` LIKE BINARY '%李%';

無需修改表結構,臨時指定二進制比較模式,靈活適用於臨時查詢。

最佳實踐建議

  • 新項目優先採用 utf8mb4 字符集並配合 utf8mb4_bin 校對規則,從根源避免編碼問題。
  • 存量系統若難以變更字符集,推薦「方法一」永久修正字段屬性,維護成本最低。
  • 避免在應用層手動拼接 SQL,使用參數化查詢防止注入並確保編碼傳輸正確。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved