`
Dustin
  • 浏览: 310235 次
  • 性别: Icon_minigender_1
  • 来自: 广州/成都
社区版块
存档分类
最新评论

深入浅出java中文问题(五)数据库出现的中文问题

阅读更多
   数据库的重要作用无需多言,java也为我们提供了多种数据库存取方法,如 JDBC,ORM(Hibernate,Toplink)以及EJB中的Entity bean等。其中JDBC是基础,为后面两种方案提供了底层API;后两种对JDBC进行包装,使得我们使用面向对象的方式来操作数据库。在实际运用过程中,我们可以根据自己的实际情况,各取所需。本文主要研究数据库存取过程中可能出现的中文问题,因此选用比较底层的JDBC作为例子。
     使用JDBC操作数据库,我们必须得有数据库或者第三方厂商专门提供的数据库驱动程序,在程序运行过程中,我们将驱动程序动态加载到程序中,以连接并操作数据库。下面是使用JDBC操作mysql 5.0和sql server 2000的一个简单例子,我们可以看到,两者只是加载的驱动有所不同,其余操作都是一摸一样的,这充分体现了JDBC提供同一操纵接口的优越性。
java 代码
  1.  //加载驱动,下载的驱动的jar包必须位于classpath中,加载完后,驱动自动   
  2.  //自动在DriverManager中进行注册   
  3.  Class.forName("org.gjt.mm.mysql.Driver"); //mysql   
  4.  String url = "jdbc:mysql://127.0.0.1/test";   
  5.  String user = "root";   
  6.  String psw = "123456";   
  7.   
  8.  //Class.forName("com.jnetdirect.jsql.JSQLDriver"); //sql server   
  9.  //String url = "jdbc:JSQLConnect://127.0.0.1/database=test";   
  10.  //String user = "sa";   
  11.  //String psw = "123456";   
  12.     
  13.  Connection con = DriverManager.getConnection(url,user,psw);   
  14.     
  15.  String insert = "insert into teacher values(1,'张老师')";   
  16.  Statement sta = con.createStatement();   
  17.  sta.execute(insert);   
  18.  String sql = "select name from teacher where id=1";   
  19.  ResultSet rs = st.executeQuery(sql);   
  20.  //如果我们将ResultSet想象为一张二维表,那么返回时,游标处于第一行的上方   
  21. //必须先将其移动到第一行处才能进行读写    
  22.  while( rs.next()){   
  23.      String des = rs.getString("name");   
  24.      System.out.println(des);   
  25.  }   
  26.     
  27. //资源清理   
  28. rs.close();   
  29. sta.close();   
  30. con.close();        


    使用JDBC操作数据库的过程中,要避免中文问题的出现,必须注意数据库的默认编码方式。mysql的默认编码在安装时可以选取,默认是latine1(也就是ISO-8859-1),安装后可以通过修改my.ini文件进行修改。SQL Sever在安装的时候可以选取,但是过后好像是不能更改的。
     如果按照默认设置,使用sql server 2000 是可以正常运行上面的程序的,不会出现中文问题。
     但是使用mysql 5.0,程序在进行插入操作的时候却会抛出异常:

  1. Exception in thread "main" com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'name' at row 1  
  2.  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2868)   
  3.  at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)   
  4.  at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)   
  5.  at com.mysql.jdbc.Connection.execSQL(Connection.java:3118)   
  6.  at com.mysql.jdbc.Connection.execSQL(Connection.java:3047)   
  7.  at com.mysql.jdbc.Statement.execute(Statement.java:690)   
  8.  at test.Test.mysqlTest(Test.java:73)   
  9.  at test.Test.main(Test.java:39)  

       我们可以通过更改数据库的默认编码来解决这个问题:首先打开my.ini文件,修改default-character-set属性,注意,是[mysqld]下方那个,前面那个是给mysql的客户端看的。

  1.   [mysqld]   
  2. # The TCP/IP Port the MySQL Server will listen on   
  3.    port=3306  
  4. #Path to installation directory. All paths are usually resolved relative to this.   
  5.    basedir="G:/MySQL/MySQL Server 5.0/"  
  6. #Path to the database root   
  7.     datadir="G:/MySQL/MySQL Server 5.0/Data/"  
  8. # The default character set that will be used when a new schema or table is   
  9. # created and no character set is defined   
  10. default-character-set=latin1  
  11.    default-character-set=utf8    

     注意了,是utf8而不是utf-8,没有那个小横杠的,不然mysql启动的时候会出错。重新启动mysql后,程序就能正常运行了。
     有些文章提到在书写url的时候要加上useUnicode和characterEncoding属性,写成

  1. String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8"  

     其实,对于版本为4.1以后的mysql,不附加后面两个参数,驱动程序会自动检测数据库的编码方式以作相应的转换,因此,只要你数据库的编码方式设置好,驱动程序就能正确处理中文了。

分享到:
评论
2 楼 zpl3001 2009-01-29  
好东西,顶了
1 楼 yjzengli 2008-10-04  
谢谢你,三天时间不及你一段话。  

相关推荐

    深入浅出Rails(中文版)

    《深入浅出Rails(影印版)》内容简介:通过此书,你将学习:希望你的网络应用超越平庸进入Web 2.0时代?《深入浅出Rails》将使你的编程和生产力达到最大值。你将学习一切Rails scaffolding的基本原理,以创建自定义的...

    HeadFirst系列之:深入浅出Rails(中文版)高清完整PDF

    《深入浅出Rails》将使你的编程和生产力达到最大值。你将学习一切Rails scaffolding的基本原理,以创建自定义的交互式网络应用程序,全部使用Rails的一套丰富的工具和MVC框架。 你将掌握数据库交互、Ajax和XML的集成...

    深入浅出hibernate(PDF)第三部分

    本书由互联网上影响广泛的开放文档OpenDoc系列自由文献首份文档“Hibernate开发...深入浅出hibernate(PDF)第二部分,深入浅出hibernate(PDF)第三部分全部下载,并解压到一个地方才可以正常解压阅读.给大家带来不便望谅解.

    深入浅出oracle

    循序渐进地学习使用Oracle开发所需知识 n 第一部分:关系数据库基础 数据库是什么、有什么、能干什么;关系型数据库是什么、有什么、能干什么 关系理论 n 第二部分:SQL ...《深入浅出学Oracle》——系列精品教程

    深入浅出MyBatis技术原理与实战.pdf 高清

    《深入浅出MyBatis技术原理与实战》不是一本味同嚼蜡的理论专著,而是一本MyBatis 的实践指南,无论你是Java 程序员、MyBatis开发者,还是Java 持久层框架的研究者,你都能从本书中收获知识。

    深入浅出设计模式(中文版)

    5.10.3C#实例——数据库连接模板 274 5.10.4Java实例——冒泡排序模板 277 5.10.5优势和缺陷 280 5.10.6应用情景 280 5.11VisitorPattern(访问者模式) 280 5.11.1定义 280 5.11.2现实例子——收银员收银计费...

    深入浅出JDK 源码

    深入浅出JDK(书籍源码,无书籍内容) 作者: 涂传滨 丛书名: Java技术大系 出版社:电子工业出版社 简介:从Java语言的特点、语法、开发环境入手,深入讲解如何利用JDK提供的API进行应用开发,如输入输出、线程...

    深入浅出Hibernate源码

    在安装完mysql之后,请使用客户端或者phpmyadmin建立一个名为forum的mysql数据库,其字符集必须为UTF-8(见下面关于中文的说明,在phpmyadmin中应该选择utf8_general_ci)。另外还需要建立名为forum的用户,密码也为...

    深入浅出设计模式(中文版电子版)

    5.10.3C#实例——数据库连接模板 274 5.10.4Java实例——冒泡排序模板 277 5.10.5优势和缺陷 280 5.10.6应用情景 280 5.11VisitorPattern(访问者模式) 280 5.11.1定义 280 5.11.2现实例子——收银员收银计费...

    夏昕.深入浅出Hibernate

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用...

    深入浅出jBPM完整版part1

    JbpmContext.........................................19 2.1.1 JbpmConfiguration...............19 2.1.2 JbpmContext.............................21 2.2 构建jBPM数据库........................................

    深入浅出时序数据库之分级存储

    物联网领域近期如火如,互联网和传统公司争相布局物联网。作为物联网领域数据存储的首选,时序数据库也越来越多进入人们的视野,而早在2016年7月,百度云在其天工物联网平台上发布了国内首个多

    深入浅出MyBatis技术实战

    非常好的JAVA开发数据库操作文档,学习MyBatis技术必读文档。

    Head First_深入浅出Android开发(中文版)_带书签_高清完整版

    你会学到一些实践技巧,掌握如何建立应用的结构,如何设计界面,如何创建数据库,如何让你的应用同时适用手机和平板电脑,以及很多其他方面。这就像是有一位富有经验的Android开发人员坐在你旁边!你只需要对Java有...

    深入浅出Hibernate

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    \深入浅出Hibernate

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

Global site tag (gtag.js) - Google Analytics