问题由来:
1.使用Struts2加JDBC的后台,MySQL进行CURD时发现中文乱码.
2.学习Hibenate时发现往MySQL中插入数据还是会乱码,且配置和JDBC有点不同
首先配置将开发工具都设置为UTF-8编码,毕竟UTF-8称为万国码
- eclipse中设置编码Window->Preferences->General->Workspace
PS:建议建议文件的行分隔符用unix(Linux)版本
- 我使用的是Navicat for MySQL,所以新建数据库的时候使用UTF-8编码,排序规则自己根据需要选择.
- 创建表时,如果字段是char,varchar,text等类型时,也要使用utf-8
- 在命令行创建库时,使用如下命令设置编码
CREATE DATABASE `test2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
- 创建数据表时
CREATE TABLE `t_job` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(60) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
- 解决JDBC中文乱码的问题
private static final String DBDRIVER = "com.mysql.jdbc.Driver";
private static final String DBURL =
"jdbc:mysql://localhost:3306/teacher?useUnicode=true&characterEncoding=UTF-8";
private static final String DBUSER = "root";
private static final String DBPASS = "";
我是将对数据库的操作都封装成一个工具类,因为配置信息都是字符串类型,所以在DBURL中必须要加上
?useUnicode=true&characterEncoding=UTF-8 才能解决中文乱码的问题,如果你的配置不是在java文件中,而是在XML文件中,那么你需要下面Hibernate的解决方案!
PS:在做课程设计时有一个诡异的表单中依然发现这样设置还是无法解决,只能使用了一个终极的解决方法:
String content = new String(content.getBytes("iso-8859-1"),"utf-8");//content是form表单中一个text类型的input
在Hibenate中的解决办法
开发工具的基本配置依然如上
- 在hibernate.cfg.xml配置文件中,URL的配置如下
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
</property>
或者
<property name="hibernate.connection.url">
<![CDATA[jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8]]>
</property>
区别在于,如果在XML中写& 的时候,会被XML解析器解析为其他符号参照W3School对XML的解释
在XML中:< 和 & 都会被XML解析器解析,无法成为一个完整的字符串(String),所以有以上两种解决方法!
PS在对java操作SQL时URL的配置一定要区分是在XML文件还是在java文件中,如果在java文件中直接可以写&和<.
如果在XML中配置,&和<都需要转换成实体引用或使用