麻烦GROUP_CONCAT和Longtext在MySQL
-
22-08-2019 - |
题
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他们进入一个 单longtext行。问题是结果只有这么多 字然后它得到完全被截断,失去了约90%的 内容。不CONCAT不处理longtext非常好或者是有 别的事情我做错了什么?
解决方案
按照 MySQL手册,GROUP_CONCAT
的最大长度是由group_concat_max_len
系统变量,缺省值为1024。
此值可被增加,通过使用下面的命令:
SET group_concat_max_len = <int>
然而,应该注意的是,group_concat_max_len
的值本身由另一个系统变量,max_allowed_packet
值,默认为1,048,576的限制。
此值可以使用相同的语法来增加到最大的1073741824,:
SET max_allowed_packet = <int>
其他提示
这个帖子的标题是“麻烦与CONCAT和长文本”,这是一种误导,因为他谁提出了这个问题真的想知道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为空/空。 因此,这里的查询将不得不寻求缓解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
GROUP_CONCAT在mysql文档:
结果是截到的最大 长,由 group_concat_max_len系统变量, 其中有一个默认值1024。的 值可能设置更高的,虽然 有效的长度最大的回报 值而受到限制的价值 导致.语法 改变价值 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
希望这会有所帮助。