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或者是否存在 别的我做错了吗?
答案 0 :(得分:13)
根据MySQL manual,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>
答案 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_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
希望这有帮助。