申明:这里只说了两种库的连接方式下。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类型。传入的长度要比实际值长。注意空指针问题。        

        

下面是测试的结果:        

DB2中CHAR数据类型 db2的varchar类型_null


        

DB2中CHAR数据类型 db2的varchar类型_null_02


测试总结:        

      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采用实际值原则进行检索。        

        

以上是在工作中总结出来的。如果有不妥的地方。希望大家不吝赐教。不甚荣幸