读Mysql时没有问题,在写入Mysql数据库时出现乱码,如何解决?

时间:2022-06-12 23:13:12
运行环境:
Win2000
Tomcat4.1.24
Jdk1.4.1_02
Mysql4.0.13
Mysql的Jdbc驱动mm.mysql-2.0.11-bin.jar

出现的问题:
我在写入一条有中文的数据后,查询数据库,出现了乱码。源码如下:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.sql.*" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<%
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 
out.print("111");
}
catch (Exception E) {
out.println("Unable to load driver.");
}
try {
Connection C = DriverManager.getConnection("jdbc:mysql://localhost/book?user=root");
Statement s=C.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
/**从库中读取数据*/
ResultSet rs=s.executeQuery("select * from bookinfo");
while(rs.next())
{
out.print(rs.getString(1));
out.print(rs.getString(2));
out.print(rs.getString(3));
}
rs.close();

/**写数据到库中*/
String s1="笑傲江湖";
s1=new String(s1.getBytes("ISO-8859-1")); 
String sql="insert into bookinfo values('000006','"+s1+"','金庸','三联出版社',5,'武侠名著')";
s.executeUpdate(sql);
out.print("插入成功");
s.close();
C.close();
}
catch (SQLException e) {
out.print("Error");

}

%> 
</html>

我发现:
0.执行上述语句后"笑傲江湖"所在的字段是?????,其余为中文的字段为乱码。
1.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是输出就是乱码了。(鱼和熊掌不能兼得)
2.Mysql中相应数据库的字符集为none(没有什么gb2312)
连接字符串
"jdbc:mysql://localhost/book?user=root"
改成
"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=8859_1"
输出和输入全变成了?????(问号)
改成
"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
还是乱码!
3.Mysql的Jdbc驱动换成2.0.4和2.0.7都不行,应该不是这里的问题吧?

4.在读写数据库为Access2000的文件中无任何问题。

请大虾们给出个解决方法或者介绍相关文档给我,不胜感激!

9 个解决方案

#1


在所有的jsp中加入
<%
request.setCharacterEncoding("GB2312");
%>

#2


首先,用


"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"


然后



String s1="笑傲江湖";
s1=new String(s1.getBytes("gb2312")); 
String sql="insert into bookinfo values('000006','"+s1+"','金庸','三联出版社',5,'武侠名著')";
s.executeUpdate(sql);
out.print("插入成功");
s.close();
C.close();
}
catch (SQLException e) {
out.print("Error");

}

#3


baitianhai(hong) 
用了"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
整个页面就显示乱码了。。。

#4


当你从数据库中度数据显示在页面上时,是没有中文问题的
但是当你想数据库中写数据时就会出现中文乱码问题,比较通用的写法是,写一个字符集的转换函数,凡是插入中文的地方都要调用该函数:
public static String charConvert(String strSource){
            if (strSource == null){
                return "";
            }
            else{
                try{
                  //return new String(strSource.getBytes("GB2312"), "ISO-8859-1");
                  String str = new String(strSource.getBytes("ISO-8859-1"), "GB2312");
                  System.out.println(str);
                  return str;
                }
                catch (Exception ex){
                  System.out.println(ex.toString());
                  return "";
                }
            }
        }
这样就可以了,记住从数据库中读数据时,不要调用该函数,否则会出现乱码。

#5


