今天小山(本文作者,后面我就这样称呼自己了)在群里遇见一个哥们问一个sql问题(为什么where 条件看起来没生效),无论帖子还是论坛并没有详细的介绍,那么小山跟大家来详细剖析一下这个问题 juhao

本文针对: select * from table where '字符串' ;  情况是细节分析, 解决 where '字符串'

着急解决问题的直接看三、4.谜底总结  但我还是特别希望咱们一起走进谜团,顺着思路,慢慢品学,记忆更深刻~

一、场景叙(lao)述(dao):

 

起因:

mysql where添加if判断_where 字符串

(群里看到问题了) 

大图了解一下:

mysql where添加if判断_mysql_02

mysql where添加if判断_where 字符串_03

(顺便吐槽下,这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语句后面直接跟字符串不会报错吗?  不管会不会报错 可能开发了 几年的老哥们都没有直接去尝试过,今天就小山就带着大家一起来试试

插嘴: 慢慢来,小山发现自己有点唠叨了,但是一点一点跟着小山进入谜团,无论是问题还是编程兴趣,看见结果的时候都值得了

mysql where添加if判断_where 字符串_04

(这水印真的是...$%^&&^&*^!!!)

尝试:

1.首先随便选个有点数据的表,然后场景还原:

mysql where添加if判断_mysql_05

结果是真的全查出来了  ???  神奇的阿拉蕾啊

2.接下来我们试试多种尝试:

mysql where添加if判断_mysql_06

难道是以为只有字符串写了  A=A 就能成吗?试试去!

mysql where添加if判断_mysql where添加if判断_07

显然不是!

没有等于的关系呢? 试试!

mysql where添加if判断_mysql where添加if判断_08

显然也不是!

 3.小(mai)提(guan)示(zi):

mysql where添加if判断_mysql_09

看到这应该有一部分应该是关了网页走了(应该很多人已经明白了),下面我就开始解开谜底

 

4.谜(fei)底(hua)总结:

这之前我们必须知道一个概念要不聊不下去,这不是唠叨!正气凌然!

mysql在把字符串强转成数字有三种方式:

方法一:SELECT CAST('123' AS SIGNED);
方法二:SELECT CONVERT('123',SIGNED);
方法三:SELECT '123'+0;

 

那么针对字符串不满足数字正则的字符串mysql会取最前面满足数字正则的获取,听不懂举例:

应用方法三演示:

mysql where添加if判断_mysql where添加if判断_10

知道这个概念之后....看懂了也别关浏览器撒,尊重一下撸码的自闭患者嘛.

真.谜底!

实际上在执行where 条件的时候 无论where后面的整体是什么,最后的结果都强转成了数字(强转规则就是上面的) 然后通过转的数字跟0作为比较,如果是等于0则结果为0 即false  ,如果不为0 结果为1 即true ,所以 where 的是true 还是 false 你还不明白吗?!

 

如果喜欢我的唠叨,记得关注小山,如果不喜欢....不喜欢你也不能看到这了,加油程序员,你可真是个小机灵鬼呀!

不懂的直接问!这个咱不废话

juhao.