设为首页 收藏本站
查看: 491|回复: 0

[经验分享] 解决JDBC读取MYSQL中文数据时出现乱码的心得…

[复制链接]

尚未签到

发表于 2016-10-22 07:00:59 | 显示全部楼层 |阅读模式
以前都有没有什么用过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兼容,就不会出现乱码了。


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-289545-1-1.html 上篇帖子: Hibernate3.0中的缓存问题(向Mysql数据库插入数据问题) 下篇帖子: MYSQL 局域网或是远程连接速度慢的两种解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表