=======================================================================================其实mysql装好以后,他会要你进行配置的,如果你已经装好了没关系,再配置一次就是了,在开始菜单中的mysql---->MySQL Server Instance Config Wizard点他就进行配置了,一切都保持默认就可除了一项,这一项就是选择字符集的时候默认是lating拉丁,所以要改成能显示中文的字符集,gbk,gb2312,utf-8都可以,至于这几种字符编码的区别我就不太清楚,不过我好像在哪本书上看了,说gb2312没有utf-8显示的全,意思就是uft-8能显示所有的中文字符,而gb2312对于一些生僻字可能就不能显示了,不过那都是几千万分之一了,因为那些字根本就不常见,一般也用不着,所以gb2312也是够用的了,不用担心他显示乱码.配好这一步以后,我们来看看我的字符集,在mysql命令行输用show variables like 'character/_set/_%'; 显示一下;
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+--------+
所以根本就不用设置其他的就都可以了, 网上有人 说要把其他的character_set_client /character_set_database ==都设成什么gb2312我不设一样可以.而且设了还出错,所以我们不用设,麻烦.
---------------------------------------------------------------------------------------------------------------------------------------------'
好现在我来讲一下怎么解决中文乱码问题吧,其实很简单, 网上也有,就是用一个转码就OK了,
原理:mysql默认的字符集是latin1,java中对应的就是ISO-8859-1字符集,所以存入数据时转换为ISO-8859-1,取出时再由ISO-8859-1转换为GBK就OK了。
import java.io.UnsupportedEncodingException;
//解决中文问题
public class MysqlCharacterChange {
public static String changeToISO(String str) {
if (str == null) {
str = "";
} else {
try {
str = new String(str.getBytes("GBK"), "ISO-8859-1");
//System.out.println(str);
} catch (Exception ex) {
ex.printStackTrace();
}
}
return str;
}
public static String changeToGBK(String str)
{
try {
String temp_p = str;
byte[] temp_t = temp_p.getBytes("ISO-8859-1");
String temp = new String(temp_t,"GBK");
return temp;
}catch (Exception ex) {
//System.out.println(ex);
return "";
}
}
}
取出时 MysqlCharacterChange. changeToISO(rs.getString("列名");//这里的列名是你数据库中包含中文信息的列如name,CharacterChange这是我为
id name
1 张三
这个函数接收一个字符串,返回一个字符串,返回的字符串是经进转码了的.只要在你要插入到数据库的地方调用这个函数就行了,
实例:
String name= "王五 ";
String address= "广州";
insert into student(stu_id,name,address,birthdate) values('12',' "+changeToISO(name)+ "',' "+changeToISO(address)+ "','1981/01/01') ";
也可以这样
pstmt=con.prepareStatement("insert into departments (did,dname,updid) values(?,?,?)");
//System.out.println(num + "/" + name + "/" + upnum);
con.setAutoCommit(false);
pstmt.setString(1,num);
pstmt.setString(2, 你的类名.GBKToLatin1(name));//这里的name是一个包含中文字符的变量
pstmt.setString(3, upnum);
pstmt.executeUpdate();
con.commit();
以上是解决数据库乱码的方法,至于jsp页面乱码问题的解决那就更简单了
<%@page contentType="text/html; charset=gb2312"%>
这一行是设置页面显示的字符编码,然后页面间传递时使用的字符编码,我人用一个过滤器,
新建一个java类.我这里的文件名是SetCharacterEncodingFilter.java内容如下:
public class SetCharacterEncodingFilter implements Filter{
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)throws IOException,ServletException{
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void destroy() {
// Just puts "destroy" string in log
// Put your code here
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occure
*/
public void init(FilterConfig filterConfig) throws ServletException {
// Put your code here
}
}
类新建好了以后,就到web.xml文件中去配置一下
2、再在web.xml文件中配置,注意一定要在最前面,不然在其他配置后面就有可能不能起来过滤效果。<filter-class>为上面那个类的详细路径和类名,一定不能错
<filter><filter-name>与<filter-mapping> <filter-name> 中名字要完全一样,名字可以自己乱取
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>com.xeeder.character.SetCharacterEncodingFilter</filter-class>//这是上面那个类的具体位置,根据你自己建在哪里而定,我的是在这个包里com.xeeder.character文件名是SetCharacterEncodingFilter,所以就这样配.
</filter>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>//这个名字与上面的filter-name一致
<url-pattern>/*</url-pattern>
</filter-mapping>
ok了,所有的问题都OK了,一切乱码都搞定了.