关于MySQL的“特殊查询”会查到“所有数据”问题的解读

如图,mysql使用以下查询语句时,貌似会查出“所有数据”:select * from member where username='kobe'+'';

50bd815eb26ec6d2cd6bc88ac8f0c891.png

实际上,直接查这个表的时候,还有其他数据,但通过这种“特殊查询”没有查到

bd21da60c5d2cf7fb56a7c6d34777ea5.png

这是因为在mysql中,字符串与数值的运算,首先会尝试将字符串转化为数值,再进行运算。但如果字符串的前面并不是以数字开头,则会直接转化为0,上述特殊查询语句相当于select * from member where username=0;

而'321'字符串转为数值是321,并不等于0,'3210'同理,所以通过这种“特殊方式”查询不到

020595b804b68c13c4fa1eb6e46d82f1.png

当然还有一种更特殊的情况,查看这条查询语句:select * from member where username='300kobe'+21;

ca4f9c87cc151b1078ff8d4ca3717f99.png

发现能够查到数据,因此我们可以推测,mysql中字符串转数值类型,是从第一个不为数值的字符处开始截断,下面尝试这条语句:select * from member where username='250ko123be'+'50abcd'+20+'1kobe999';

c149276abc825e7b9d0fb3d6572c6e50.png

成功查到数据

更通俗的验证

  • select * from member where username='kobe' and 0='';
  • select * from member where username='kobe' and ''+''=0;
  • select * from member where username='kobe' and '123'=0;

47dca0900dbc85c319c04323cb12699a.png

再插入两个数据(321abc123、321a123),查查321,发现直接查到了3条数据,这下知道为什么大部分注册要求账号密码不能以数字开头了

字符串与字符串之间的运算也会先转为数值,再进行运算

  • select * from member where username='321';
  • select * from member where username='320' + '1';
  • select * from member where username='kobe' and '123aaa' = 123;
  • select * from member where username='123aaa' = '123';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值