到目前为止,我还没有找到这个问题的答案……也许这里有人可以提供帮助。
我收到以下错误:运行查询时出错...::::错误:ER_TRUNCATED_WRONG_VALUE: chop 不正确的 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) {...});
只要我在 usrs 变量中只有一个数字,这就可以正常工作,但是当我有一个数字列表(在一个看起来像“2,4”的连接字符串中)时,我得到上面的 chop 错误。
有什么想法吗?谢谢!
最终结果:
根据标记为正确的答案,为我的“IN”使用准备好的语句不起作用。我相信如果我传递一个单引号字符串列表来查找基于文本的数据类型,它会工作得很好,但查询将转义的 INT 作为文本字符类型传递。
Anyhoo...我只是验证数组中的所有项目都是数字,如果它们是数字,我将加入数组并将其传递到准备好的查询中。我不相信这会让我暴露在注入(inject)中,但如果我错了,请随时纠正我。这是我的代码:
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
变成了一个值。您将需要找到另一种方法,这可能意味着执行像这样的单独语句:
UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id = ?;
此外,如果您正在动态构建该列表,您应该知道 IN
语句中的长值列表不能很好地扩展。许多数据库服务器也对其大小施加限制(MSSQL 限制为 512 个元素,我不知道 MySQL)。
关于javascript - 在我的 WHERE 上使用 IN chop 不正确的 DOUBLE 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38154017/