把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是输出就是乱码了。(

#6


下面这个方法我用了一下,读写Mysql数据库均无问题!楼主可以试试:
可以通过servlet filter的方式!
在tomcat目录下/wepapps/examples/WEB-INF/classes/filters有一个文件SetCharacte
rEncodingFilter.class
copy到你的classes/filters目录下
再在web.xml加上
    <filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>gb2312</param-value>
        </init-param>
    </filter>

   <filter-mapping>
       <filter-name>Set Character Encoding</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>
以后就不用在jsp中转码了

#7


在web.xml文件里加
<context-param>
<param-name>weblogic.httpd.inputcharset./*</param-name>
<param-value>GB2312</param-value>
  </context-param>

#8


以下文章肯定对你有帮助,仔细看了!

关于JSP读写MySQL数据库的中文问题的测试
测试代码:
1、 检测WEB服务器端当前语言设置:
String srcEncoding = java.lang.System.getProperty("file.encoding");
out.print(srcEncoding);
获取JSP运行时所在的电脑(即WEB服务器)系统的file.encoding属性可查出系统当前的语言设置。
这一步获得的语言设置值,在后面的测试记录表中,称为“语言检测值”。
2、 设置向客户端输出的字符集:
<%@page contentType="text/html;charset=GB2312"%>(斜体部分可替换为BIG5或GBK,下同)
这里的GB2312或BIG5或GBK,在后面的测试记录表中,称为“网页字符集”。
3、 将用户的输入转换为目标字符集:
JSP中:
引用bean:<jsp:useBean id="IDIIL" scope="page" class="IDIIL.IDIILPublic"/>
转换输入值:IDIIL.convertStr(request.getParameter("Name"),"ISO8859-1", "GB2312");
Bean中:
转换函数convertStr代码:
public String convertStr(String str, String FromEncoding, String ToEncoding) throws UnsupportedEncodingException
  {
    String temp_src = str;
    byte[] temp_mid = temp_src.getBytes(FromEncoding);
    String temp_dst = new String(temp_mid, ToEncoding);
    return temp_dst;
  }
4、 显示中文内容:
转换字符集后显示:<%=IDIIL.convertStr(rs.getString("Name"),"ISO8859-1","GB2312")%>
不转换字符集即显示:<%=rs.getString("Name")%>
...测试总结:
1、 最简单通用的中文字符处理方案如下:
对简体中文系统:
1) Windows2000或Redhat Linux7.0 WEB服务器端内核置为简体中文,Redhat Linux7.0 WEB服务器还可置为英文;
2) 网页字符集设为简体中文;
3) 将输入内容转换为简体中文存储;
4) 输出时不作字符集转换。
对繁体中文系统,将上述简体中文系统处理方案中的简体中文替换为繁体中文即可。
英文Windows2000服务器,可安装(免费?)多语言包,即可使用简体或繁体内核。
注:目前只能将中文内容以POST方式提交,尚未解决以GET方式提交中文参数的问题。
2、 GBK字符集对GB2312支持很好,但对Big5支持并不完全,因此,不建议使用GBK作为网页字符集,而对简体中文与繁体中文系统分别使用GB2312与Big5字符集
********************************************************************
 * 解决中文问题,ISO转为GBK编码,用于POST,GET方式取得数据
   * @param str 原始文本
   * @return 转码后的文本
   */
  public String iso2gb(String str) {
      if (str != null) {
          byte[] tmpbyte=null;
          try {
              tmpbyte=str.getBytes("ISO8859_1");
          }
          catch (UnsupportedEncodingException e) {
              System.out.println("Error: Method: dbconn.iso2gb :"+e.getMessage());
          }
          try {
              str=new String(tmpbyte,"GBK");
          }
          catch(UnsupportedEncodingException e) {
              System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
          }
      }
      return str;
  }

  /**
   * 解决中文问题,GBK转ISO编码,用于从数据库中存入转码
   * @param str 原始文本
   * @return 转换后文本
   */
  public String gb2iso(String str) {
      if (str != null) {
          byte[] tmpbyte=null;
          try {
              tmpbyte=str.getBytes("GBK");
          }
          catch(UnsupportedEncodingException e) {
              System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
          }
          try {
              str=new String(tmpbyte,"ISO8859_1");
          }
          catch(UnsupportedEncodingException e) {
              System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
          }
      }
      return str;
  }

#9


经过我的多次测试,只有umljsp(夜未央天未白)的方法能够解决我这里发生的问题(也许每个人的开发环境有差异而引起解决方法的不同)。
感谢所有提建议给我的朋友!非常感谢!
通过测试,学习,再测试,再学习,我觉得自己有必要总结一下,有说的不对的地方请大家指正,另外某些专业性分析可能来自别的大虾的贴子。

1.运行环境:
Win2000(经查,当前语言设置为GBK)
Tomcat4.1.24
Jdk1.4.1_02
Mysql4.0.13(数据库的字符集设为none)
Mysql的Jdbc驱动mm.mysql-2.0.11-bin.jar

2.出现的问题:读写Mysql数据库出现乱码(或????问号)
a.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是中文输  出就是乱码了。

3.分析
我们所用到的数据库读写操作都是在Java环境下完成的,JAVA 语言默认采用Unicode处理字符。
Mysql和Java之间兼容的似乎很好,
这就是为什么如果我们不对Jsp的输出字符集做任何修改(如加上charset=gb2312),则Mysql数据库的读写都应该没问题(如上述的a情况)的原因(只是读出的中文输出为乱码)。
这一点在Access2000上反而没有任何问题,看来是Access2000对GBK(gb2312)编码的支持比较好。
如果朋友们在Mysql的读写数据库中遇到问题,可以试试如下方法:
(以下方法参照umljsp(夜未央天未白)给出的iso2gb()和gb2iso()方法)
方法1:
1.连接数据库   "jdbc:mysql://localhost/book?user=root"
2.读数据库 不需要转码
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现

方法2:
1.连接数据库 jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1"
2.读数据库 执行iso2gb(String str)方法。具体参考此方法的实现
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现

从上面看似乎方法2的形式更对称一些,不过在以后免不了要多写一个转换编码的函数,从页面上看好像是不太舒服,不知大虾们有没有完美的解决方法?

#1


在所有的jsp中加入
<%
request.setCharacterEncoding("GB2312");
%>

#2


首先,用


"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"


然后



String s1="笑傲江湖";
s1=new String(s1.getBytes("gb2312")); 
String sql="insert into bookinfo values('000006','"+s1+"','金庸','三联出版社',5,'武侠名著')";
s.executeUpdate(sql);
out.print("插入成功");
s.close();
C.close();
}
catch (SQLException e) {
out.print("Error");

}

