DB2和oracle数据库char和varchar类型作为检索条件时的差异

来源:互联网 发布:女友胸大什么感觉知乎 编辑:程序博客网 时间:2024/06/04 19:59

 申明:这里只说了两种库的连接方式下。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采用实际值原则进行检索。        
        
以上是在工作中总结出来的。如果有不妥的地方。希望大家不吝赐教。不甚荣幸  

原创粉丝点击