Mysql 为什么选择。。。其中,如果值为0,则id=a返回一个结果

Mysql 为什么选择。。。其中,如果值为0,则id=a返回一个结果,mysql,sql,select,Mysql,Sql,Select,查询: 1.返回abc:从id=0的表中选择值 2.返回def:从id=1的表中选择值 3.不返回任何内容:从id=2的表中选择值 4.返回abc:从id为'a'的表中选择值 问题:为什么查询4返回abc?它应该不会给出正确的结果吗?MySQL在数字上下文中将字符串静默地转换为数字 它通过转换前导数字字符(如数字、减号和小数点)来实现 如果没有数字,则停止。因此: Table preview Note: 'id' is an integer column (offcourse) +-----

查询: 1.返回abc:从id=0的表中选择值 2.返回def:从id=1的表中选择值 3.不返回任何内容:从id=2的表中选择值 4.返回abc:从id为'a'的表中选择值


问题:为什么查询4返回abc?它应该不会给出正确的结果吗?

MySQL在数字上下文中将字符串静默地转换为数字

它通过转换前导数字字符(如数字、减号和小数点)来实现

如果没有数字,则停止。因此:

Table preview 
Note: 'id' is an integer column (offcourse)

+-------------+
| id | value  |
+----+--------+
| 0  | abc    |
| 1  | def    |
+-------------+
被解释为:

where id = 'a'

寓意:永远不要在数字常量或应该是数字的常量周围使用单引号。

我可以阻止转换SQL中的字符,使其不会返回结果吗?例如:其中id=NOCONVERT'a'或类似的内容that@RamonBakker-…一开始甚至不提供非整数输入。首先,如果您使用的是参数化查询,那么如果您尝试,您的驱动程序应该会抛出错误。为什么要提供可能无效的输入?我正在创建一个针对SQL注入的函数。我知道它99,99%安全,除了整数列p.s.上的字符串值。它对十六进制注入和所有其他已知p.s.也是安全的。我不想在这种情况下使用参数化查询。我知道它们是安全的,但无论如何,如果创建针对注入攻击的函数,为什么不希望使用参数化查询?人们建议最多使用事先准备好的陈述。这并没有错,但当每个进程只执行一次查询时,会有轻微的性能损失。
where id = 0