解决JDBC读取MYSQL中文数据时出现乱码的心得…

以前都有没有什么用过MYSQL数据库,近日在用JDBC连接MYSQL数据库,遇到一个让人头痛的问题,就是JDBC读取数据库里的中文数据时,老是乱码,从网上找来各种样的方法,都无法搞定,真是郁闷!最后得一大虾在提醒,恍然大悟……

  我的测试环境及工具:JDK1.60下,MYSQL 5.024A  开发工具:eclipse3.01

  请看本人的源码:

  在MYSQL的数据库dedemo的一个表student存着一个学生的学号和姓名

  public class JdbcDemo{

    public static void main(String[] args){

      try{

      String str,sql;
      Connection conn;
      Statement  stmt;
      ResustSet rs;

      str = "com.mysql.jdbc.Driver";
      Class.forName(str);

      conn = DriverManager.getConnection("jdbc:mysql://localhost/dbdemo?user=root&pwssword=12345");     
     
      stmt = conn.createStatement();
      sql = "select * from student";
      rs = stmt.executeQuery(sql);
 
      while(rs.next()){
    
        String num =  rs.getString(1);
        String name = rs.getString(2);
   
        System.out.println("Num:"+num);
        System.out.println("Name:"+name);
  
      }
      rs.close();
      stmt.close();
      conn.close();

  }catch(Execption e){
   
       e.printStackTrace();
    }
    
}
}
程序运行的结果:
Num:123456
Name: ?????÷

于是我将:conn = DriverManager.getConnection("jdbc:mysql://localhost/dbdemo?user=root&pwssword=12345");改成:conn = DriverManager.getConnection("jdbc:mysql://localhost/dbdemo?user=root&pwssword=12345&useUnicode=true&characterEncoding=gb2312")及 conn = DriverManager.getConnection("jdbc:mysql://localhost/dbdemo?user=root&pwssword=12345&useUnicode=true&characterEncoding=ISO-8859-1")两种方式,运行的结果都同原来一样,还是无法显示正常中文数据。

后来我又将:String Name = rs.getString(2);改成:
String Name = new String(rs.getString(2).getBytes("gb2312"));
其所得结果还是没有解决问题,
最后将其改成:
String Name = new String(rs.getString(2).getBytes("ISO-8859-1"));

问题就解决了!
最后我到网上去查了一上GB2312和ISO-8859-1,得到以下资料,特粘来和大家分享:

“GB2312的原文”是指国家1980年的一个标准《中华人民共和国国家标准信息交换用汉字编码字符集基本集 GB 2312-80》。这个标准用两个数来编码汉字和中文符号。第一个数称为“区”,第二个数称为“位”。所以也称为区位码。1-9区是中文符号,16-55区是一级汉字,56-87区是二级汉字。现在Windows也还有区位输入法,例如输入1601得到“啊”。

  内码是指操作系统内部的字符编码。早期操作系统的内码是与语言相关的.现在的Windows在内部统一使用Unicode,然后用代码页适应各种语言,“内码”的概念就比较模糊了。微软一般将缺省代码页指定的编码说成是内码,在特殊的场合也会说自己的内码是Unicode,例如在GB18030问题的处理上。

  所谓代码页(code page)就是针对一种语言文字的字符编码。例如GBK的code page是CP936,BIG5的code page是CP950,GB2312的code page是CP20936。

  Windows中有缺省代码页的概念,即缺省用什么编码来解释字符。例如Windows的记事本打开了一个文本文件,里面的内容是字节流:BA、BA、D7、D6。Windows应该去怎么解释它呢?

  是按照Unicode编码解释、还是按照GBK解释、还是按照BIG5解释,还是按照ISO8859-1去解释?如果按GBK去解释,就会得到“汉字”两个字。按照其它编码解释,可能找不到对应的字符,也可能找到错误的字符。所谓“错误”是指与文本作者的本意不符,这时就产生了乱码。

  答案是Windows按照当前的缺省代码页去解释文本文件里的字节流。缺省代码页可以通过控制面板的区域选项设置。记事本的另存为中有一项ANSI,其实就是按照缺省代码页的编码方法保存。

  Windows的内码是Unicode,它在技术上可以同时支持多个代码页。只要文件能说明自己使用什么编码,用户又安装了对应的代码页,Windows就能正确显示,例如在HTML文件中就可以指定charset。

  有的HTML文件作者,特别是英文作者,认为世界上所有人都使用英文,在文件中不指定charset。如果他使用了0x80-0xff之间的字符,中文Windows又按照缺省的GBK去解释,就会出现乱码。这时只要在这个html文件中加上指定charset的语句,例如:
如果原作者使用的代码页和ISO8859-1兼容,就不会出现乱码了。


本人只是一个新人,还望各位指导一二……

你可能感兴趣的:(html,sql,mysql,windows,jdbc)