1. 问题描述
今天在学习了解Hibernate时,尝试着和Mysql连接保存数据,结果总是出现中文乱码问题。这问题让我鼓捣了一下午也没整明白,按照网上教程各种配置(一般只用两步就可以配置好),仍是不见效果。直到晚上吃完晚饭继续弄的时候,再一细想才终于弄明白为什么配置好了后仍然乱码。我先说一下问题的原因:一般按照网上教程配置好Hibernate和Mysql的编码后(下面会介绍如何配置),如果你仍在配置编码前就建好的数据库中进行建表、插入数据(中文数据)等操作,那无疑你的数据录入和输出仍然会是乱码。
2. 分析问题出现的原因
为什么呢?
因为一个数据库在被创建时有一个默认属性我们一般不会去赋值,那就是数据库的"Default Character"属性。这个"Default Character"属性会根据Mysql的默认设置赋值。而且,一旦这个属性被赋值后,在这个数据库中新建的表也会继承这个默认的编码属性(除非你在新建表时指定编码字符集)。所以当你配置完Mysql和Hibernate的编码集后,如果你继续在这个数据库中建表,然后插入中文字符,Mysql会按之前默认的字符集录入、输出这些中文字符,结果就是要么出现
Incorrect string value: '\xE6\x88\x91\xE6\x98\xAF...' for column 'title1'...
一类的错误,要么就是中文字符直接以乱码的方式被录入(显示的时候当然是一堆??了).
3. 验证是否确为此类问题
如果你也遇到了这样的问题,你可以进入Mysql控制台,分别查看在创建数据库A和表B的时候,它们的默认字符集是什么。当然如果你的数据库和表内并没有重要的数据,你完全可以drop掉整个数据库重新创建,因为只要你配置好了Mysql的字符集<一般设为utf8>,重新创建数据库和表后就不会出现中文字符乱码的问题了。
>查看创建mysql数据库时的默认字符集:
mysql> show create database mysql ;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| mysql | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
>查看创建mysql数据库中的general_log这张表时的默认字符集:
mysql> show create table general_log;
+-------------+--------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
| Table | Create Table
+-------------+--------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
| general_log | CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log' |
+-------------+--------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
以上两个实体,都有一个字符集或编码的属性,对数据库来说是:DEFAULT CHARACTER SET,对表来说是:DEFAULT CHARSET
4. Hibernate3和Mysql5.5该如何配置字符的编码?
4.1 for Hibernate
<!-- Supported UTF-8 character set -->
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
</property>
4.2 for Mysql