Lunghezza massima MySQL e GROUP_CONCAT ()


260

Sto usando GROUP_CONCAT()una query MySQL per convertire più righe in una singola stringa. Tuttavia, la lunghezza massima del risultato di questa funzione è di 1024caratteri.

Sono ben consapevole di poter modificare il parametro group_concat_max_lenper aumentare questo limite:

SET SESSION group_concat_max_len = 1000000;

Tuttavia, sul server che sto utilizzando, non posso modificare alcun parametro. Non utilizzando la query precedente e non modificando alcun file di configurazione.

Quindi la mia domanda è: c'è un altro modo per ottenere l'output di una query a più righe in una singola stringa?


1
Intendi altro che fare il lavoro sul lato client?
lexu,

40
Grazie amico ... la tua domanda è la risposta alla mia domanda :)
Mansoorkhan Cherupuzha,

Sembra che tu abbia già scelto una risposta, ma per curiosità, perché non puoi usare l' SETistruzione per cambiare una variabile di sessione?
Bill Karwin,

2
Questo perché la query che dovevo creare era incorporata in un marcio framework php fatto in casa e non mi era permesso di modificare nessun'altra parte. Il modo in cui questo progetto è stato codificato è stato davvero vergognoso.
ZeWaren,

1
ero meravigliato quando usando la funzione group_concat la mia stringa era pausa di ritorno, non avevo idea che questa funzione restituisse un numero limitato di caratteri grazie amico la tua domanda mi ha chiarito :)
MasoodUrRehman

Risposte:


335
SET SESSION group_concat_max_len = 1000000;

è un'impostazione temporanea, nell'ambito della sessione. Si applica solo alla sessione corrente. Dovresti usarlo in questo modo.

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

Puoi farlo anche nel condividere l'hosting, ma quando usi un'altra sessione, devi ripetere il SET SESSIONcomando.


4
Ho preferito usare GLOBAL invece di SESSION: SET GLOBAL group_concat_max_len=6999per rendere l'impostazione valida per tutte le query
IcedDante

2
Rackspace e altri server cloud non consentono l'accesso GLOBALE. Provo a usare jdbc.execute ("SET SESSION group_concat_max_len = ..."); all'interno del metodo di inizializzazione di Dao, ma come ha affermato Keatkeat, questo è solo temporaneo. Se qualcuno conosce il modo giusto per apportare questa modifica in modo permanente, fammi sapere
IcedDante,

61

Il parametro corretto per impostare la lunghezza massima è:

SET @@group_concat_max_len = value_numeric;

value_numericdeve essere> 1024; per impostazione predefinita il group_concat_max_lenvalore è 1024.


3
SET SESSION e SET GLOBAL non funzionavano su un determinato server, ma questo funzionava! Grazie!
Mfink,

questo ha funzionato mentre gli altri suggerimenti no @ MySQL Server 5.1.41 (so che è una vecchia versione)
low_rents,

2
Puoi effettivamente impostare group_concat_max_lena partire da 4 . ( documenti mysql ). " value_numericdeve essere> = 4" è il caso qui. In realtà l'ho usato per testare cosa succede quando si supera il group_concat_max_lenvalore.
Thomas F,

1
Posso confermare che questo parametro NON è assolutamente a prova di riavvio: una volta riavviato mysql, la proprietà viene reimpostata su 1024, quindi -1 per me
Frédéric

2
@NoWay devi impostare il valore in un file di configurazione (ad es. My.cnf) affinché l'impostazione venga applicata al riavvio di mysql. Nessuna SETquery influirà sulle impostazioni dopo il riavvio.
Buttle Butkus,

18

Includi questa impostazione nel file di configurazione my.ini xampp:

[mysqld]
group_concat_max_len = 1000000

Quindi riavviare xampp mysql


8

Puoi provare questo

SET GLOBAL group_concat_max_len = 1000000;

Sto eseguendo questo client sqlyog per il mio db, ma non sta riflettendo. Ma sembra funzionare quando lo eseguo attraverso il mio programma Java
Jerry

5

La sintassi corretta è mysql> SET @@global.group_concat_max_len = integer;
Se non si dispone dei privilegi per farlo sul server in cui risiede il database, utilizzare una query come:
mySQL = "SET @@session.group_concat_max_len = 10000;"o un valore diverso.
Riga successiva:
SET objRS = objConn.Execute(mySQL)  le variabili potrebbero essere diverse.
quindi
mySQL="SELECT GROUP_CONCAT(......);"ecc
. Uso l'ultima versione poiché non ho i privilegi per modificare il valore predefinito di 1024 a livello globale (usando cPanel).
Spero che questo ti aiuti.


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

Questa query è un po 'strana ma non ha bisogno di un'altra query per inizializzare la variabile; e può essere incorporato in una query più complessa. Restituisce tutti i "field2" separati da un punto e virgola.

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
Questa è un'ottima risposta, ma non completa la domanda: ecco come ottenere un concat molto lungo, ma per quanto riguarda il raggruppamento? La query restituisce solo una riga, anziché una riga per gruppo.
Benubird,

Ricordo che era quello che stavo cercando di fare: mettere l'intero set di risultati in una singola stringa.
ZeWaren,

9
@Benubird è una pessima domanda. e per cattivo intendo terribile. l'OP sta eseguendo una sottoquery correlata che ha una sottoquery all'interno di una sottoquery. se dovessi esaminare che dai confronti dei dati avresti 256 confronti sul suo set di dati di esempio aka 4 righe .. ora immagina se hai 1k righe che sono 1 trilione di confronti.
John Ruddell,

@JohnRuddell Sì, lo è. Posso assicurarti che questa query non si trova da nessuna parte all'interno di un serio sistema live. All'epoca ne avevo bisogno per una sorta di sfida / esercizio.
ZeWaren,

5
Ah gotcha .. Consiglierei di prenderne nota per gli altri passanti di ... Dato che questa risposta sarà fuorviante :) interessante tentativo però
John Ruddell
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.