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

如何在MySQL中拼接两个JSON数组?Error Code:3156报错解决方案

解决MySQL JSON数组合并的3156错误

你遇到的这个Error Code: 3156问题,本质是对MySQL中JSON类型的||操作符理解偏差了——它根本不是用来拼接JSON数组的!MySQL会把||当成数值运算的逻辑或(部分sql_mode下是字符串拼接,但对JSON列不生效),强行把你的JSON数组转成DOUBLE类型,自然就触发了转换错误。

下面给你两种靠谱的解决方法,根据你的MySQL版本选择:

方法1:用JSON_MERGE_PRESERVE(兼容MySQL 5.7+)

这是最直接的数组合并方式,会把两个JSON数组的元素全部合并到一起,保留所有元素(包括重复值,如果有的话)。执行语句如下:

UPDATE user_roles 
SET roles = JSON_MERGE_PRESERVE(roles, '[5,6]') 
WHERE id = ?1;

执行后你的roles列就会变成[1,2,3,4,5,6],完全符合预期。

方法2:用JSON_ARRAY_APPEND(适合追加单个/多个元素)

如果你的场景是要逐个追加元素,或者想明确指定追加位置,可以用这个函数。要追加整个数组的话,需要把数组拆成单个元素传入:

UPDATE user_roles 
SET roles = JSON_ARRAY_APPEND(roles, '$', 5, 6) 
WHERE id = ?1;

这里的'$'表示在数组的末尾追加元素,执行结果和上面的方法一致。

额外提示:如果需要去重合并

如果你的需求是合并数组同时去掉重复元素,可以结合JSON_TABLE和JSON_ARRAYAGG来实现,比如:

UPDATE user_roles ur
JOIN (
    SELECT id, JSON_ARRAYAGG(DISTINCT val) AS merged_roles
    FROM user_roles, JSON_TABLE(roles, '$[*]' COLUMNS(val INT PATH '$')) jt
    WHERE id = ?1
    UNION ALL
    SELECT ?1 AS id, 5 UNION ALL SELECT ?1 AS id, 6
    GROUP BY id
) t ON ur.id = t.id
SET ur.roles = t.merged_roles;

这个语句会先把原数组展开,加上新元素,去重后再重新聚合为JSON数组,适合需要去重的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:58:16