专栏首页杨建荣的学习笔记同样的sql执行结果不同的原因分析 (r4笔记第27天)

同样的sql执行结果不同的原因分析 (r4笔记第27天)

今天开发的同事问我一个问题,说有一个sql语句,在weblogic的日志中执行没有结果,但是手动拷贝数据到客户端执行,却能够查到。这种奇怪的问题一下子就能引起我的好奇心,从我知道的原因来看啊,可能是存在不可见字符造成的。 对于不可见字符的问题,有必要先说明一下,可以简单举个例子。 我们创建一个表,然后插入的数据含有不可见字符,比如回车,换行符。 SQL> create table test as select object_id,object_name||chr(10) objname from all_objects where rownum<3; Table created

插入数据之后,我们查看一下数据。 SQL> select *from test; OBJECT_ID OBJNAME ---------- ------------------------------- 20 ICOL$ 46 I_USER1 简单的验证一下,可以看到object_id=46对应的是objname为I_USER1的数据行。

SQL> select *from test where objname='I_USER1'; no rows selected --但是查询的时候却没有任何结果 如果我们在查询中明确的加入那个不可见字符,就可以很容易就插叙出来。

SQL> select *from test where objname='I_USER1'||chr(10); OBJECT_ID OBJNAME ---------- ------------------------------- 46 I_USER1 这个时候可以使用dump函数来分析。 如果可以对比一下数据的dump细节,可以发现唯一的差比是最后有一个chr(10)的字符

SQL> select object_id,dump('I_USER1') DUMP1,dump(objname) DUMP2 from test where objname like 'I_USER%';

OBJECT_ID DUMP1 DUMP2 ---------- ---------------------------------- -------------------------------------------------- 46 Typ=96 Len=7: 73,95,85,83,69,82,49 Typ=1 Len=8: 73,95,85,83,69,82,49,10 但是当我自信满满的查看了开发提供的日志之后,然后在客户端中又执行了一遍,发现问题似乎比预想的更有些奇怪。 语句是一个简单的select语句,类似select xxxx,xxxxx,xxxx from districute where entity_id=:id and status='ACTIVE', 其中entity_id是传入的参数。 在反复比较之后,基本上这个地方不太可能出现问题,在API想传入这个特殊字符都不容易。但是一模一样的语句在两边执行结果却不相同。 肯定是某个地方出了问题,我静下来,仔细的分析日志中的sql语句,按照目前的情况来说,只可能在某处修改了数据导致的,从这个查询语句往前排查,最终发现了线索。 在这个查询之前,其中有一步是update操作,语句类似update distribute set xxxx=xxx where distribute_no=:distid 从表面上来看,两个语句的唯一共同之处在于都是基于同一个表。 查看sql语句中对应的变量值,发现在select之前的这步操作已经修改了对应的status值,所以在后续的查询中根据entity_id就匹配不到相应的记录了。 通过数据来说明,就如同下面的情况,我们通过distribute_no修改了status值,再通过status,entity_id来匹配对应的数据行得到的结果就为空,在得到的结果为空后,校验失败,于是事务就回退了。然后下一次调用继续update,select,rollack。 entity_id status distribute_no xxxx 100 ACTIVE 100001 xxxxx 分析了这些之后,问题就一下子明朗多了,不是什么特别的bug,不是什么特别的场景,都是潜意识中自己被误导了。所以大家在排查问题的时候,可能提供给你的信息不是最全面最完整的,我们需要分析去佐证。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:r4笔记第27天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-01-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从Java的类型转换看MySQL和Oracle中的隐式转换(二)(r6笔记第68天)

    说起数据类型转换,在开发中如此,在数据库中也是如此,之前简单对比过MySQL和Oracle的数据类型转换情况,可以参见MySQL和Oracle中的隐式转换 ht...

    jeanron100
  • MySQL特有的SQL语句 第一弹

    关于SQL,我们总是会有无穷无尽相关的话题,有时候碰到了一些觉得不错的SQL功能会标记下来,好记性不烂烂笔头,回头来看,自己也收集了不少的点子,但是从整体来...

    jeanron100
  • 一条报警信息的快速处理和分析(r9笔记第99天)

    下午的时候收到这么一条报警。 ZABBIX-监控系统: ------------------------------------ 报警内容: Too many...

    jeanron100
  • 增加删除字段修改字段名,修改表结构,非常用SQL语句技巧总结

    Alter TABLE [dbo].[CustomerBackupConfig] Add [Stamp] [timestamp] NULLGO

    用户5745385
  • 科普基础 | 这可能是最全的SQL注入总结,不来看看吗

    2.ACCESS没有库名,只有表和字段,并且注入时,后面必须跟表名,ACCESS没有注释

    HACK学习
  • Oracle 数据库-服务器端字符集查看方法

    客户端要连接并操作服务器的 oracle 数据库,很多时候需要知道服务器端的字符集。 通过 sql 语句select usernev('language') ...

    小蓝枣
  • MySQL基础教程最佳典藏版(推荐收藏)

    https://blog.csdn.net/weixin_45108087/article/details/102766281

    挨踢小子部落阁
  • Oracle数据库 拾漏补缺

    select语句的基本使用 可以查询需要的列,行,可以进行多表链接,连接查询。 ? select e.*,e.sal/30 from p_emp e selec...

    二十三年蝉
  • 愿未来没有 Webpack

    现在是 1941 年。你的名字是 Richard Hubbell。你在 CBS 旗下的一个试验性的纽约电视演播室工作。你将要主持一场重大电视新闻广播,这是世界上...

    ConardLi
  • Fuzz自动化Bypass软WAF姿势

    0×00 前言 在我刚接触安全这块时候遇到注入有WAF的网站时候无从下手,寻找各种有关绕过waf的文章,在网页浏览器上使用SQL语句为了绕过WAF变了个法加了些...

    FB客服

扫码关注云+社区

领取腾讯云代金券