Comprimento máximo do MySQL e GROUP_CONCAT ()


260

Estou usando GROUP_CONCAT()em uma consulta MySQL para converter várias linhas em uma única string. No entanto, o comprimento máximo do resultado dessa função é de 1024caracteres.

Estou muito ciente de que posso alterar os parâmetros group_concat_max_lenpara aumentar esse limite:

SET SESSION group_concat_max_len = 1000000;

No entanto, no servidor que estou usando, não consigo alterar nenhum parâmetro. Não usando a consulta anterior e não editando nenhum arquivo de configuração.

Portanto, minha pergunta é: Existe outra maneira de obter a saída de uma consulta de várias linhas em uma única string?


1
Você quer dizer além de fazer o trabalho do lado do cliente?
Lexu

40
Obrigado amigo ... sua pergunta é resposta à minha pergunta :)
Mansoorkhan Cherupuzha

Parece que você já escolheu uma resposta, mas por curiosidade, por que não pode usar a SETdeclaração para alterar uma variável de sessão?
Bill Karwin

2
Isso porque a consulta que eu tive que criar foi incorporada em alguma estrutura de php caseira e podre, e eu não tinha permissão para editar nenhuma outra parte. A maneira como este projeto foi codificado foi realmente vergonhosa.
ZeWaren

1
i foi maravilha quando se utiliza a função group_concat minha corda eram pausa retorno, eu não tinha ideia de que esta função retornar um número limitado de Charlotte Obrigado amigo a sua pergunta me fez limpar :)
MasoodUrRehman

Respostas:


335
SET SESSION group_concat_max_len = 1000000;

é uma configuração temporária, com escopo de sessão. Isso se aplica apenas à sessão atual. Você deve usá-lo assim.

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

Você pode fazer isso mesmo no compartilhamento de hospedagem, mas quando você usa outra sessão, precisa repetir o SET SESSIONcomando.


4
Preferi usar GLOBAL em vez de SESSÃO: SET GLOBAL group_concat_max_len=6999para fazer a válido configuração através de consultas
IcedDante

2
Rackspace e outros servidores em nuvem não permitem acesso GLOBAL. Eu tento usar jdbc.execute ("SET SESSION group_concat_max_len = ..."); dentro do método de inicialização do Dao, mas como o keatkeat afirmou, isso é apenas temporário. Se alguém souber o caminho certo para fazer essa alteração permanentemente
favor

61

O parâmetro correto para definir o comprimento máximo é:

SET @@group_concat_max_len = value_numeric;

value_numericdeve ser> 1024; por padrão, o group_concat_max_lenvalor é 1024.


3
SET SESSION e SET GLOBAL não funcionaram em um determinado servidor, mas funcionou! obrigado!
Mfink

isso funcionou enquanto as outras sugestões não fez @ Servidor MySQL 5.1.41 (eu sei que é uma versão antiga)
low_rents

2
Você pode realmente definir o valor group_concat_max_lenmínimo de 4 . ( documentos do mysql ). " value_numericdeve ser> = 4" é o caso aqui. Na verdade, usei isso para testar o que acontece quando você excede o group_concat_max_lenvalor.
Thomas F

1
Posso confirmar que este parâmetro é absolutamente NÃO reinicialização à prova de: uma vez mysql é reiniciado, a propriedade é resetted para 1024, de modo -1 para mim
Frédéric

2
@NoWay, você deve definir o valor em um arquivo de configuração (por exemplo, my.cnf) para que a configuração seja aplicada na reinicialização do mysql. Nenhuma SETconsulta afetará as configurações após uma reinicialização.
Buttle Butkus

18

Inclua esta configuração no arquivo de configuração xampp my.ini:

[mysqld]
group_concat_max_len = 1000000

Em seguida, reinicie o xampp mysql


8

Você pode tentar isso

SET GLOBAL group_concat_max_len = 1000000;

Estou executando este é o cliente sqlyog para o meu banco de dados, mas não está refletindo. Mas parece-trabalho quando eu executá-lo através do meu programa java
Jerry

5

A sintaxe correta é mysql> SET @@global.group_concat_max_len = integer;
Se você não tem privilégios para fazer isso no servidor em que seu banco de dados reside, use uma consulta como:
mySQL = "SET @@session.group_concat_max_len = 10000;"ou um valor diferente.
Próxima linha:
SET objRS = objConn.Execute(mySQL)  suas variáveis ​​podem ser diferentes.
em seguida,
mySQL="SELECT GROUP_CONCAT(......);"etc
eu uso a última versão desde que eu não ter os privilégios para alterar o valor padrão de 1024 globalmente (usando cPanel).
Espero que isto ajude.


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');

Essa consulta é um pouco estranha, mas não precisa de outra para inicializar a variável; e pode ser incorporado em uma consulta mais complexa. Retorna todos os 'campos2' separados por ponto e vírgula.

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
Essa é uma ótima resposta, mas não termina a pergunta - é como obter uma concatenação muito longa, mas e o agrupamento? Sua consulta retorna apenas uma linha, em vez de uma linha por grupo.
precisa saber é o seguinte

Lembro que era isso que eu estava tentando fazer - dividindo o resultado inteiro em uma única sequência.
ZeWaren

9
@ Benubird esta é uma consulta muito ruim. e com mal quero dizer terrível. o OP está fazendo uma subconsulta correlacionada que possui uma subconsulta que está dentro de uma subconsulta. se você examinasse isso por comparações de dados, você teria 256 comparações em seu conjunto de dados de amostra, também conhecido como 4 linhas. Agora, imagine se você tiver 1k linhas, isso é 1 trilhão de comparações.
precisa

@JohnRuddell Sim, é. Posso garantir que essa consulta não está nem perto de um sistema ativo ao vivo. Na época, eu precisava disso para algum tipo de desafio / exercício.
precisa saber é o seguinte

5
Ah Gotcha .. eu recomendo que você tome nota do que para outros transeuntes ... Como esta resposta será enganosa :) interessante tentativa embora
John Ruddell
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.