中文亂碼通常由三處編碼不一致導致:
CREATE TABLE test (
id INT PRIMARY KEY,
name VARCHAR(50)
) DEFAULT CHARACTER SET gb2312;
<property name="connection.url">
jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=gb2312
</property>
<property name="connection.characterEncoding">gb2312</property>
CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE test (...) DEFAULT CHARACTER SET utf8mb4;
<property name="connection.url">
jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
</property>
<property name="connection.characterEncoding">utf8</property>
SHOW VARIABLES LIKE 'character%'; 確認服務端編碼。SHOW CREATE TABLE test; 確認表級字符集。connection.characterEncoding 生效值。utf8 實為 utf8mb3,無法存儲 Emoji,必須用 utf8mb4。characterEncoding 優先級高於 Hibernate 配置屬性,保持一致。server.xml 中 URIEncoding="UTF-8" 僅影響 GET 參數解碼,不影響 JDBC 連接。