您的位置:首页 > 数据库 > MySQL

JDBC操作mysql时注意的一些细节

2012-08-01 22:26 253 查看
今天我做了一个java接口程序,实现从mysql数据库中取值插入到一个oracle数据库中。我觉得挺简单的操作,mysql的查询sql写出来了,就没有什么难的了。java中JDBC操作数据库的代码没有太大的变化。但因为一些操作细节没有注意到,浪费了我一下午的时间才搞定。

我的做法是这样的,首先我写出了mysql的查询sql语句,在mysql的数据库客户端上运行一切顺利。注意sql中有含有中文的条件。有一句是 tempTable.type =dinary '利息',查询出来5条记录,mysql的中文查询需要有一个mysql内置的二进制的转换符号。 调试通过,我把sql语句复制到了java的代码中,利用JDBC执行的结果却是0条。我的第一直觉是mysql数据库连接错了吗,但很快我发现,数据库连接是对的,java代码中的sql语句和mysql客户端执行的sql没有任何差别。但客户端和java代码中执行的结果却不一致。

最后问题定位在sql语句中的中文上,java中中文的编码和mysql数据库执行sql时中文编码不一致导致的。

我查看了一下我所要操作的mysql中那个表的建表sql :

CREATE TABLE ` tempTable` (

`CONTRACTID` varchar(10) NOT NULL default '1000000000',

`VERSION` int(2) NOT NULL default '1',

`type` varchar(20) NOT NULL,

`MEMO` text,

`COUNT` int(3) default '0',

PRIMARY KEY (`CONTRACTID`,`VERSION`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

在网上查了很多的文章,最后敲定的解决方案是 把java代码sql语句中的中文进行二进制转换。

String lx = "利息";

lx = new String(lx.getBytes("GBK"),"latin1");

String sql_info="select ......"+

" where tempTable.type ='"+lx+"' " +

"......";

--然后就是JDBC操作

这样改造完成后,再次执行java代码,搞定,和数据库客户端sql执行结果一致。

还有一个细节需要说明,我有一次做接口时出现的一个问题。也郁闷了好久。

我写了一个完全正确的一个sql,但执行的结果并不是我要的结果。 其中sql中有一段 max(atable.version)的操作。

因为对方数据库在建atable表的时候 version这个版本字段建成了varchar类型,实际业务中这个版本最大值为22 而我用sql的max函数查询出的结果是 9 这就导致了查询结果的不一致。后来对方数据库atable表的这个version字段修改成了integer类型
才算执行正确。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: