深入浅出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,不附加后面两个参数,驱动程序会自动检测数据库的编码方式以作相应的转换,因此,只要你数据库的编码方式设置好,驱动程序就能正确处理中文了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值