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