表A 中有个字段 cid char(40) 是主键现在直接 select * from A
cid
HRPMP00000000046
HRPMP00000000047
HRPMP00000000048但是 select * from A where cid='HRPMP00000000046' 却查不出数据。
select * from A where cid like 'HRPMP00000000046'
select * from A where cid = trim('HRPMP00000000046')
select * from A where trim(cid) = 'HRPMP00000000046'  这3种方式都有可以查出数据。
因为平台问题 默认会生成 select * from A where cid='HRPMP00000000046' 这种方式,求解这是为什么?百度知道:http://zhidao.baidu.com/link?url=6FQ2FJfP5GCPd7JoMqCzDELCFQfgb1i6G9t8n0_0ROYJ72Hal9jJoeJmbVRBaVtwZgl41qXU3O9S8hYQVnE4ua,这个问题的情况和我的 正好相反啊。  大神呢

解决方案 »

  1.   

    你这里是char(40)类型的,如果你插入的数据长度不足40,后便将以空格填满。
    如果你在插入“HRPMP00000000046”时,数据库中的数据实际为“HRPMP00000000046                        ”楼主如连接下char,与varchar2之间的区别就明白了
      

  2.   

    where中cid='HRPMP00000000046' , char类型与常量比较时,oracle 不是自动会将常量右补齐空格后再比较的?
      

  3.   


    oracle对于char类型,如果字符数不够的话,会在左边补空格,和常量比较,oracle也不会自动补全的。楼主可以用varchar2(40)类型,就可以自动补全了
      

  4.   


    oracle对于char类型,如果字符数不够的话,会在左边补空格,和常量比较,oracle也不会自动补全的。楼主可以用varchar2(40)类型,就可以自动补全了
    可是现在表的字段类型我无权更改,char(40)还得用char(40),而这中间件自动生成的就是 select * from A where cid='HRPMP00000000046',导致检索不出数据。
      

  5.   

    char(40)固定长度40,不够会补空格。
    varchar2 类型就不存在这个问题。呵呵
      

  6.   


    oracle对于char类型,如果字符数不够的话,会在左边补空格,和常量比较,oracle也不会自动补全的。楼主可以用varchar2(40)类型,就可以自动补全了
    可是现在表的字段类型我无权更改,char(40)还得用char(40),而这中间件自动生成的就是 select * from A where cid='HRPMP00000000046',导致检索不出数据。
    oracle对于char类型,如果字符数不够的话,会在左边补空格,和常量比较,oracle也不会自动补全的。楼主可以用varchar2(40)类型,就可以自动补全了
    可是现在表的字段类型我无权更改,char(40)还得用char(40),而这中间件自动生成的就是 select * from A where cid='HRPMP00000000046',导致检索不出数据。建议两种方法:
    1、select * from A where cid=rpad('HRPMP00000000046',40,' ');
    2、select * from A where trim(cid)='HRPMP00000000046';