有人知道为什么这个查询会返回不应该返回的结果吗?查询中的代码有一个额外的x,但是数据库中的代码没有。
SELECT * FROM `otp` WHERE `code`= '1623x' AND `userid`='4' AND `status`='1'

提前谢谢..。
莫格斯
发布于 2020-09-14 22:33:03
WHERE `code`= '1623x' 我强烈怀疑code是一个数字列。
如果是这样的话:要计算条件,MySQL必须将一个数字与一个字符串进行比较。它所做的是将字符串强制为一个数字,然后执行数字比较。结果表明,字符串'1623x'转换为数字1623,因此条件已满。
例如,如果字符串是'x1623',它将被转换为0 (因为它不以数字开头),并且您不会收到任何结果。
简而言之:不要比较不同数据类型的值。每个数据库都有自己的理解,在这种情况下应该发生什么,这可能,也可能不会让您感觉到直觉。
发布于 2020-09-14 22:34:18
您所看到的是MySQL特殊的转换规则所致。当您尝试将字符串文本'1623x'与整数1623进行比较时,MySQL必须做一些事情来首先将LHS和RHS转换成相同的类型。唯一的方法是将'1623x'转换为整数。转换规则是这样的,如果字符串以整数开头,那么MySQL将保留尽可能多的可用数字。在这种情况下,'1623x'变成整数1623,因此LHS和RHS变为真。
为了清楚起见,下面是正在计算以生成意外记录的查询:
SELECT *
FROM otp
WHERE 1623 = 1623 AND userid = 4 AND status = 1;发布于 2020-09-14 22:48:27
MySQL使用右操作数的类型来转换左操作数。如果您有一个整数类型的列code,并且您说是code = '123abc',那么它就等同于code = 123 (带有警告)。如果您希望防止这种情况(以及code = '00123'或code = '123.0')查找123,请添加一个附加where条件来进行字符串比较:
and code='123abc' and concat(code)='123abc'(或使用cast而不是concat)。我建议进行额外的比较,而不是仅仅替换现有的比较,这样代码仍然可以用于索引查找。
https://stackoverflow.com/questions/63892583
复制相似问题