如何解决MySQL JSON_OBJECT + CONCAT和GROUP_CONCAT作为别名和截断/最大长度
我正在尝试通过MySQL将一些关系信息提取到JSON字符串中。但是,我使用的方法似乎截断了返回的值。
MyQSL是否对使用CONCAT
/ GROUP_CONCAT
/ JSON_OBJECT
的查询强制某种最大字符串长度?我可以覆盖吗?
(SELECT
CONCAT(
'[',GROUP_CONCAT(
JSON_OBJECT(
'my_key_1',my_table.my_val_1,'my_key_2',my_table.my_val_2,'my_key_3',my_table.my_val_3,'my_key_4',my_table.my_val_4,## [etc,etc ...]
)
),']'
)
FROM my_table
) AS my_alias
解决方法
使用JSON_ARRAYAGG代替GROUP_CONCAT:
SELECT
JSON_ARRAYAGG(
JSON_OBJECT(
'my_key_1',my_table.my_val_1,'my_key_2',my_table.my_val_2,'my_key_3',my_table.my_val_3,'my_key_4',my_table.my_val_4,## [etc,etc ...]
)
)
FROM my_table
GROUP_CONCAT在@@ group_concat_max_len处被截断(在MySQL或10.2之前的MariaDB上默认为1024,但是您可以使用SET @@group_concat_max_len=1000000;
进行设置);此限制不适用于JSON_ARRAYAGG。
JSON_ARRAYAGG需要MySQL 5.7.22+或MariaDB 10.5 +
,以防万一这对别人有帮助;对于这种特殊情况,我正在使用
CodeIgniter3。我的本地版本在更高的MySQL版本上运行,尽管这是一个不错的解决方案,但是JSON_ARRAYAGG
在运行低于MySQL 5.7的其他环境中无法使用
在我的CI SQL query builder中使用以下命令似乎可以解决问题,以便我将GROUP_CONCAT
用于较大的返回字符串:
$this->db->simple_query('SET SESSION group_concat_max_len=15000');
$sql = "(SELECT
GROUP_CONCAT(
'{','\"my_key_1\":',a_table.value_1,','\"my_key_2\":',a_table.value_2,## etc,etc
'}'
)
) AS my_alias
FROM my_table
## WHERE
";
return $this->db->query($sql);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。