下面列出了一个函数。当我在LIMIT设置为0,60时调用它,如下所示,它工作得很好。然而,每当我将LIMIT增加到70或更高,甚至删除LIMIT时,MySQL在调用函数时出现错误:"Row 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 ;
您可以将group_concat_max_len变量设置为更大的值。或者可以使用GROUP_CONCAT(DISTINCT ...)
来缩短结果。
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。虽然返回值的有效最大长度受到max_allowed_packet值的限制,但该值可以设置得更大。在运行时更改group_concat_max_len值的语法如下,其中val是一个无符号整数:
SET [GLOBAL | SESSION] group_concat_max_len = val;
返回值是非二进制字符串还是二进制字符串,具体取决于参数是非二进制字符串还是二进制字符串。结果类型是TEXT或BLOB,除非group_concat_max_len小于或等于512,在这种情况下,结果类型是VARCHAR或VARBINARY。
假设没有指定可选的替代(GLOBAL
或SESSION
)将默认为第一个列出的替代(在本例中为GLOBAL
),尽管我无法在文档中找到明确说明。
关于MySQL文档中的语法:
当一个语法元素由多个备选项组成时,这些备选项由竖条("|")分隔。
当一组选项中的一个成员可以被选择时,备选项列在方括号内("["one_answers"]"):
当必须从选项集合中选择中的一个成员时,备选项用大括号("{"one_answers"}")列出