Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止mysql在where子句中将字符串强制转换为int_Mysql_Sql_Casting - Fatal编程技术网

防止mysql在where子句中将字符串强制转换为int

防止mysql在where子句中将字符串强制转换为int,mysql,sql,casting,Mysql,Sql,Casting,我试图阻止mysql在where子句中将字符串转换为int 以下查询返回订单的正确行 从订单id为'985225'的订单中选择交货名称 下面的查询在将字符串转换为int时也返回同一行,但我想阻止它返回该行(即,不转换给定给int的字符串,实际上是说,这不能准确转换为int,所以不要) 从订单中选择交货名称,其中订单id='985225a' 我希望这是有意义的,任何帮助都将不胜感激 您应该能够完全避免这种情况,但是如果您想要一种解决方法,您可以在字符串前面添加一个字符,例如: SELECT del

我试图阻止mysql在where子句中将字符串转换为int

以下查询返回订单的正确行

从订单id为'985225'的订单中选择交货名称

下面的查询在将字符串转换为int时也返回同一行,但我想阻止它返回该行(即,不转换给定给int的字符串,实际上是说,这不能准确转换为int,所以不要)

从订单中选择交货名称,其中订单id='985225a'


我希望这是有意义的,任何帮助都将不胜感激

您应该能够完全避免这种情况,但是如果您想要一种解决方法,您可以在字符串前面添加一个字符,例如:

SELECT delivery_name 
FROM orders 
WHERE CONCAT('a',orders_id) = CONCAT('a','985225a')

我建议您将该变量作为应用程序中的整数进行pas

SELECT delivery_name FROM orders WHERE orders_id = '985225'
如果orders_id为整数,则意味着orders引擎中的每一行都将隐式转换为字符串以计算orders_id='985225' 它不仅速度慢,而且会使orders\u id中的任何索引都变得无用

如果您所能做的就是编辑SQL,那么我建议您强制转换变量

订单号=CAST('985225'为整数)


最后一个提示是,在应用层,验证输入和防止用户输入无效的整数更容易。

步骤1-从sql字符串中删除单引号。换言之,改变这一点:

WHERE orders_id = '985225'
为此:

WHERE orders_id = 985225
第2步-根据@Marc B的评论,确保您实际上有一个整数


步骤3-使用查询参数。据我所知,MySql接受它们。

在你让它靠近查询字符串之前,你应该检查客户端代码中的非int内容。我认为你无法说服MySql做你想做的事情(以及大多数其他DBMS的行为)被否决,即使这样做可行,orders_id上的任何索引也将变得毫无用处,强制对orders表进行全表扫描。@jean Upvoted,这里没有人谈论索引,只是为了得到OP想要的东西。来吧。@jean是的,这种情况应该避免,但我已经提供了一个有效的解决方法。我完全同意这种情况应该避免,在客户端代码中,这是通常的做法,但在这种情况下,mysql端将是理想的。这个答案会使任何索引都变得无用,但这实际上不是问题的一部分(在这种情况下也不是问题),因为表一次只能有少量行。答案被接受,谢谢@GoatCop因为我接受了答案,所以我试图删除否决票,但除非答案被编辑,否则无法删除。谢谢答案,但我相信mysql实际上会将我给出的字符串“985225”转换为int 985225,而不是将表中的每个int转换为字符串。因此,是的,通过传递int而不是字符串可以提高性能,但在大多数情况下可以忽略不计,并且索引仍然只是一个有用的函数,就好像传递了int一样。从orders_id中删除引号即使在有索引的大表中,速度差异也可以忽略不计(并且实际上会阻止发送'985225a'值)。在一种情况下,我不想确保客户端代码中确实有int…这是问题的关键。我不确定查询参数是什么,解释一下可能会有所帮助。