解决hibernate插入中文数据乱码、报错的问题
在hibernate案例测试的时候,会发现这样一个问题,hibernate自动创建的表默认字符集为latin1,这样的结果就是插入中文的时候,数据库中记录出现乱码(表现为疑问号'?')。
按照网上的解决办法在hibernate项目的核心配置文件中的 连接url中配置如下语句:
<property name="hibernate.connection.url">
jdbc:mysql:///test?useUnicode=true&characterEncoding=utf-8
</property>
即在自己创建的数据库test后面添加
?useUnicode=true&characterEncoding=utf-8
结果是在测试中插入中文的时候,乱码消失了,却提示如下错误:
org.hibernate.exception.GenericJDBCException: could not execute statement
那么可以确定,不是缺少这条语句的原因了。
下一个思路就是更改MySQL的配置文件my.ini。修改默认字符集。
在[mysqld]下添加语句
character_set_server=utf8
init_connect='SET NAMES utf8
在[client]下添加如下语句:
default-character-set=utf8
之后启动MySQL,运行项目,依然是原来的问题。那么可以排除MySQL默认字符集的原因。
然后手动更改数据表中对应字段的编码为utf8,发现可以插入中文了。难道说,每次hibernate创建表之后都得手动更改字段的字符编码?显然太麻烦,不能完全解决问题。
当网上的办法不能解决问题,自己的思路有陷入困境的时候,莫名查看了一下数据库的属性,发现数据库的字符编码是latin。
将数据库的字符集更改为utf8(注意:此处是数据库的字符编码,而不是表中对应字段的编码)之后,hibernate自动生成的表中的字符串字段的字符集已经是utf8了。
至此问题解决。
需要注意的是:如果原来由hibernate自动创建的表中的字段已经是latin1字符集了,那么你还是需要手动更改对应字段的字符集,因为默认数据库的字符集与数据表字段的字符集可以不相同,不会因为你更改了数据库的编码系统就会自动更改数据表中的字段编码。
如果你在更改数据库的编码为utf8之后,需要测试hibernate自动生成的表中字段的编码是否为utf8,最简单的方法就是删除原来的数据表,然后重新运行程序,观察生成表中的字段编码是否为utf8
总结一点:
因为hibernate可以管数据表的自动生成,但是一般管不了数据库的创建。
若要使用中文,那么在数据库创建的时候就设置好数据库属性中的字符编码为utf8