#3


baitianhai(hong) 
用了"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
整个页面就显示乱码了。。。

#4


当你从数据库中度数据显示在页面上时,是没有中文问题的
但是当你想数据库中写数据时就会出现中文乱码问题,比较通用的写法是,写一个字符集的转换函数,凡是插入中文的地方都要调用该函数:
public static String charConvert(String strSource){
            if (strSource == null){
                return "";
            }
            else{
                try{
                  //return new String(strSource.getBytes("GB2312"), "ISO-8859-1");
                  String str = new String(strSource.getBytes("ISO-8859-1"), "GB2312");
                  System.out.println(str);
                  return str;
                }
                catch (Exception ex){
                  System.out.println(ex.toString());
                  return "";
                }
            }
        }
这样就可以了,记住从数据库中读数据时,不要调用该函数,否则会出现乱码。

#5


把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是输出就是乱码了。(

#6


下面这个方法我用了一下,读写Mysql数据库均无问题!楼主可以试试:
可以通过servlet filter的方式!
在tomcat目录下/wepapps/examples/WEB-INF/classes/filters有一个文件SetCharacte
rEncodingFilter.class
copy到你的classes/filters目录下
再在web.xml加上
    <filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>gb2312</param-value>
        </init-param>
    </filter>

   <filter-mapping>
       <filter-name>Set Character Encoding</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>
以后就不用在jsp中转码了

#7


在web.xml文件里加
<context-param>
<param-name>weblogic.httpd.inputcharset./*</param-name>
<param-value>GB2312</param-value>
  </context-param>

#8


以下文章肯定对你有帮助,仔细看了!

关于JSP读写MySQL数据库的中文问题的测试
测试代码:
1、 检测WEB服务器端当前语言设置:
String srcEncoding = java.lang.System.getProperty("file.encoding");
out.print(srcEncoding);
获取JSP运行时所在的电脑(即WEB服务器)系统的file.encoding属性可查出系统当前的语言设置。
这一步获得的语言设置值,在后面的测试记录表中,称为“语言检测值”。
2、 设置向客户端输出的字符集:
<%@page contentType="text/html;charset=GB2312"%>(斜体部分可替换为BIG5或GBK,下同)
这里的GB2312或BIG5或GBK,在后面的测试记录表中,称为“网页字符集”。
3、 将用户的输入转换为目标字符集:
JSP中:
引用bean:<jsp:useBean id="IDIIL" scope="page" class="IDIIL.IDIILPublic"/>
转换输入值:IDIIL.convertStr(request.getParameter("Name"),"ISO8859-1", "GB2312");
Bean中:
转换函数convertStr代码:
public String convertStr(String str, String FromEncoding, String ToEncoding) throws UnsupportedEncodingException
  {
    String temp_src = str;
    byte[] temp_mid = temp_src.getBytes(FromEncoding);
    String temp_dst = new String(temp_mid, ToEncoding);
    return temp_dst;
  }
4、 显示中文内容:
转换字符集后显示:<%=IDIIL.convertStr(rs.getString("Name"),"ISO8859-1","GB2312")%>
不转换字符集即显示:<%=rs.getString("Name")%>
...测试总结:
1、 最简单通用的中文字符处理方案如下:
对简体中文系统:
1) Windows2000或Redhat Linux7.0 WEB服务器端内核置为简体中文,Redhat Linux7.0 WEB服务器还可置为英文;
2) 网页字符集设为简体中文;
3) 将输入内容转换为简体中文存储;
4) 输出时不作字符集转换。
对繁体中文系统,将上述简体中文系统处理方案中的简体中文替换为繁体中文即可。
英文Windows2000服务器,可安装(免费?)多语言包,即可使用简体或繁体内核。
注:目前只能将中文内容以POST方式提交,尚未解决以GET方式提交中文参数的问题。
2、 GBK字符集对GB2312支持很好,但对Big5支持并不完全,因此,不建议使用GBK作为网页字符集,而对简体中文与繁体中文系统分别使用GB2312与Big5字符集
********************************************************************
 * 解决中文问题,ISO转为GBK编码,用于POST,GET方式取得数据
   * @param str 原始文本
   * @return 转码后的文本
   */
  public String iso2gb(String str) {
      if (str != null) {
          byte[] tmpbyte=null;
          try {
              tmpbyte=str.getBytes("ISO8859_1");
          }
          catch (UnsupportedEncodingException e) {
              System.out.println("Error: Method: dbconn.iso2gb :"+e.getMessage());
          }
          try {
              str=new String(tmpbyte,"GBK");
          }
          catch(UnsupportedEncodingException e) {
              System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
          }
      }
      return str;
  }

  /**
   * 解决中文问题,GBK转ISO编码,用于从数据库中存入转码
   * @param str 原始文本
   * @return 转换后文本
   */
  public String gb2iso(String str) {
      if (str != null) {
          byte[] tmpbyte=null;
          try {
              tmpbyte=str.getBytes("GBK");
          }
          catch(UnsupportedEncodingException e) {
              System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
          }
          try {
              str=new String(tmpbyte,"ISO8859_1");
          }
          catch(UnsupportedEncodingException e) {
              System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
          }
      }
      return str;
  }

#9


经过我的多次测试,只有umljsp(夜未央天未白)的方法能够解决我这里发生的问题(也许每个人的开发环境有差异而引起解决方法的不同)。
感谢所有提建议给我的朋友!非常感谢!
通过测试,学习,再测试,再学习,我觉得自己有必要总结一下,有说的不对的地方请大家指正,另外某些专业性分析可能来自别的大虾的贴子。

1.运行环境:
Win2000(经查,当前语言设置为GBK)
Tomcat4.1.24
Jdk1.4.1_02
Mysql4.0.13(数据库的字符集设为none)
Mysql的Jdbc驱动mm.mysql-2.0.11-bin.jar

2.出现的问题:读写Mysql数据库出现乱码(或????问号)
a.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是中文输  出就是乱码了。

3.分析
我们所用到的数据库读写操作都是在Java环境下完成的,JAVA 语言默认采用Unicode处理字符。
Mysql和Java之间兼容的似乎很好,
这就是为什么如果我们不对Jsp的输出字符集做任何修改(如加上charset=gb2312),则Mysql数据库的读写都应该没问题(如上述的a情况)的原因(只是读出的中文输出为乱码)。
这一点在Access2000上反而没有任何问题,看来是Access2000对GBK(gb2312)编码的支持比较好。
如果朋友们在Mysql的读写数据库中遇到问题,可以试试如下方法:
(以下方法参照umljsp(夜未央天未白)给出的iso2gb()和gb2iso()方法)
方法1:
1.连接数据库   "jdbc:mysql://localhost/book?user=root"
2.读数据库 不需要转码
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现

方法2:
1.连接数据库 jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1"
2.读数据库 执行iso2gb(String str)方法。具体参考此方法的实现
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现

从上面看似乎方法2的形式更对称一些,不过在以后免不了要多写一个转换编码的函数,从页面上看好像是不太舒服,不知大虾们有没有完美的解决方法?