如何从MySQL JSON类型列提取完整JSON对象而非编码字符串?
MySQL JSON列提取整列返回编码字符串的处理问题
表结构与数据示例
我有一个名为user的MySQL表,用于存储用户信息,其中包含JSON类型的charts列,用来存储用户生成的图表数据。每个图表以唯一ID作为键,对应的值是单个图表的JSON对象,示例如下:
{ "18806681bef56a0f99a": { "name":"Chart 1", "type":"bar" ... }, "18806681bef56a0f99b": { "name":"Chart 2", "type":"line" ... } }
现有操作逻辑
保存新图表的存储过程
我使用以下逻辑保存新图表,对应的完整存储过程代码如下:
DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `save_chart`(IN `uid` INT(11), IN `cid` VARCHAR(64), IN `config` JSON) MODIFIES SQL DATA SQL SECURITY INVOKER COMMENT 'Save a single chart for the specified user' UPDATE user SET charts = JSON_SET(charts, concat('$."', cid, '"'), config) WHERE id = uid$$ DELIMITER ;
其中cid是图表ID,uid是用户ID,config作为JSON类型参数传入,保存时直接存储对象而非编码字符串;传入的config是字符串格式,提取单个图表时无需使用JSON_UNQUOTE。
提取单个图表
提取单个图表时使用以下SQL:
select JSON_EXTRACT(charts, concat('$."', cid, '"')) from user where id = uid
返回的是JSON对象,无需额外解码即可使用。
提取完整charts列的问题
但当需要提取整个charts列(展示用户所有图表)时,使用select charts from user where id = uid或select JSON_EXTRACT(charts, '$') from user where id = uid,得到的都是编码后的字符串,而非直接可用的对象。
我用PHP处理时,需要先解码主对象,再逐个解码每个图表值,代码如下:
$charts = json_decode($mysql_result, true); foreach($charts as $id => $chart) { $decoded_chart = json_decode($chart); echo getTableRow($id, $decoded_chart); }
这种方式可行但繁琐低效,想知道MySQL 8.0是否有内置函数可以直接提取整列为对象/数组?
关于默认值的疑问
由于JSON类型列无法设置默认值,创建新用户时我将charts列的值设为{}(字符串),这是否会导致后续查询返回的始终是字符串?是否应该设为new stdClass()?这样操作合法吗?
内容的提问来源于stack exchange,提问作者ian
相关产品推荐
相关产品推荐

