Проблемы с GROUP_CONCAT и длинным текстом в 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
)

Как видите, он берет все страницы статьи (каждая из которых хранится в виде длинного текста в отдельных строках) и объединяет их GROUP_CONCAT в одну строку длинного текста. Проблема в том, что результаты содержат только определенное количество символов, а затем они полностью усекаются, теряя около 90% содержимого. CONCAT не очень хорошо обрабатывает длинный текст или я что-то еще делаю неправильно?


person Iwasakabukiman    schedule 09.02.2009    source источник


Ответы (3)


Согласно руководству по 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>
person Community    schedule 09.02.2009
comment
Спасибо. Я ценю помощь! - person Iwasakabukiman; 09.02.2009
comment
Обратите внимание, что из-за некоторой ошибки MySQL (wontfix) max_allowed_packet не означает только максимально допустимый пакет. См. bugs.mysql.com/bug.php?id=20458#c113677 и dba.stackexchange.com/a/2383/9405 - person Pacerier; 01.04.2015

Заголовок этого поста — «Проблемы с 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

person N D    schedule 12.04.2014

GROUP_CONCAT в документации mysql:

Результат усекается до максимальной длины, заданной системной переменной 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

Надеюсь это поможет.

person Jack    schedule 09.02.2009