Я пытаюсь вывести некоторую реляционную информацию в строку JSON через MySQL. Однако метод, который я использую, обрезает возвращаемое значение.

Обеспечивает ли MySQL некоторую максимальную длину строки для запросов с использованием 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
1
Ryan Dorn 1 Сен 2020 в 21:06

2 ответа

Лучший ответ

Используйте 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 (значение по умолчанию 1024 в MySQL или MariaDB до 10.2, но вы можете установить, например, SET @@group_concat_max_len=1000000;); это ограничение не распространяется на JSON_ARRAYAGG.

JSON_ARRAYAGG требует MySQL 5.7.22+ или MariaDB 10.5+

2
ysth 3 Сен 2020 в 19:14

На всякий случай это кому-то поможет; в этом конкретном случае я использовал CodeIgniter 3. Моя локальная версия работала на более поздней версии MySQL, и, хотя это было отличное решение, JSON_ARRAYAGG не работал в других средах, работающих ниже MySQL 5.7

Использование следующего в моем построителе запросов CI SQL помогло мне использовать 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);
0
Ryan Dorn 3 Сен 2020 в 19:41