You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用mysql2执行UPDATE语句时JSON拼接致SQL语法错误

解决Node.js+mysql2更新JSON数据时的SQL语法错误

你的问题核心出在直接拼接JSON字符串到SQL语句的写法上,同时还有几个细节没处理到位,我来帮你拆解和解决:

错误根源分析

你当前拼接出来的SQL语句实际是这样的:

UPDATE `users` SET `furniture` = concat(furniture,{"1050":1})WHERE `user` = ?

这里有两个关键问题:

  1. JSON字符串{"1050":1}没有被单引号包裹,SQL解析器会把{当成非法语法,这就是报错指向"1050":附近的直接原因。
  2. WHERE关键字前面没有空格,导致它和前面的JSON内容连在一起,进一步触发语法解析错误。

更重要的是,直接拼接字符串到SQL里还会带来SQL注入风险,这是生产环境绝对要避免的写法。

正确解决方案:使用参数化查询

mysql2原生支持参数化查询,它会自动帮你处理字符串的引号转义和语法适配,同时彻底杜绝注入风险。

方案1:字符串拼接JSON(适合furniture是字符串类型字段)

如果你的furniture字段是存储JSON格式的字符串,用参数化的方式传入JSON序列化后的内容:

// 用?作为占位符定义SQL模板
const sql = 'UPDATE `users` SET `furniture` = concat(`furniture`, ?) WHERE `user` = ?';

// 将JSON字符串和目标用户ID作为参数传入查询
connection.query(sql, [JSON.stringify(self.furniture), targetUserId], (err, results) => {
  if (err) {
    console.error('更新失败:', err);
    return;
  }
  console.log('更新成功:', results);
});

方案2:使用MariaDB的JSON函数(适合furniture是JSON类型字段)

如果你的MariaDB版本支持JSON类型(10.2及以上),更推荐用JSON专用函数来更新,比如JSON_MERGE_PATCH来合并JSON对象,避免字符串拼接可能导致的JSON格式错误:

const sql = 'UPDATE `users` SET `furniture` = JSON_MERGE_PATCH(`furniture`, ?) WHERE `user` = ?';

connection.query(sql, [JSON.stringify(self.furniture), targetUserId], (err, results) => {
  // 处理逻辑同上
});

这个方法会把新的JSON键值对合并到原有JSON对象里,比字符串拼接更符合JSON字段的使用规范。

额外注意点

  • 可以先打印self.furniture确认它确实是你期望的对象:console.log(self.furniture),避免序列化前数据就有问题。
  • 如果furniture字段可能为空,建议用IFNULL处理空值,避免concat得到null+JSON的异常结果:
    UPDATE `users` SET `furniture` = concat(IFNULL(`furniture`, '{}'), ?) WHERE `user` = ?
    

内容的提问来源于stack exchange,提问作者Dev321

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:29:11