查看: 3260|回复: 11

9201升级到9208,应用遇到的一个问题,看大家有没有遇到过

[复制链接]
论坛徽章:
84
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
发表于 2007-12-20 07:13 | 显示全部楼层 |阅读模式
原有应用运行在oracle9201库上,使用select * from xxx where name like 'abc'; 这样的语句可以查询出名字为abc的记录,其中name字段为char(10)类型字段。升级到9208后,该语句无法查到数据,各位见过没这样的问题,是否有其他简单的解决方法,最好是不修改语句
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2007-12-20 08:01 | 显示全部楼层
麻烦问一下:查不到数据是什么报错,XXX(表、视图或者同义词)其他方法访问没有问题么?
单单差不多数据也很难看出准确原因

使用道具 举报

回复
论坛徽章:
26
数据库板块每日发贴之星
日期:2006-09-04 01:02:512009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:虎
日期:2009-08-12 13:08:002010新春纪念徽章
日期:2010-01-04 08:33:082011新春纪念徽章
日期:2011-02-18 11:43:35ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28凯迪拉克
日期:2013-11-20 21:13:48美羊羊
日期:2015-03-04 14:48:582015年新春福章
日期:2015-03-06 11:57:31双子座
日期:2015-09-25 14:44:15
发表于 2007-12-20 08:03 | 显示全部楼层
9.2.0.6  2883715  Wrong results possible from LIKE against a CHAR column with no wildcard
bug列表里有这么一条。


Bug 2883715

Description
Use of LIKE against a CHAR column can return wrong results
if the pattern does not contain any wildcard characters.
The problem occurs as the LIKE is converted to an EQUALS
operation but the blank padding semantics are lost.
(LIKE does not use blank padding comparison semantics)

eg: Assume column X is a CHAR(10) and contains 'ABC' then
      SELECT * from TAB where X like 'ABC';
    should not return any rows as LIKE should not be using
    blank padding comparison semantics. However with this
    bug it does return a row (incorrectly).

If the LIKE pattern does contain a wildcard then the LIKE
works correctly.
eg: LIKE 'A%BC' would not return the row (correctly).


--------------------------------------------------------------------------------

[ 本帖最后由 gengyonghui 于 2007-12-20 08:10 编辑 ]

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
25
生肖徽章2007版:龙
日期:2008-05-06 11:07:48咸鸭蛋
日期:2011-10-19 10:09:12ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24
发表于 2007-12-20 10:03 | 显示全部楼层
加百分号试试吧

使用道具 举报

回复
论坛徽章:
10
每日论坛发贴之星
日期:2007-09-10 01:02:15金色在线徽章
日期:2007-10-03 04:03:16ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44数据库板块每日发贴之星
日期:2007-12-20 01:04:15生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53奥运会纪念徽章:摔跤
日期:2008-09-04 09:51:27生肖徽章2007版:狗
日期:2009-03-10 21:24:29ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:42
发表于 2007-12-20 10:30 | 显示全部楼层
不知道9208里解决了那个BUG没

使用道具 举报

回复
认证徽章
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
发表于 2007-12-20 10:38 | 显示全部楼层
wrong results
的问题,很多都跟char相关。

看Bug 2883715的描述。

select * from xxx where name like 'abc'; 这样的语句可以查询出名字为abc的记录 ==>这是有问题的,错误结果
select * from xxx where name like 'abc'; 这样的语句不返回记录==>这反而是Fixed过的
搞笑~~

使用道具 举报

回复
论坛徽章:
6
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:兔
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
发表于 2007-12-20 10:49 | 显示全部楼层
原帖由 Ora-600 于 2007-12-20 07:13 发表
原有应用运行在oracle9201库上,使用select * from xxx where name like 'abc'; 这样的语句可以查询出名字为abc的记录,其中name字段为char(10)类型字段。升级到9208后,该语句无法查到数据,各位见过没这样的问题,是否有其他简单的解决方法,最好是不修改语句



将char(10) 改成 varchar2(10)

然后用update 去掉列两边的空格就可以了,其原因就是char(10)中间含有空格

使用道具 举报

回复
论坛徽章:
84
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
 楼主| 发表于 2007-12-20 11:03 | 显示全部楼层
原帖由 gengyonghui 于 2007-12-20 08:03 发表
9.2.0.6  2883715  Wrong results possible from LIKE against a CHAR column with no wildcard
bug列表里有这么一条。


Bug 2883715

Description
Use of LIKE against a CHAR column can return wrong results
if the pattern does not contain any wildcard characters.
The problem occurs as the LIKE is converted to an EQUALS
operation but the blank padding semantics are lost.
(LIKE does not use blank padding comparison semantics)

eg: Assume column X is a CHAR(10) and contains 'ABC' then
      SELECT * from TAB where X like 'ABC';
    should not return any rows as LIKE should not be using
    blank padding comparison semantics. However with this
    bug it does return a row (incorrectly).

If the LIKE pattern does contain a wildcard then the LIKE
works correctly.
eg: LIKE 'A%BC' would not return the row (correctly).


--------------------------------------------------------------------------------



呵呵,首先谢谢楼上几位,这个确实是oracle的一个“bug”,不过确切的说,也不能完全算bug
我得感觉,在以前的版本中,oracle是支持使用like 来做模糊查询和精确匹配的(也就是like 'ABC'),但是可能顾及到like这样会代替掉等号的功能,所以在后期的版本中将like的精确匹配功能去掉,也就是like只能做模糊查询,而精确查询必须使用等号。呵呵,我是这么理解的,不过对于客户需求来说,这样并不是一个好特性,因为客户既可能需要模糊查询,也可能需要精确匹配,如果like还是以前的使用方法,那么用户程序的灵活度明显提升了,所以一些新的特性,并不见得一定很好用

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2007-12-20 11:15 | 显示全部楼层
SQL> create table a(m char(10));

