在用spring+hibernate开发网站的过程中,发现一个很奇怪的问题:持久化中文的时候老是会出错。在网上查询过很多解决方法,大致有一下几种:
1.在mysql的配置文件my.ini中配置defualt_character_set为utf8,共有两处配置需要修改,默认是Latin1,完成。
2.在连接数据库的URL中要附加参数,如:jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf-8,完成。
做完这些后,重启mysql后再进行单元测试,还是抛异常:
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not insert:
Caused by: org.hibernate.exception.GenericJDBCException: could not insert: [cn.itcast.bean.product.ProductType]
Caused by: java.sql.SQLException: Incorrect string value: '/xE8/xB6/xB3/xE7/x90/x83' for column 'name' at row 1
然后用工具查看数据库表,发现已经创建了表,那么就只是插入的问题了。再看数据表的编码,竟然仍然是latin1,难道URL的参数没有起作用吗?还是mysql根本就不支持utf-8呢?
为了搞清楚上述问题,打开mysql的控制台,用输命令的方式创建一个数据表,并指定编码类型:
Create table tablename(
id int(10) unsigned NOT NULL AUTO_INCREMENT,
name varchar(15) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM DEFAULT CHARACTER SET utr8;
创建完成后在工具中查看,发现数据库的编码是utf8了,窃喜。然后再运行单元测试。由于在配置文件中配置了<property name="hibernate.hbm2ddl.auto" value="update"/>,这次访问的时候就不用在创建新表了,只是在已有表上进行更新。终于,持久化中文成功了。在工具中查看data,也赫然显示的中文。那么问题就聚焦在,是在URL中附带参数没有起到作用,导致创建的数据表的编码仍然是latin1,所以无法插入中文数据。具体为什么URL的参数没有起到作用,还没有搞清楚,困惑中。