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

向MySQL行插入数组时出现列数不匹配错误求助

解决MySQL插入JSON字段时的列数不匹配错误

问题原因

你遇到的Column count doesn't match value count at row 1错误,是因为直接将JavaScript数组传入MySQL的JSON字段时,数据库驱动会把数组拆分成多个独立的值,导致VALUES子句中的值数量超过了指定的列数量。比如roles是['admin', 'user']时,驱动会把它解析成两个值,原本5个占位符就对应了6个值,自然报错。

解决办法

方法1:插入前将数组转为JSON字符串

在把roles传入SQL查询前,用JSON.stringify()把数组转换成标准JSON字符串,这样驱动就会把它当作单个值处理:

export async function createUser(firstName, lastName, username, password, roles) {
    // 将数组转为JSON字符串
    const rolesJson = JSON.stringify(roles);
    const [result] = await db.query(`
       INSERT INTO users (firstName, lastName, username, password, roles)
       VALUES (? , ?, ?, ?, ?)
    `, [firstName, lastName, username, password, rolesJson])
    const id = result.insertId;

    return getUser(id);
}

方法2:在SQL中显式转换为JSON类型

可以在SQL语句里用CAST(? AS JSON)强制将传入的字符串转为JSON类型,同样需要先把数组转成字符串:

export async function createUser(firstName, lastName, username, password, roles) {
    const [result] = await db.query(`
       INSERT INTO users (firstName, lastName, username, password, roles)
       VALUES (? , ?, ?, ?, CAST(? AS JSON))
    `, [firstName, lastName, username, password, JSON.stringify(roles)])
    const id = result.insertId;

    return getUser(id);
}

补充:查询时转回JS数组

从数据库查询用户数据时,MySQL会返回JSON格式的字符串,需要用JSON.parse()把它转回JavaScript数组,比如在getUser函数中处理:

async function getUser(id) {
    const [rows] = await db.query('SELECT * FROM users WHERE id = ?', [id]);
    if (rows.length === 0) return null;
    const user = rows[0];
    // 将JSON字符串转回数组
    user.roles = JSON.parse(user.roles);
    return user;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:15:34