申明:这里只说了两种库的连接方式下。char和varchar类型作为检索条件时的差异
1,Statement stmt0=conn.prepareStatement(sql);
2,Statement stmt = conn.createStatement();
上面两种方式是不一样的。
第一种方式【prepareStatement】连接方式oracle里面是按真实值进行比较或者说按实际长度进行比较,而在DB2中时按空格补齐原则进行比较
第二种方式【Statement】连接方式oracle和DB2里面都是按照空格补齐原则进行比较的。
※:另外一个比较容易忽视的差异是:DB2是区分空【''】和NULL的。也就是空和NULL是连个不同的值。而ORACLE里面是不区分的。两个认为是一个值。
下面是图表说明以及测试结果的结果:
DB2 Oracle 解决方法
Statement/Proc PrepareStatement Statement/Proc PrepareStatement Statement/Proc PrepareStatement
Char=Char 空格补齐 空格补齐 空格补齐 不用对应 不用对应
Char=常量/变量 实际值比较 变量补空格 双方cast处理
常量/变量=常量/变量 变量补空格 双方cast处理
Varchar=varchar/char/常量/变量 实际值比较 双方cast处理 双方cast处理
函数(char/常量/变量) 双方cast处理 双方cast处理
‘’=‘’ NULL处理 NULL处理 变量补空格 变量补空格
NULL比较 IS NULL IS NULL IS NULL
区分NULL和'' 只有NULL 把''当成NULL处理 只有NULL 把''当成NULL处理
这里说明几点:
1,空格补齐:是说按地段长的一方。把短的字段用空格补齐使两方长度一致
2,实际值比较:按照实际的值以及实际的长度进行比较
3,Cast处理:把比较双方,通过Cast转成Char类型。传入的长度要比实际值长。注意空指针问题。
下面是测试的结果:
测试总结:
1,db2检索,按照空格补齐原则进行检索的。 statement和prepareStatement都一样,找一方长度长的,把另一方后边空格补齐。
2, oracle 检索时,【prepareStatement】连接方式是按真实值进行比较或者说按实际长度进行比较, 而【Statement】连接方式是按照空格补齐原则进行比较的。
3,DB2区分空【''】和NULL的,而oracle只有NULL,他把【’’】当做NULL
4,db2中''=''按照空格补其原则,可以检索数据 ,oracle按照null检索不到数据
5,针对null,无论是db2还是oracle,null=‘’ null=null都不能检索到数据,必须用is null.
6,用函数(Rpad,Lpad,NVL)转化后进行比较时,db2采用空格补齐原则,oracle采用实际值原则进行检索。
以上是在工作中总结出来的。如果有不妥的地方。希望大家不吝赐教。不甚荣幸