MySQL和GROUP_CONCAT()的最大长度


260

GROUP_CONCAT()在MySQL查询中使用,将多行转换为单个字符串。但是,此函数结果的最大长度为1024字符。

我非常清楚,我可以更改参数group_concat_max_len以增加此限制:

SET SESSION group_concat_max_len = 1000000;

但是,在我使用的服务器上,我无法更改任何参数。不能通过使用前面的查询,也不能通过编辑任何配置文件。

所以我的问题是:还有其他方法可以将多行查询的输出转换为单个字符串吗?


1
您的意思是除了在客户端做工作以外?
lexu

40
谢谢好友...您的问题是我的问题的答案:)
Mansoorkhan Cherupuzha 2013年

您似乎已经选择了答案,但是出于好奇,为什么不能使用该SET语句来更改会话变量?
Bill Karwin

2
那是因为我必须创建的查询已嵌入到一些烂的自制php框架中,并且不允许我编辑任何其他部分。这个项目的编码方式真是可耻。
ZeWaren

1
我不知道何时使用group_concat函数返回字符串,我不知道该函数返回有限数量的字符,谢谢哥们,您的问题让我很清楚:)
MasoodUrRehman

Answers:


335
SET SESSION group_concat_max_len = 1000000;

是临时的会话范围设置。它仅适用于当前会话。您应该像这样使用它。

SET SESSION group_concat_max_len = 1000000;
select group_concat(column) from table group by column

您甚至可以在共享主机中执行此操作,但是当您使用其他会话时,需要重复该SET SESSION命令。


4
我更喜欢使用GLOBAL而不是SESSION:SET GLOBAL group_concat_max_len=6999使设置在所有查询中

2
Rackspace和其他云服务器不允许GLOBAL访问。我尝试使用jdbc.execute(“ SET SESSION group_concat_max_len = ...”); 在Dao的initialize方法中,但是正如keatkeat所说,这只是暂时的。如果有人知道永久进行此更改的正确方法,请告诉我
IcedD​​ante

61

设置最大长度的正确参数是:

SET @@group_concat_max_len = value_numeric;

value_numeric必须大于1024;默认情况下,group_concat_max_len值为1024。


3
SET SESSION和SET GLOBAL在特定服务器上不起作用,但是可以!谢谢!
mfink 2015年

此方法有效,而其他建议未使用@ MySQL Server 5.1.41(我知道它是旧版本)
low_rents

2
实际上,您可以将其设置group_concat_max_len4。(mysql docs)。value_numeric在这种情况下,“ 必须> = 4”。我实际上用它来测试当您超过该group_concat_max_len值时会发生什么。
Thomas F

1
我可以证实,这个参数是绝对重启性能:mysql的一次重新启动,属性重置了1024,所以-1对我来说
弗雷德里克

2
@NoWay,您必须在配置文件(例如,my.cnf)中设置该值,以便将该设置应用于重启mysql。SET重新启动后,任何查询都不会影响设置。
Buttle Butkus

18

在xampp my.ini配置文件中包括此设置:

[mysqld]
group_concat_max_len = 1000000

然后重启xampp mysql


8

你可以试试这个

SET GLOBAL group_concat_max_len = 1000000;

我正在为我的数据库运行这是sqlyog客户端,但没有反映出来。但是,当我通过Java程序运行它时,它似乎可以工作
Jerry

5

正确的语法是mysql>。SET @@global.group_concat_max_len = integer;
如果您没有权限在数据库所在的服务器上执行此操作,请使用以下查询:
mySQL = "SET @@session.group_concat_max_len = 10000;"或其他值。
下一行:
SET objRS = objConn.Execute(mySQL)  您的变量可能不同。
然后
mySQL="SELECT GROUP_CONCAT(......);"
我使用最新版本,因为我没有权限(使用cPanel)全局更改默认值1024。
希望这可以帮助。


2
CREATE TABLE some_table (
  field1 int(11) NOT NULL AUTO_INCREMENT,
  field2 varchar(10) NOT NULL,
  field3 varchar(10) NOT NULL,
  PRIMARY KEY (`field1`)
);

INSERT INTO `some_table` (field1, field2, field3) VALUES
(1, 'text one', 'foo'),
(2, 'text two', 'bar'),
(3, 'text three', 'data'),
(4, 'text four', 'magic');

这个查询有点奇怪,但是不需要另一个查询来初始化变量。并且可以将其嵌入更复杂的查询中。它返回所有用分号分隔的“ field2”。

SELECT result
FROM   (SELECT @result := '',
               (SELECT result
                FROM   (SELECT @result := CONCAT_WS(';', @result, field2) AS result,
                               LENGTH(@result)                            AS blength
                        FROM   some_table
                        ORDER  BY blength DESC
                        LIMIT  1) AS sub1) AS result) AS sub2; 

1
这是一个很好的答案,但还不能完全解决问题-这是如何获得很长的连续时间,但是分组又如何呢?您的查询仅返回一行,而不是每个组一行。
Benubird13年

我记得那是我试图做的-将整个结果集放入一个字符串中。
ZeWaren

9
@Benubird这是一个非常糟糕的查询。不好意思是可怕的。OP正在执行相关的子查询,该子查询在子查询中包含一个子查询。如果您要通过数据比较来检查您的样本数据集,即4行,那么将进行256次比较。现在,假设您有1k行,即1万亿次比较。
约翰·鲁德尔2014年

@JohnRuddell是的。我可以向您保证,此查询不在严重的实时系统内。当时,我需要它进行某种挑战/练习。
ZeWaren

5
啊,我会建议您给其他路人记录一下……因为这个答案会引起误解:)有趣的尝试
John Ruddell 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.