MySQL“Row 30153被GROUP_CONCAT()删除”错误

时间:2011-08-26 18:00:41

标签: mysql

我有一个下面列出的功能。当我在LIMIT设置为0,60时调用它,如下所示,它工作正常。但是,每当我将LIMIT增加到70或更高,甚至删除LIMIT时,我在调用函数时出现错误:“行30153被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 ;

2 个答案:

答案 0 :(得分:77)

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

答案 1 :(得分:10)

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

SET global group_concat_max_len=15000;
OR
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.尽管返回值的有效最大长度受到值的约束,但该值可以设置得更高。 max_allowed_pa​​cket的。在运行时更改group_concat_max_len值的语法如下,其中val是无符号整数:

     

SET [GLOBAL | SESSION] group_concat_max_len = val;

     

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

大概没有指定一个可选的替代方案(GLOBALSESSION)将默认为第一个列出的替代方案(在这种情况下为GLOBAL),尽管我无法在文档。

About syntax used in the MySQL docs:

  

当语法元素由许多替代项组成时,替代项由竖线(“|”)分隔。

     

如果选择中的一个成员可能,则替代方案会列在方括号内(“[”和“]”):

     

如果选择中的一个成员必须,则替代品会列在大括号内(“{”和“}”)