【问题标题】:MySQL "Row 30153 was cut by GROUP_CONCAT()" errorMySQL“第 30153 行被 GROUP_CONCAT() 剪切”错误
【发布时间】:2011-08-26 18:00:41
【问题描述】:

我有一个下面列出的功能。当我将 LIMIT 设置为 0,60 时调用它,如下所示,它工作正常。但是,每当我将该 LIMIT 增加到 70 或更高,甚至删除 LIMIT 时,MySQL 都会在我调用函数时出错,并出现错误:“Row 30153 was cut by GROUP_CONCAT()”。

我尝试将 varchar 值增加到 10 000 但这没有帮助。 据我从错误中了解到,它们在变量中似乎没有足够的空间容纳内容。但是就像我提到的那样,我尝试增加尺寸,但没有帮助。有任何想法吗??谢谢

DELIMITER $$

DROP FUNCTION IF EXISTS `fnAlbumGetPhotoList` $$
CREATE DEFINER=`root`@`%` FUNCTION `fnAlbumGetPhotoList`(_albumId int) RETURNS varchar(2048) CHARSET utf8
BEGIN

  DECLARE _outPhotoList VARCHAR(2048);

    SET _outPhotoList = (

                          SELECT (CAST(GROUP_CONCAT(CONCAT(photoId, '|', photoFileName) separator '~') AS CHAR(10000) CHARACTER SET utf8)) AS recentPhotoList
                              FROM
                              (
                                SELECT photoId, photoFileName
                                FROM photo
                                WHERE photoAlbumId = _albumId
                                AND photoIsDisabled = 0
                                AND photoIsActive = 1
                                ORDER BY photoId DESC
                                LIMIT 0,60
                              ) as subQuery
                            );


  RETURN _outPhotoList;

END $$

DELIMITER ;

【问题讨论】:

  • 我在 Liquibase 执行存储过程后才遇到这个问题,我必须修改它。更耐人寻味的是,在 Navicat 内部对程序进行 dummy change 并执行后,错误消失了。

标签: mysql


【解决方案1】:

1) 增加结果查询的字符数限制

SET global group_concat_max_len=15000;

SET session group_concat_max_len=15000;

如果您希望设置成为新的全局默认值(粘性),请使用前者。
如果您只想在当前会话期间使用此设置,请使用后者。
(另请注意,有些人在使用global 选项时报告了问题。在这种情况下,请尝试将其关闭,如SET group_concat_max_len=15000;。)

2) 然后将DISTINCT 作为第一个参数添加到GROUP_CONCAT() 以从结果查询中删除重复项。 GROUP_CONCAT(DISTINCT ..)

您的查询看起来更像这样:

SET session group_concat_max_len=15000;
...
    ... GROUP_CONCAT(DISTINCT CONCAT(photoId, ...)
...
)      

Function Group Concat, from MySQL docs:

SET [GLOBAL | SESSION] group_concat_max_len = val;

在 MySQL 中,您可以获取表达式组合的连接值。要消除重复值,请使用 DISTINCT 子句。

...

结果被截断为 group_concat_max_len 系统变量给出的最大长度,其默认值为 1024。该值可以设置得更高,尽管返回值的有效最大长度受值的限制最大允许数据包。运行时改变 group_concat_max_len 值的语法如下,其中 val 为无符号整数:

设置 [全局 |会话] group_concat_max_len = val;

返回值是非二进制还是二进制字符串,取决于参数是非二进制还是二进制字符串。结果类型为 TEXT 或 BLOB,除非 group_concat_max_len 小于或等于 512,在这种情况下,结果类型为 VARCHAR 或 VARBINARY。

可能不指定可选的替代方案(GLOBALSESSION)将默认为第一个列出的替代方案(在这种情况下为GLOBAL),尽管我在文档中找不到明确说明。

About syntax used in the MySQL docs:

当一个语法元素包含多个备选时,备选用竖线 (“|”) 分隔。

When one member from a set of choices ma​​y be chosen, the alternatives are listed within square brackets (“[” and “]”):

必须选择一组选项中的一个成员时,选项会列在大括号内(“{”和“}”)

【讨论】:

  • 对不起,@morha13,我最初误解了您的编辑并拒绝了它。我现在明白你试图表明什么了。我应该选择"Improve Edit" 来接受,但重新措辞和重新格式化您的编辑,使其更清晰,更好地匹配帖子的格式和文本。你是对的,我在第一个命令中省略了global,并且可以更清楚地说明这两个命令之间的区别以及何时/为什么应该选择另一个命令。感谢您指出改进。
  • 根据docs,方括号中列出的备选方案是可选的。所以,..[ global | session ]..globalsession 量词是可选的。但是,如果两者都没有指定,我找不到明确的文档来说明行为是什么。很可能,第一个列出的选项将是默认选项 - 这就是我的原始答案版本所暗示的:不指定 session 等同于指定 global。也就是说,为了清楚起见,我更新为添加global。我欢迎 MySQL 专家参与。
  • Session 更具体,这是默认使用的。 dev.mysql.com/doc/refman/5.7/en/… « 要将值分配给会话系统变量,请在变量名称前添加 SESSION 或 LOCAL 关键字、@@SESSION.、@@LOCAL. 或 @@ 限定符, 或不添加关键字或完全没有修饰符 »
  • 关于 GLOBAL 和 SESSION 的另一件事:GLOBAL 仅用于新会话。因此,如果你想为这个会话设置一个变量,也为 nxt 会话设置一个变量,你必须使用 GLOBAL 进行两次调用,然后使用 SESSION(或没有 GLOBAL)
【解决方案2】:

您可以将group_concat_max_len 变量设置为更大的值。或者也许使用GROUP_CONCAT(DISTINCT ...) 来缩短结果。

【讨论】:

  • 谢谢 - 结果已经很明显了,所以我尝试在我的 proc 中添加这个:SET GLOBAL group_concat_max_len=15000; 但这并没有什么不同??那是正确的用法吗?
  • 查看手册(点击“group_concat_max_len”,这是一个链接)以获得完整的描述。 15 000 看起来有点小,试试你平台的最大值 :) 另请阅读 GROUP_CONCAT 主题,它也有一些关于行为的信息和关于 max_allowed_pa​​cket 变量的备注。
  • 啊,谢谢 Ain,char(10000) 演员是问题所在。一旦删除,查询工作正常,即使在 2000 len。我使用了另一个示例中的代码,因此假设需要 CAST 到 char(10000)。猜猜不是:)谢谢
  • 如果其他人有这个问题,我尝试SET GLOBAL group_concat_max_len=15000; 没有运气,但SET group_concat_max_len=15000; 确实有效。
  • ... 或SET @@group_concat_max_len = 15000,因为他们使用它here,@VenerableAgents?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多