Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trouble with GROUP_CONCAT and Longtext in MySQL

The 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
)

As you can see it takes all of an article's pages (which are each stored as longtext in separate rows) and GROUP_CONCATs them into a single longtext row. The problem is the results are only so many characters and then it gets completely truncated, losing about 90% of the contents. Does CONCAT not handle longtext very well or is there something else I am doing wrong?

like image 518
Iwasakabukiman Avatar asked Nov 29 '22 20:11

Iwasakabukiman


2 Answers

According to the MySQL manual, the maximum length of GROUP_CONCAT is defined by the group_concat_max_len system variable, which defaults to 1024.

This value can be increased, by using the following command:

SET group_concat_max_len = <int>

It should be noted, however, that the value of group_concat_max_len is itself limited by the value of another system variable, max_allowed_packet, which defaults to 1,048,576.

This value can be increased to a maximum of 1,073,741,824, using the same syntax:

SET max_allowed_packet = <int>
like image 60
2 revs, 2 users 93% Avatar answered Dec 06 '22 16:12

2 revs, 2 users 93%


The title of this post is "Trouble with CONCAT and Longtext" which is misleading since he who posed the question really wanted to know about GROUP_CONCAT. I found this post in Google because I was dealing with a limitation with CONCAT in MySQL. For those of you who find this post and are looking for how to increase the max length allowed for CONCAT here is how to do it:

The problem is adjusting group_concat_max_len won't work for CONCAT it only works for GROUP_CONCAT which means that if you are running into this limitation with CONCAT you will have to rework your query to use GROUP_CONCAT.

So say you are using CONCAT in the following way:

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';

But the data you are trying to concatenate on the end of some_field's contents is getting truncated or just plane setting the field some_field to null/empty. So here is the way the query will have to look to alleviate the clear limitations of 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'

For more in depth information check out the article where I found this answer at the link bellow. Source: http://boulderapps.co/mysql-concat-limitation

like image 28
N D Avatar answered Dec 06 '22 16:12

N D