`
Dustin
  • 浏览: 315481 次
  • 性别: 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  
谢谢你,三天时间不及你一段话。  

相关推荐

    深入浅出java设计模式(高清中文PDF)

    《深入浅出Java设计模式》是一本专注于Java编程领域中的设计模式专著,旨在帮助开发者深化对设计模式的理解,提高代码质量和可维护性。设计模式是软件开发中经过时间检验的解决方案,它们是解决常见问题的最佳实践。...

    深入浅出java

    《深入浅出Java》这本书以其独特的讲解方式,旨在让学习者轻松掌握复杂的Java编程语言。"深入浅出"这一理念,意味着作者通过直观、生动的示例和丰富的图解,帮助读者逐步理解Java的核心概念和技术。 Java是一种广泛...

    深入浅出JAVA(个人觉得是一本挺不错的书)

    《深入浅出JAVA》这本书是为那些希望深入了解Java编程语言的初学者和有一定经验的开发者量身打造的。书中的内容全面且深入,旨在帮助读者巩固基础,理解Java的核心概念,提升编程技能。 首先,书中的第一章通常会...

    java深入浅出

    java是一门广泛使用的编程语言,适合于初学者进行学习。它的设计理念是简单、面向对象、安全、跨平台、高性能、分布式,并且具有良好的支持。java主要的特点包括了其虚拟机模型、垃圾回收机制、多线程处理以及丰富的...

    深入浅出 Hibernate.pdf

    根据提供的标题“深入浅出 Hibernate.pdf”以及描述“深入浅出 Hibernate.pdf”,我们可以推断这份文档主要讲解了Hibernate框架的相关知识。接下来,我们将基于这些信息展开详细的解释与知识点的梳理。 ### ...

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

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

    深入浅出Java语言程序设计

    "深入浅出Java语言程序设计"这本书无疑是帮助开发者掌握这门强大语言的重要参考资料。以下是对该书内容的详细解读,以及与Java编程相关的知识点。 1. **基础语法**:Java的基础语法包括变量、数据类型、运算符、...

    深入浅出Java2面向对象程序设计 随书光盘 源代码、习题解答及实验工具

    《深入浅出Java2面向对象程序设计》是一本旨在帮助读者深入理解Java编程语言和面向对象编程概念的书籍。随书附带的光盘包含了源代码、习题解答以及实验工具,为学习者提供了丰富的实践资源,使得理论与实践相结合,...

    Head First_深入浅出Java(中文第2版)_带书签_高清完整版 4980

    《Head First 深入浅出Java》是美国作家Kathy Sierra和Bert Bates共同编著的一本经典Java编程教材,特别适合初学者和有一定经验的程序员用来深入理解Java语言。这本书以其独特的“Head First”学习风格而闻名,强调...

    深入浅出Rails(中文版)

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

    深入浅出之Java设计模式

    本篇文章将深入探讨七个主要的Java设计模式,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、代理模式、动态代理、策略模式以及建造者模式,这些都是提高代码复用性、可维护性和扩展性的关键工具。...

    openfire深入浅出

    《OpenFire深入浅出》这本书是关于开源即时通讯服务器OpenFire的权威指南,它涵盖了OpenFire的各个方面,从基础安装到高级配置,旨在帮助读者全面理解并熟练掌握OpenFire的使用和管理。OpenFire是一款基于Java开发的...

    深入浅出java Semaphore.pdf

    《深入浅出Java Semaphore》 Semaphore,中文通常称为信号量,是Java并发编程中的一种重要工具,自JDK 1.5版本起被引入。它主要用于控制对特定资源的并发访问,确保资源得到合理的使用。Semaphore维护了一组虚拟的...

    深入浅出gRPC-李林峰.zip

    《深入浅出gRPC》是李林峰撰写的一本关于gRPC框架的详细教程,旨在帮助读者全面理解和掌握这一先进的远程过程调用(RPC)框架。gRPC是Google开源的一个高性能、开源和通用的RPC框架,它基于HTTP/2协议标准,采用...

    深入浅出Oracle.pdf

    《深入浅出Oracle》这本书是Oracle数据库学习的重要参考资料,它以深入浅出的方式全面解析了Oracle的核心技术与实践应用。Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统,尤其在企业级应用中占据主导...

    深入浅出Java 2入门、进阶与应用实例 光盘源代码

    《深入浅出Java 2入门、进阶与应用实例》是一本专为初学者和有一定基础的Java开发者设计的教程,旨在帮助读者全面理解和掌握Java 2编程技术。光盘源代码提供了书中所有实例的详细实现,使得学习者能够直接实践,加深...

    大名鼎鼎的深入浅出android的简体中文版

    《深入浅出Android》是Android开发领域的一本经典著作,其简体中文版更是为国内开发者提供了方便的学习途径。这本书以其深入浅出的讲解方式,系统地介绍了Android平台的开发技术,适合初学者以及有一定经验的开发者...

Global site tag (gtag.js) - Google Analytics