首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

MyBatis 查詢返回 Null 排查實錄:字符編碼不匹配導致

     編輯:Java 綜合教學

MyBatis 查詢返回 Null 排查實錄:字符編碼不匹配導致

現象:MyBatis 執行 SELECT id,a9004,a9005,a9015 FROM a90 WHERE a9010 = ? 返回空結果,但同 SQL 在 MySQL 客戶端直接執行卻有數據。日誌顯示參數為中文「科技評論」。

根因分析

JDBC 連接字符串未指定字符編碼,驅動程式默認編碼(如 ISO-8859-1)與數據庫實際編碼(UTF-8)不一致,導致中文參數傳輸變為亂碼,SQL 實際執行變為 WHERE a9010 = '亂碼',自然查無結果。COUNT(*) 無 WHERE 條件故正常。

解決方案

在 JDBC URL 追加編碼參數:

jdbc:mysql://host:3306/dbname?autoReconnect=true&useUnicode=true&characterEncoding=utf8
  • useUnicode=true:啟用 Unicode 支持。
  • characterEncoding=utf8:指定字符集為 UTF-8(MySQL 中 utf8 即 utf8mb3,建議 8.0+ 用 utf8mb4)。
  • autoReconnect=true:自動重連,生產環境建議配合連接池使用。

驗證步驟

  1. 修改數據源配置(Druid/HikariCP/原生 JDBC 均適用)。
  2. 重啟應用,觀察 SQL 日誌參數是否正確顯示中文。
  3. 確認查詢結果恢復正常。

延伸建議

  • 數據庫、表、列字符集統一為 utf8mb4,支持 Emoji 等 4 字節字符。
  • 應用層、數據庫連接層、數據庫存儲層三端編碼保持一致,杜絕亂碼根源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved