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);