MySQL JSON_OBJECT + CONCAT & GROUP_CONCAT 作为别名 & 截断/最大长度
MySQL JSON_OBJECT + CONCAT & GROUP_CONCAT as alias & truncating / Max Length
我正在尝试通过 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+
以防万一这对其他人有帮助;对于我正在使用的这种特殊情况
CodeIgniter 3。我的本地版本是 运行 在更高的 MySQL 版本上,虽然这是一个很好的解决方案,但 JSON_ARRAYAGG
在 [=18= 以下的其他环境 运行 中不起作用] 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);
我正在尝试通过 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+
以防万一这对其他人有帮助;对于我正在使用的这种特殊情况
CodeIgniter 3。我的本地版本是 运行 在更高的 MySQL 版本上,虽然这是一个很好的解决方案,但 JSON_ARRAYAGG
在 [=18= 以下的其他环境 运行 中不起作用] 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);