Hibernate 操作 MySQL 存取中文出現亂碼,核心在於「連接字符集協商」未統一。本文給出 hibernate.cfg.xml、Spring sessionFactory、驅動版本三層配置清單,一次修好。
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>
完整片段:
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 其他 mapping -->
</session-factory>
在 LocalSessionFactoryBean 或 HibernateJpaVendorAdapter 中同樣設置上述兩屬性,或直接在 JDBC URL 追加參數:
<property name="dataSource">
<bean class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"/>
...
</bean>
</property>
mysql-connector-java 5.1.47+ 或 8.0.13+;舊版 3.x 不支持 characterEncoding 參數。CREATE TABLE ... DEFAULT CHARSET=utf8mb4,列無需單獨指定。my.cnf [mysqld] 區段 character-set-server=utf8mb4,重啟生效。CharacterEncodingFilter,確保 forceEncoding=true。UTF-8 而 MySQL 服務端仍為 latin1 → 存入時已轉碼錯誤,讀出無法恢復。utf8 而非 utf8mb4 → 無法存 Emoji/生僻字(MySQL utf8 實為 utf8mb3)。SHOW VARIABLES LIKE 'character_set_%';
-- 期望 client/connection/results/database/server 均為 utf8mb4