MySQL和组_CONCAT()的最大长度
我在MySQL查询中使用MySQL和组_CONCAT()的最大长度,mysql,group-concat,Mysql,Group Concat,我在MySQL查询中使用GROUP\u CONCAT()将多行转换为单个字符串。 但是,此函数结果的最大长度为1024个字符 我非常清楚,我可以更改参数group_concat_max_len,以增加此限制: SET SESSION group_concat_max_len = 1000000; 但是,在我使用的服务器上,我无法更改任何参数。不是通过使用前面的查询,也不是通过编辑任何配置文件 所以我的问题是: 有没有其他方法可以将多行查询的输出转换为单个字符串 CREATE TABLE som
GROUP\u CONCAT()
将多行转换为单个字符串。
但是,此函数结果的最大长度为1024个字符
我非常清楚,我可以更改参数group_concat_max_len
,以增加此限制:
SET SESSION group_concat_max_len = 1000000;
但是,在我使用的服务器上,我无法更改任何参数。不是通过使用前面的查询,也不是通过编辑任何配置文件
所以我的问题是:
有没有其他方法可以将多行查询的输出转换为单个字符串
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;
是临时的会话范围设置。它只适用于当前会话。您应该像这样使用它
SET SESSION group_concat_max_len = 1000000;
select group_concat(column) from table group by column
即使在共享主机中也可以这样做,但当您使用其他会话时,需要重复
设置会话
命令。设置最大长度的正确参数是:
SET @@group_concat_max_len = value_numeric;
值\u数值
必须大于1024;默认情况下,group\u concat\u max\u len
值为1024。正确语法为mysql>SET@@global.group\u concat\u max\u len=integer代码>
如果您没有在数据库所在的服务器上执行此操作的权限,请使用如下查询:
mySQL=“SET@@session.group\u concat\u max\u len=10000;”
或其他值。
下一行:
SET objRS=objConn.Execute(mySQL)
您的变量可能不同。
然后
mySQL=“选择组”
etc
我使用上一个版本,因为我没有权限全局更改默认值1024(使用cPanel)。
希望这有帮助。你可以试试这个
SET GLOBAL group_concat_max_len = 1000000;
在xampp my.ini配置文件中包括此设置:
[mysqld]
group_concat_max_len = 1000000
然后重新启动xampp mysql简短的回答是:当建立到mysql服务器的连接时,需要设置该设置。例如,如果使用MYSQLi/PHP,它将如下所示:
$ myConn = mysqli_init();
$ myConn->options(MYSQLI_INIT_COMMAND, 'SET SESSION group_concat_max_len = 1000000');
因此,如果您使用的是自制框架,那么在建立连接时,您需要在代码中查找位置,并提供合理的值
2020年我仍然在使用Codeigniter 3,因此在这个框架中,要添加的代码位于application/system/database/drivers/mysqli/mysqli_driver.php中,函数名为db_connect()
你是说除了做客户端的工作之外?谢谢伙计。。。您的问题是对我的问题的回答:)您似乎已经选择了一个答案,但出于好奇,为什么不能使用SET
语句来更改会话变量?这是因为我必须创建的查询嵌入到某个破旧的自制php框架中,我不允许编辑任何其他部分。这个项目的编码方式真的很丢脸。我想知道当使用group_concat函数时,我的字符串是return break,我不知道这个函数返回有限数量的字符。谢谢,伙计,你的问题让我明白了:)这是一个很好的答案,但还没有完全完成这个问题-这是如何获得很长的concat,但是分组呢?您的查询只返回一行,而不是每个组返回一行。我记得这就是我试图做的——将整个结果集放入一个字符串中。@Benubird这是一个非常糟糕的查询。我说的坏是指糟糕。OP正在执行一个相关子查询,该子查询包含一个子查询。如果您要通过数据比较来检查,那么他的样本数据集(即4行)上会有256个比较。。现在想象一下,如果你有1k行,那就是1万亿次比较。@JohnRuddell是的,是的。我可以向你保证,这个问题在一个严肃的实时系统中根本不存在。当时,我需要它来进行某种挑战/练习。啊,我明白了。。我建议你为其他路人记下这一点。。。因为这个答案会产生误导:)有趣的尝试虽然我更喜欢使用全局而不是会话:设置全局组_concat_max_len=6999
以使设置在queriesRackspace中有效,而其他云服务器不允许全局访问。我尝试使用jdbc.execute(“SET SESSION group\u concat\u max\u len=…”;在Dao初始化方法内部,但正如keatkeat所述,这只是暂时的。如果有人知道永久更改的正确方法,请让我知道SET SESSION和SET GLOBAL在某个服务器上不起作用,但它确实起作用了!谢谢当其他建议不支持@MySQL Server 5.1.41(我知道这是一个旧版本)时,这就奏效了。实际上,您可以将group\u concat\u max\u len
设置为低至4。(). 这里的情况是“value\u numeric
必须>=4”。实际上,我用它来测试当超过group\u concat\u max\u len
值时会发生什么。我可以确认这个参数绝对不是重启证明:一旦mysql被重启,属性被重置为1024,因此me@NoWay您必须在配置文件(例如my.cnf)中设置该值用于重新启动mysql时应用的设置。否SET
重新启动后,查询将影响设置。我正在为我的数据库运行这是SQLYG客户端,但它没有反映。但当我通过java程序运行它时,它似乎可以工作
$ myConn = mysqli_init();
$ myConn->options(MYSQLI_INIT_COMMAND, 'SET SESSION group_concat_max_len = 1000000');
public function db_connect($persistent = FALSE)
{
// Do we have a socket path?
if ($this->hostname[0] === '/')
{
$hostname = NULL;
$port = NULL;
$socket = $this->hostname;
}
else
{
$hostname = ($persistent === TRUE)
? 'p:'.$this->hostname : $this->hostname;
$port = empty($this->port) ? NULL : $this->port;
$socket = NULL;
}
$client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0;
$this->_mysqli = mysqli_init();
$this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);
$this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION group_concat_max_len = 1000000');
...
}