Проблемы с GROUP_CONCAT и Longtext в MySQL
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 с длинным текстом очень хорошо или есть
что-то еще я делаю неправильно?
Ответы
Ответ 1
В соответствии с руководство 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>
Ответ 2
Название этой публикации - "Проблема с CONCAT и Longtext", которая вводит в заблуждение, так как тот, кто задал вопрос, действительно хотел узнать о 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/empty.
Итак, вот как должен выглядеть запрос, чтобы облегчить очевидные ограничения 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
Ответ 3
GROUP_CONCAT в mysql docs:
Результат усечен до максимума длина, которая Системная переменная group_concat_max_len, который имеет значение по умолчанию 1024. значение может быть установлено выше, хотя эффективная максимальная длина возврата значение ограничено значением max_allowed_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
Надеюсь, что это поможет.