如何解决mysql乱码问题
问题是这样的,我用struts来做一个用户注册的界面,其中username和sex这2个字段是需要中文的
但是我在Action调用UserDao来进行插入用户类的时候,发生了乱码的问题
1.从jsp页面上(gb2312的页面)上传到Action类的UserForm的值应该是乱码的,这时候我们要做第一步的转换编码
2.从Action类调用UserDao来进行对数据库的数据插入时,我们也需要首先设定数据库的编码格式,否则也会出现乱码
解决方法一:
1.首先在UserDao中增加一个编码转换的函数bx
public String bx(String str) {
try {
byte b[] = str.getBytes("iso-8859-1");
str = new String(b);
} catch (Exception e) {
}
return str;
}
2.在获取中文之后,因为中文是乱码的,必须把编码弄成iso-8859-1才能正常显示中文,所以在插入数据库之前,
要把需要转换的中文利用bx函数进行转换
ps = con.prepareStatement("insert into users(name,password,adds,sex,email,age,times) values(?,?,?,?,?,?,?)");
ps.setString(1, bx(uf.getName()));
ps.setString(2, uf.getPassword());
ps.setString(3, bx(uf.getAdds()));
ps.setString(4, bx(uf.getSex()));
ps.setString(5, uf.getEmail());
ps.setString(6, uf.getAge());
ps.setString(7, ts);
3.修改连接字符串url
String url = "jdbc:mysql://localhost:3306/" + dbname+"?useUnicode=true&characterEncoding=gbk";
增加"?useUnicode=true&characterEncoding=gbk"增加这一串代码,主要是设定数据库的编码格式为gbk,记得是小写
4.数据库是什么编码不重要,重要的是存储中文的字段的编码必须是gb2312,因为这样才能存储中文
注意name的Column Charset是gb2312 ,sex和adds字段同理,把Column Charset改为gb2312
解决方法二:
1.因为在jsp页面传递到ActionForm的时候,中文已经是乱码的,所以我们可以在ActionForm中的reset函数直接就把编码设置为GBK
public void reset(ActionMapping mapping, HttpServletRequest request) {
try {
request.setCharacterEncoding("GBK");
} catch (Exception e) {
// TODO: handle exception
}
}
2.修改连接字符串url
String url = "jdbc:mysql://localhost:3306/" + dbname+"?useUnicode=true&characterEncoding=gbk";
增加"?useUnicode=true&characterEncoding=gbk"增加这一串代码,主要是设定数据库的编码格式为gbk,记得是小写
3.数据库是什么编码不重要,重要的是存储中文的字段的编码必须是gb2312,因为这样才能存储中文
注意name的Column Charset是gb2312 ,sex和adds字段同理,把Column Charset改为gb2312
通过以上2种方法其中之一都可以实现mysql乱码的解决,记住步骤
1.转换乱码为中文
2.url修改,数据库编码格式为gbk
3.中文字段必须为中文编码