MySQL中的GROUP_CONCAT和Longtext有问题

时间:2009-02-09 17:36:43

标签: mysql group-concat truncated longtext

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_CONCAT将它们分成一个 单行文本行。问题是结果只有这么多 字符,然后它被完全截断,失去约90% 内容。 CONCAT不能很好地处理longtext或者是否存在 别的我做错了吗?

3 个答案:

答案 0 :(得分:13)

根据MySQL manualGROUP_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>

答案 1 :(得分:4)

这篇文章的标题是“麻烦与CONCAT和Longtext”这是误导,因为提出这个问题的人真的想知道GROUP_CONCAT。我在谷歌发现了这篇文章,因为我在处理MySQL中的CONCAT限制。对于那些发现这篇文章并且正在寻找如何增加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

答案 2 :(得分:0)

mysql docs上的GROUP_CONCAT:

  

结果被截断到最大值   由...给出的长度   group_concat_max_len系统变量,   它的默认值为1024.   值可以设置得更高,虽然   有效的最大回报长度   值受到的值的约束   max_allowed_pa​​cket的。语法为   改变的价值   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

希望这有帮助。