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

MySQL中JSON_OBJECT变量赋值为何存在不一致问题?

MySQL变量存储JSON对象后在JSON_SET中转义异常的原因与解决方法

这个问题的核心是MySQL用户变量(@开头)的类型限制导致的:

1. 用户变量的类型本质

MySQL的用户变量(@xxx)属于弱类型变量,无法原生存储JSON类型的值。当执行SET @IV_PROP = JSON_OBJECT(...)时,JSON_OBJECT()返回的是原生JSON类型,但用户变量会自动将其序列化为字符串形式存储,而非保留JSON的原生类型信息。

2. 不同操作的类型转换差异

  • INSERT场景正常:将用户变量插入JSON类型列时,MySQL会识别目标列类型,自动将变量中的字符串解析回JSON对象,因此最终存储的是正常JSON值。
  • JSON_SET场景异常:JSON_SET()函数不会自动将字符串参数解析为JSON对象,而是直接把字符串当作JSON的字符串字面量处理。这就导致原本的JSON字符串被转义后,作为完整字符串值存入JSON列,查询结果会呈现带转义符的包裹形式。

而直接调用JSON_OBJECT()传入JSON_SET()时,传入的是原生JSON类型,函数会正确识别处理,因此结果正常。

解决方法

方法一:手动解析字符串为JSON

使用JSON_PARSE()函数将用户变量中的字符串解析回JSON类型后,再传入JSON_SET():

SET @IV_PROP = JSON_OBJECT( "name", "supportsInvalidation", "type", "java.lang.Boolean", "privy", false);
UPDATE json_test SET jdata = JSON_SET(jdata, "$", JSON_PARSE(@IV_PROP));
SELECT * FROM json_test;

方法二:使用带类型的局部变量(MySQL 8.0.19+)

若MySQL版本在8.0.19及以上,可通过DECLARE定义指定JSON类型的局部变量,保留原生JSON类型以避免自动转换:

DELIMITER //
CREATE PROCEDURE update_json_with_var()
BEGIN
  DECLARE iv_prop JSON;
  SET iv_prop = JSON_OBJECT("name", "supportsInvalidation", "type", "java.lang.Boolean", "privy", false);
  UPDATE json_test SET jdata = JSON_SET(jdata, "$", iv_prop);
END //
DELIMITER ;

CALL update_json_with_var();
SELECT * FROM json_test;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:15:44