如何将对象存入MySQL JSON字段?更新JSON数组转字符串问题求助
刚好对MySQL JSON操作比较熟,来帮你解决这两个问题:
1. 如何将对象存储到MySQL的JSON数据类型字段中?
分两种场景来说,操作起来都很直观:
插入新记录时
如果是新增数据,直接在INSERT语句里传入标准的JSON字符串就行(前提是字段已经设为JSON类型):
INSERT INTO jsontest (content) VALUES ('{"a": "testA", "b": [{"b1": "testB1"}]}');
要是你需要动态生成JSON对象,用MySQL自带的JSON_OBJECT()和JSON_ARRAY()函数会更灵活,比如:
INSERT INTO jsontest (content) VALUES ( JSON_OBJECT( 'a', 'testA', 'b', JSON_ARRAY(JSON_OBJECT('b1', 'testB1')) ) );
更新已有记录时
如果要替换整个JSON字段的内容,直接赋值新的JSON字符串或用函数构造的对象就行:
UPDATE jsontest SET content = '{"a": "newVal", "b": []}' WHERE id = 1;
要是只更新对象里的某个属性,用JSON_SET()函数精准修改:
UPDATE jsontest SET content = JSON_SET(content, '$.a', 'updatedTestA') WHERE id = 1;
2. 修复JSON_SET把数组转成字符串的问题
你遇到的核心问题是:你传入的数组是普通字符串,MySQL默认会把它当成字符串存储,而不是JSON数组。另外你的路径写错了——原JSON里的b是顶级属性,路径应该是$.b,不是$[0].b($[0]是用来定位数组元素的,你的content是对象不是数组)。
给你两种可行的解决方案:
方案一:用JSON函数构造数组
直接用JSON_ARRAY()和JSON_OBJECT()生成原生JSON结构,MySQL会自动识别为JSON类型:
UPDATE jsontest SET content = JSON_SET(content, '$.b', JSON_ARRAY( JSON_OBJECT('b4', 'testB4'), JSON_OBJECT('b5', 'testB5'), JSON_OBJECT('b6', 'testB6') )) WHERE id = '1';
方案二:把字符串转为JSON类型
如果你习惯写字符串形式的JSON,用CAST()把字符串强制转为JSON类型即可:
UPDATE jsontest SET content = JSON_SET(content, '$.b', CAST('[{"b4": "testB4"}, {"b5": "testB5"}, {"b6": "testB6"}]' AS JSON)) WHERE id = '1';
执行任意一种方案后,你再查询content字段,b就会是JSON数组类型,而不是字符串了。
内容的提问来源于stack exchange,提问作者Yeah oh
相关产品推荐
相关产品推荐

