首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MySQL 中文參數查詢結果為空?排查字符集與參數編碼不匹配

     編輯:程式設計疑難解答

現象

SQL 中帶中文參數時查無結果,純英文/數字正常。已嘗試設置連接字符集、表字符集均為 UTF-8,問題依舊。

排查步驟

  1. 檢查實際接收到的參數:在 Servlet/Controller 打印 request.getParameter("key"),確認是否為正確中文而非亂碼(如 %E4%B8%AD%E6%96%87 未解碼)。
  2. 確認連接字符集:JDBC URL 顯式指定 ?useUnicode=true&characterEncoding=utf-8。
  3. 檢查表/列字符集:SHOW CREATE TABLE t; 確認 CHARSET=utf8mb4(推薦)或 utf8。
  4. 驗證 SQL 執行計劃:EXPLAIN SELECT ... WHERE col='中文'; 觀察 ref 類型與 rows。

常見誤區

  • 以為 SET NAMES utf8 就萬事大吉 —— 必須在連接建立前指定(JDBC URL 參數)。
  • Tomcat server.xml URIEncoding="UTF-8" 僅影響 GET 請求 URL 解碼,POST 請求體需 request.setCharacterEncoding("UTF-8")。
  • MySQL utf8 實為 utf8mb3,不支援 Emoji/生僻字,生產環境請用 utf8mb4。

最佳實踐配置

# JDBC URL
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai

# MySQL 服務端 my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 表建表
CREATE TABLE t (col VARCHAR(100)) CHARSET=utf8mb4;

調試技巧

-- 查看實際執行的 SQL(開啟一般日誌或慢查詢日誌)
SET GLOBAL general_log = 1;
SET GLOBAL log_output = 'TABLE';
SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 10;

總結

中文參數查空 99% 是「參數到達服務端前已亂碼」或「連接字符集未生效」。優先打印接收參數,再按「請求解碼 → 連接字符集 → 存儲字符集」鏈路逐環排查。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved