Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL和组_CONCAT()的最大长度_Mysql_Group Concat - Fatal编程技术网

MySQL和组_CONCAT()的最大长度

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

我在MySQL查询中使用
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');

...
    }