数据库的重要作用无需多言,java也为我们提供了多种数据库存取方法,如 JDBC,ORM(Hibernate,Toplink)以及EJB中的Entity bean等。其中JDBC是基础,为后面两种方案提供了底层API;后两种对JDBC进行包装,使得我们使用面向对象的方式来操作数据库。在实际运用过程中,我们可以根据自己的实际情况,各取所需。本文主要研究数据库存取过程中可能出现的中文问题,因此选用比较底层的JDBC作为例子。
使用JDBC操作数据库,我们必须得有数据库或者第三方厂商专门提供的数据库驱动程序,在程序运行过程中,我们将驱动程序动态加载到程序中,以连接并操作数据库。下面是使用JDBC操作mysql 5.0和sql server 2000的一个简单例子,我们可以看到,两者只是加载的驱动有所不同,其余操作都是一摸一样的,这充分体现了JDBC提供同一操纵接口的优越性。
使用JDBC操作数据库,我们必须得有数据库或者第三方厂商专门提供的数据库驱动程序,在程序运行过程中,我们将驱动程序动态加载到程序中,以连接并操作数据库。下面是使用JDBC操作mysql 5.0和sql server 2000的一个简单例子,我们可以看到,两者只是加载的驱动有所不同,其余操作都是一摸一样的,这充分体现了JDBC提供同一操纵接口的优越性。
java 代码
- //加载驱动,下载的驱动的jar包必须位于classpath中,加载完后,驱动自动
- //自动在DriverManager中进行注册
- Class.forName("org.gjt.mm.mysql.Driver"); //mysql
- String url = "jdbc:mysql://127.0.0.1/test";
- String user = "root";
- String psw = "123456";
- //Class.forName("com.jnetdirect.jsql.JSQLDriver"); //sql server
- //String url = "jdbc:JSQLConnect://127.0.0.1/database=test";
- //String user = "sa";
- //String psw = "123456";
- Connection con = DriverManager.getConnection(url,user,psw);
- String insert = "insert into teacher values(1,'张老师')";
- Statement sta = con.createStatement();
- sta.execute(insert);
- String sql = "select name from teacher where id=1";
- ResultSet rs = st.executeQuery(sql);
- //如果我们将ResultSet想象为一张二维表,那么返回时,游标处于第一行的上方
- //必须先将其移动到第一行处才能进行读写
- while( rs.next()){
- String des = rs.getString("name");
- System.out.println(des);
- }
- //资源清理
- rs.close();
- sta.close();
- con.close();
使用JDBC操作数据库的过程中,要避免中文问题的出现,必须注意数据库的默认编码方式。mysql的默认编码在安装时可以选取,默认是latine1(也就是ISO-8859-1),安装后可以通过修改my.ini文件进行修改。SQL Sever在安装的时候可以选取,但是过后好像是不能更改的。
如果按照默认设置,使用sql server 2000 是可以正常运行上面的程序的,不会出现中文问题。
但是使用mysql 5.0,程序在进行插入操作的时候却会抛出异常:
- Exception in thread "main" com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'name' at row 1
- at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2868)
- at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
- at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
- at com.mysql.jdbc.Connection.execSQL(Connection.java:3118)
- at com.mysql.jdbc.Connection.execSQL(Connection.java:3047)
- at com.mysql.jdbc.Statement.execute(Statement.java:690)
- at test.Test.mysqlTest(Test.java:73)
- at test.Test.main(Test.java:39)
我们可以通过更改数据库的默认编码来解决这个问题:首先打开my.ini文件,修改default-character-set属性,注意,是[mysqld]下方那个,前面那个是给mysql的客户端看的。
- [mysqld]
- # The TCP/IP Port the MySQL Server will listen on
- port=3306
- #Path to installation directory. All paths are usually resolved relative to this.
- basedir="G:/MySQL/MySQL Server 5.0/"
- #Path to the database root
- datadir="G:/MySQL/MySQL Server 5.0/Data/"
- # The default character set that will be used when a new schema or table is
- # created and no character set is defined
- # default-character-set=latin1
- default-character-set=utf8
注意了,是utf8而不是utf-8,没有那个小横杠的,不然mysql启动的时候会出错。重新启动mysql后,程序就能正常运行了。
有些文章提到在书写url的时候要加上useUnicode和characterEncoding属性,写成
- String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8"
其实,对于版本为4.1以后的mysql,不附加后面两个参数,驱动程序会自动检测数据库的编码方式以作相应的转换,因此,只要你数据库的编码方式设置好,驱动程序就能正确处理中文了。