在我的WHERE上使用IN来截断不正确的DOUBLE值

到目前为止,我还没有find答案…也许这里有人可以帮助。

我收到以下错误:错误运行查询… ::::错误:ER_TRUNCATED_WRONG_VALUE:截断不正确的DOUBLE值:'2,4'

使用nodejs中的mysql模块运行查询时会发生这种情况。 查询如下:

selectQ = "UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id IN (?);" 

我这样称呼它:

 con.query(selectQ,[hash,lupdator,usrs], function (err, rows) {...}); 

这工作正常,只要我只有一个数字在usrsvariables,但是当我有一个数字列表(在连接的string,看起来像“2,4”)我得到上面的截断错误。

有任何想法吗? 谢谢!

最终结果:

根据正确的答案,使用准备好的声明为我的“IN”没有工作。 我相信,如果我传递一个单引号string的列表来查找基于文本的数据types,但是查询是将转义的INT传递为文本字符types,那么这样做会正常工作。

Anyhoo …我只是validation我的数组内的所有项目是数字,如果他们是我join数组,并将其传递到准备好的查询。 我不相信这让我暴露在注射,但如果我错了,随时纠正我。 这是我的代码:

 for(i = 0; i < usr.length; i++){ if(!IsNumeric(usr[i])){ callback("Password hash failed, server side issue.",null); return; } } var usrs = usr.join(','); selectQ = "UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id IN ("+usrs+");" 

你传递参数的方式不会给你这个:

 UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id IN (2,4); 

它会给你这个:

 UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id IN ((2,4)); 

所以2,4成为一个单一的价值。 你需要find另一种方式,这可能意味着执行这样的单独的语句:

 UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id = ?; 

此外,如果您正在dynamic构build该列表,则应该知道IN语句内的长列表值不能很好地扩展。 许多数据库服务器也限制了它们的大小(MSSQL限制为512个元素,我不知道MySQL)。