向MySQL插入JSON触发‘列数与值数不匹配’错误排查
问题原因及解决思路
可能的原因
- JSON对象未序列化为字符串:MySQL的JSON列要求传入JSON格式的字符串,但你直接传递了JS对象。部分数据库驱动会把JS对象拆解成多个参数(比如把对象的属性视为独立值),导致参数总数和SQL占位符数量(3个)不匹配,触发列数错误。而手动插入时你用的是JSON字符串,所以能正常执行。
- 请求体解析异常:如果使用了body解析中间件(如
body-parser),配置不当可能导致req.options被拆解为可迭代的结构(比如数组),使得参数数组变成[req.name, req.location, choice1, choice2, ...],参数数量远超占位符数量。 - 数据库驱动的参数处理逻辑:部分驱动对非基础类型(如JS对象)的参数处理有特殊逻辑,不会自动将其转为JSON字符串,反而错误地拆分参数。
解决办法
- 强制将
req.options序列化为JSON字符串后传入:db.connection('INSERT into Surveys (name, location, options) VALUES (?,?,?)', [req.name, req.location, JSON.stringify(req.options)], ...) - 打印参数数组的长度和内容,确认是否为3个元素:
console.log([req.name, req.location, req.options].length); console.log([req.name, req.location, req.options]); - 检查body解析中间件的配置,确保
req.options是完整的单个对象,未被意外拆解。
内容的提问来源于stack exchange,提问作者rexorsist
相关产品推荐
相关产品推荐

