由于项目是采用utf-8的,之前也没留意过,一般要求客户也是把mysql的编码集设置成utf-8。可现在出问题了,某客户使用的数据库是非utf-8的,项目是hibernate自动创建数据库的,所以在项目程序中插入中文数据乱码。
模拟该环境,修改mysql的默认字符集为latin1
解决方法:
hibernate.properties 中的dataSource.url后面加上&useUnicode=true&characterEncoding=utf8
注:spring或者hibernate.cfg.xml配置类似,不详细举例
测试发现,此方法程序运行插入数据结果抛出异常,追踪异常发现是乱码的问题,导致sql语句不能执行。
ok,有点思路了,我连接之前的数据库或者导出utf-8的数据库再导入进来,此方法连接没有问题,插入数据也不会乱码,所以猜想是hibernate创建表的时候没有指定utf-8编码。
既然是这样,重写下MySQL5InnoDBDialect然后在配置文件中指定该方言呗。
继续解决:
package dialect;
import org.hibernate.dialect.MySQL5InnoDBDialect;
/**
*
* Extends MySQL5InnoDBDialect and sets the default charset to be UTF-8
* @author Sorin Postelnicu
* @since Aug 13, 2007
*/
public class CustomMysqlDialect extends MySQL5InnoDBDialect {
public String getTableTypeString() {
return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
}
}
然后修改hibernate.properties中的dataSource.dialect
dataSource.dialect=dialect.CustomMysqlDialect
同样,dataSource.url后面也要加上&useUnicode=true&characterEncoding=utf8
ok,让hibernate重新建个数据库吧,重启下项目。问题解决~