首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL选择查询假设1623x=1623为真

问MySQL选择查询假设1623x=1623为真
EN

Stack Overflow用户
提问于 2020-09-14 22:29:07
回答 3查看 29关注 0票数 2

有人知道为什么这个查询会返回不应该返回的结果吗?查询中的代码有一个额外的x,但是数据库中的代码没有。

代码语言:javascript
复制
SELECT * FROM `otp` WHERE `code`= '1623x' AND `userid`='4' AND `status`='1'

​

​

提前谢谢..。

莫格斯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-14 22:33:03

代码语言:javascript
复制
WHERE `code`= '1623x' 

我强烈怀疑code是一个数字列。

如果是这样的话:要计算条件,MySQL必须将一个数字与一个字符串进行比较。它所做的是将字符串强制为一个数字,然后执行数字比较。结果表明,字符串'1623x'转换为数字1623,因此条件已满。

例如,如果字符串是'x1623',它将被转换为0 (因为它不以数字开头),并且您不会收到任何结果。

简而言之:不要比较不同数据类型的值。每个数据库都有自己的理解,在这种情况下应该发生什么,这可能,也可能不会让您感觉到直觉。

票数 2
EN

Stack Overflow用户

发布于 2020-09-14 22:34:18

您所看到的是MySQL特殊的转换规则所致。当您尝试将字符串文本'1623x'与整数1623进行比较时,MySQL必须做一些事情来首先将LHS和RHS转换成相同的类型。唯一的方法是将'1623x'转换为整数。转换规则是这样的,如果字符串以整数开头,那么MySQL将保留尽可能多的可用数字。在这种情况下,'1623x'变成整数1623,因此LHS和RHS变为真。

为了清楚起见,下面是正在计算以生成意外记录的查询:

代码语言:javascript
复制
SELECT *
FROM otp
WHERE 1623 = 1623 AND userid = 4 AND status = 1;
票数 2
EN

Stack Overflow用户

发布于 2020-09-14 22:48:27

MySQL使用右操作数的类型来转换左操作数。如果您有一个整数类型的列code,并且您说是code = '123abc',那么它就等同于code = 123 (带有警告)。如果您希望防止这种情况(以及code = '00123'或code = '123.0')查找123,请添加一个附加where条件来进行字符串比较:

代码语言:javascript
复制
and code='123abc' and concat(code)='123abc'

(或使用cast而不是concat)。我建议进行额外的比较,而不是仅仅替换现有的比较,这样代码仍然可以用于索引查找。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63892583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档