表已创建。

SQL> insert into a values('abc');

已创建 1 行。

SQL> select * from a where m='abc';

M
----------
abc

SQL> select * from a where m like 'abc';

未选定行

SQL>  create table b(m varchar(10));

表已创建。

SQL> insert into b values('abc');

已创建 1 行。

SQL> select * from b where m='abc';

M
----------
abc

SQL> select * from b where m like 'abc';

M
----------
abc

ps:这个不能算做bug吧

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2007-12-20 11:22 | 显示全部楼层
SQL> create table a(m char(10));

表已创建。

SQL> insert into a values('abc');

已创建 1 行。

SQL> select * from a where m='abc';

M
----------
abc

SQL> select * from a where m like 'abc';

未选定行

SQL>  create table b(m varchar(10));

表已创建。

SQL> insert into b values('abc');

已创建 1 行。

SQL> select * from b where m='abc';

M
----------
abc

SQL> select * from b where m like 'abc';

M
----------
abc

SQL> alter session set sql_trace=true;

会话已更改。

SQL> select * from a where m like 'abc';

未选定行

SQL> select * from b where m like 'abc';

M
----------
abc

SQL> alter session set sql_trace=false;

会话已更改。


trace如下:

SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),0), NVL(SUM(C2),0) FROM (SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("A") FULL("A") NO_PARALLEL_INDEX("A") */ 1 AS C1, CASE WHEN "A"."M" LIKE 'abc' THEN 1 ELSE 0 END AS C2 FROM "A" "A") SAMPLESUB
END OF STMT
PARSE #2:c=0,e=1366,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,tim=607686005
EXEC #2:c=0,e=58,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=607691899
FETCH #2:c=0,e=105,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=1,tim=607692857
STAT #2 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE (cr=3 pr=0 pw=0 time=109 us)'
STAT #2 id=2 cnt=1 pid=1 pos=1 obj=51447 op='TABLE ACCESS FULL A (cr=3 pr=0 pw=0 time=72 us)'
=====================
PARSING IN CURSOR #1 len=34 dep=0 uid=0 oct=3 lid=0 tim=607695977 hv=931550545 ad='6bed198c'
select * from a where m like 'abc'
END OF STMT
PARSE #1:c=15625,e=12028,p=0,cr=4,cu=0,mis=1,r=0,dep=0,og=1,tim=607695971
EXEC #1:c=0,e=48,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=607700940
FETCH #1:c=0,e=63,p=0,cr=3,cu=0,mis=0,r=0,dep=0,og=1,tim=607702347
STAT #1 id=1 cnt=0 pid=0 pos=1 obj=51447 op='TABLE ACCESS FULL A (cr=3 pr=0 pw=0 time=54 us)'
=====================
PARSING IN CURSOR #2 len=381 dep=1 uid=0 oct=3 lid=0 tim=614858140 hv=1242889131 ad='6bed0f50'
SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),0), NVL(SUM(C2),0) FROM (SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("B") FULL("B") NO_PARALLEL_INDEX("B") */ 1 AS C1, CASE WHEN "B"."M" LIKE 'abc' THEN 1 ELSE 0 END AS C2 FROM "B" "B") SAMPLESUB
END OF STMT
PARSE #2:c=0,e=1391,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,tim=614858134
EXEC #2:c=0,e=62,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=614864714
FETCH #2:c=0,e=103,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=1,tim=614865704
STAT #2 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE (cr=3 pr=0 pw=0 time=100 us)'
STAT #2 id=2 cnt=1 pid=1 pos=1 obj=51448 op='TABLE ACCESS FULL B (cr=3 pr=0 pw=0 time=71 us)'
=====================
PARSING IN CURSOR #3 len=34 dep=0 uid=0 oct=3 lid=0 tim=614869065 hv=2153331111 ad='6bed1350'
select * from b where m like 'abc'
END OF STMT
PARSE #3:c=15625,e=12964,p=0,cr=4,cu=0,mis=1,r=0,dep=0,og=1,tim=614869059
EXEC #3:c=0,e=47,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=614873909
FETCH #3:c=0,e=61,p=0,cr=3,cu=0,mis=0,r=1,dep=0,og=1,tim=614874875
FETCH #3:c=0,e=12,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=614876766
STAT #3 id=1 cnt=1 pid=0 pos=1 obj=51448 op='TABLE ACCESS FULL B (cr=3 pr=0 pw=0 time=50 us)'
*** 2007-12-20 11:19:46.686



sqlplus :

SQL> SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param('pa
rallel_execution_enabled', 'false') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),0), NVL(
SUM(C2),0) FROM (SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("B") FULL("B") NO_PARALLEL_INDEX("B") */
1 AS C1, CASE WHEN "B"."M" LIKE 'abc' THEN 1 ELSE 0 END AS C2 FROM "B" "B") SAMPLESUB
  2  ;

NVL(SUM(C1),0) NVL(SUM(C2),0)
-------------- --------------
             1              1

SQL> SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param('pa
rallel_execution_enabled', 'false') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),0), NVL(
SUM(C2),0) FROM (SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("A") FULL("A") NO_PARALLEL_INDEX("A") */
1 AS C1, CASE WHEN "A"."M" LIKE 'abc' THEN 1 ELSE 0 END AS C2 FROM "A" "A") SAMPLESUB
  2  ;

NVL(SUM(C1),0) NVL(SUM(C2),0)
-------------- --------------
             1              0

SQL>

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表