Проблема с GROUP_CONCAT и длинным текстом в MySQL
-
22-08-2019 - |
Вопрос
SQL...
UPDATE Threads t
SET t.Content = (
SELECT GROUP_CONCAT(a.Content ORDER BY a.PageID SEPARATOR '<!-- pagebreak -->')
FROM MSarticlepages a
WHERE a.ArticleID = t.MSthreadID GROUP BY a.ArticleID
)
Как видите, это принимает все страницы статьи (каждая из которых хранится как Longtext в отдельных строках) и Group_concats их в одну строку длинного текста.Проблема заключается в том, что результаты составляют только так много символов, а затем она полностью усекается, теряя около 90% содержимого.Разве Concat не очень хорошо справляется с Longtext или есть что -то еще, что я делаю не так?
Решение
Согласно Руководство по MySQL, максимальная длина GROUP_CONCAT
определяется group_concat_max_len
системная переменная, значение которой по умолчанию равно 1024.
Это значение можно увеличить с помощью следующей команды:
SET group_concat_max_len = <int>
Однако следует отметить, что стоимость group_concat_max_len
само по себе ограничено значением другой системной переменной, max_allowed_packet
, которое по умолчанию равно 1 048 576.
Это значение можно увеличить максимум до 1 073 741 824, используя тот же синтаксис:
SET max_allowed_packet = <int>
Другие советы
Название этого поста — «Проблема с CONCAT и длинным текстом», что вводит в заблуждение, поскольку тот, кто задал вопрос, действительно хотел знать о GROUP_CONCAT.Я нашел этот пост в Google, потому что имел дело с ограничением CONCAT в MySQL.Для тех из вас, кто нашел этот пост и ищет, как увеличить максимальную длину, разрешенную для CONCAT, вот как это сделать:
Проблема в том, что настройка group_concat_max_len не будет работать для CONCAT, она работает только для GROUP_CONCAT, что означает, что если вы столкнетесь с этим ограничением с CONCAT, вам придется переработать свой запрос для использования GROUP_CONCAT.
Предположим, вы используете CONCAT следующим образом:
UPDATE some_table
SET some_field=CONCAT(some_field,'super long string to append to the end of the data in some_field')
WHERE some_criteria_field = 'match on this string';
Но данные, которые вы пытаетесь объединить в конце содержимого some_field, усекаются или просто задают для поля some_field значение null/пусто.Итак, вот как должен выглядеть запрос, чтобы смягчить явные ограничения CONCAT:
SET @@session.group_concat_max_len = @@global.max_allowed_packet;
UPDATE some_table SET some_table.some_field=(
SELECT GROUP_CONCAT( queue.append_to_end SEPARATOR '') as new_some_field
FROM
(
SELECT append_to_end FROM some_table WHERE some_criteria_field = 'match on this string'
UNION
SELECT 'super long string to append to the end of the data in some_field' as append_to_end
) as queue
) WHERE some_criteria_field = 'match on this string'
Для получения более подробной информации ознакомьтесь со статьей, где я нашел этот ответ, по ссылке ниже.Источник: http://boulderapps.co/mysql-concat-limitation
GROUP_CONCAT в документации MySQL:
Результат усекается до максимальной длины, которая дается системной переменной Group_Concat_max_len, которая имеет значение по умолчанию 1024.Значение может быть установлено выше, хотя эффективная максимальная длина возвращаемого значения ограничена значением max_alloed_packet.Синтаксис для изменения значения Group_concat_max_len во время выполнения следующим образом, где VAL является незнанным целым числом:
SET [GLOBAL | SESSION] group_concat_max_len = val;
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
Надеюсь это поможет.