Mysql SQL忽略where条件中的字符串

Mysql SQL忽略where条件中的字符串,mysql,Mysql,为什么如果我在where条件的末尾运行一个乱七八糟的查询,它会错误地返回一个结果。 例如: 我得到的是ID为97的行,但我没有得到任何结果。这里发生的事情是,您将contractorID列(整数或其他数字类型)与字符串文本97sd进行比较。这没有任何意义,因此MySQL根据其强制转换规则,尝试首先将97sd强制转换为整数。考虑以下查询的结果: SELECT CAST('97sd' AS unsigned); 实际上,这只输出了97,即整数。因此,在实践中,这意味着MySQL将忽略字符串文本末尾

为什么如果我在where条件的末尾运行一个乱七八糟的查询,它会错误地返回一个结果。 例如:


我得到的是ID为97的行,但我没有得到任何结果。

这里发生的事情是,您将
contractorID
列(整数或其他数字类型)与字符串文本
97sd
进行比较。这没有任何意义,因此MySQL根据其强制转换规则,尝试首先将
97sd
强制转换为整数。考虑以下查询的结果:

SELECT CAST('97sd' AS unsigned);
实际上,这只输出了
97
,即整数。因此,在实践中,这意味着MySQL将忽略字符串文本末尾以整数开头的“胡言乱语”

但这里的最佳实践是始终将列与正确的文本类型进行比较。因此,为了获得最佳效果,请始终使用以下版本:

SELECT * FROM contractor_table WHERE contractorID = 97;

如果将列类型int或其他数值转换为varchar,则会出现这种情况,因为它不会返回任何输出

,但OP的查询实际上返回了一个输出:-)好的,我觉得这对于MySQL来说是不正确的行为。如何阻止MySQL忽略它?不要将数字列与字符串进行比较。在大多数其他数据库中,您的代码甚至无法编译。这是问题的根本原因。如果你无能为力怎么办?运行查询的代码可能不知道列是字符串还是numberIt,使用最佳实践不是代码的责任,而是由代码的作者决定。MySQL的工作不是首先监督你的代码。如果你接管了一个有100个“错误”操作的查询的项目,那么在代码中添加一个测试来检查正确的变量类型是不切实际的
SELECT * FROM contractor_table WHERE contractorID = 97;