2008年12月22日星期一

char型数据和绑定变量

众所周之,在ORACLE数据库中使用绑定变量是比较好的作法。今天一个同事在使用绑定变量的时候碰到一点问题,花了一点时间来解决,这个问题应该很容易碰见,对一般程序员来说挺有挑战性的。

在ORACLE数据库中做以下操作:
create table char_test(tid char(2),nid number(2));
insert into char_test select to_char(rownum),rownum from all_objects where rownum<=10;
commit;

然后分别运行以下语句:
select * from char_test where tid='1';(可以查出来值)
select * from char_test where tid='10';(也可以查出来值)
select * from char_test where tid=:ptid;

在这里将绑定变量ptid设为'1','10',可以看到前者没有查出来值,而后者有值。
原因主要是数据库在做针对字面量的查询时,做了转换,将'1',转换成了占char2,因此前者的出来正确结果,而使用绑定变量的时候,数据库不会做这个转换,因此就查不出来值。当然在都是查询tid='10'的时候,就没有这个问题。

我们也可以查看char(2)和varchar2(2)的区别:
select dump('1') from dual;
select tid from char_test where nid=1;

解决方法是在使用绑定变量并且数据类型是char的时候,将查询语句改写一下:
select * from char_test where tid=rpad(:ptid,2);

没有评论: