今天小山(本文作者,后面我就这样称呼自己了)在群里遇见一个哥们问一个sql问题(为什么where 条件看起来没生效),无论帖子还是论坛并没有详细的介绍,那么小山跟大家来详细剖析一下这个问题 juhao
本文针对: select * from table where '字符串' ; 情况是细节分析, 解决 where '字符串'
着急解决问题的直接看三、4.谜底总结 但我还是特别希望咱们一起走进谜团,顺着思路,慢慢品学,记忆更深刻~
一、场景叙(lao)述(dao):
起因:
(群里看到问题了)
大图了解一下:
(顺便吐槽下,这csdn的水印神的扎心!还有,我可能写代码写的有点模糊了,图还有点看不清);
这就是群里老哥的问题了:为什么写了一个 select * from rgwcus where 1=1 AND cusoo4='D' ; 这个sql 执行的效果的是全查
'where' 条件没有生效..
二、针对找(tiao)错(cier):
这个老哥是谁叫啥我也不晓得,qq群昵称还有个'乐'字没马赛克就叫 乐乐 吧.毕竟是可能是40岁的大佬 名字也很贴切的.
接下可能有一部分人没用过springJPA可以跳过(跳过这一段也不影响的,跳过的不要担心,也可以硬着头皮看,毕竟知道自己不会也是多知道了一件事)
===============================>可跳过分割线_开始<==================================
首先,乐乐应该是应用了jpa(没用过的点飞机票) 再通过应用书写原生sql的形式来完成查询数据的操作.
因为 这里用到了 where ? 的形式来注入参数 那么对于jpa在参数注入情况呢 对于注入的参数都都统一识别为字字符串,换个说法可以说 只有字符串才可以呗注入参数中。
也就是说实际上 乐乐 预计执行的sql : select * from rgwcus where 1=1 AND cusoo4='D' 实际上 执行的是 :select * from rgwcus where "1=1 AND cusoo4='D'" 注意:红色的双引号
===============================>可跳过分割线_结束<==================================
上面就是说 乐乐 老哥呀在应用框架上呢 误操作 , 把预计执行的sql : select * from rgwcus where 1=1 AND cusoo4='D' 实际执行成 select * from rgwcus where "1=1 AND cusoo4='D'" 是这个样子的(区别注意where 后面是有双引号的,小山用红色来标记了)
三、sql 语句 where '字符串' :
问题来了,我们大家所认知的,sql语句后面直接跟字符串不会报错吗? 不管会不会报错 可能开发了 几年的老哥们都没有直接去尝试过,今天就小山就带着大家一起来试试
插嘴: 慢慢来,小山发现自己有点唠叨了,但是一点一点跟着小山进入谜团,无论是问题还是编程兴趣,看见结果的时候都值得了(这水印真的是...$%^&&^&*^!!!)
尝试:
1.首先随便选个有点数据的表,然后场景还原:
结果是真的全查出来了 ??? 神奇的阿拉蕾啊
2.接下来我们试试多种尝试:
难道是以为只有字符串写了 A=A 就能成吗?试试去!
显然不是!
没有等于的关系呢? 试试!
显然也不是!
3.小(mai)提(guan)示(zi):
看到这应该有一部分应该是关了网页走了(应该很多人已经明白了),下面我就开始解开谜底
4.谜(fei)底(hua)总结:
这之前我们必须知道一个概念要不聊不下去,这不是唠叨!正气凌然!
mysql在把字符串强转成数字有三种方式:
方法一:SELECT CAST('123' AS SIGNED);
方法二:SELECT CONVERT('123',SIGNED);
方法三:SELECT '123'+0;
那么针对字符串不满足数字正则的字符串mysql会取最前面满足数字正则的获取,听不懂举例:
应用方法三演示:
知道这个概念之后....看懂了也别关浏览器撒,尊重一下撸码的自闭患者嘛.
真.谜底!
实际上在执行where 条件的时候 无论where后面的整体是什么,最后的结果都强转成了数字(强转规则就是上面的) 然后通过转的数字跟0作为比较,如果是等于0则结果为0 即false ,如果不为0 结果为1 即true ,所以 where 的是true 还是 false 你还不明白吗?!
如果喜欢我的唠叨,记得关注小山,如果不喜欢....不喜欢你也不能看到这了,加油程序员,你可真是个小机灵鬼呀!
不懂的直接问!这个咱不废话
juhao.