現象: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:自動重連,生產環境建議配合連接池使用。utf8mb4,支持 Emoji 等 4 字節字符。