Maximale Länge von MySQL und GROUP_CONCAT ()

260

Ich verwende GROUP_CONCAT()in einer MySQL-Abfrage, um mehrere Zeilen in eine einzelne Zeichenfolge zu konvertieren. Die maximale Länge des Ergebnisses dieser Funktion beträgt jedoch 1024Zeichen.

Mir ist sehr wohl bewusst, dass ich den Parameter ändern kann group_concat_max_len, um dieses Limit zu erhöhen:

SET SESSION group_concat_max_len = 1000000;

Auf dem von mir verwendeten Server kann ich jedoch keine Parameter ändern. Nicht durch Verwendung der vorhergehenden Abfrage und nicht durch Bearbeiten einer Konfigurationsdatei.

Meine Frage lautet also: Gibt es eine andere Möglichkeit, die Ausgabe einer mehrzeiligen Abfrage in eine einzelne Zeichenfolge zu übertragen?

ZeWaren
quelle
1
Du meinst anders als den Job clientseitig zu machen?
Lexu
40
Danke Kumpel ... Ihre Frage ist die Antwort auf meine Frage :)
Mansoorkhan Cherupuzha
Sie scheinen bereits eine Antwort gewählt zu haben, aber aus Neugier können Sie die SETAnweisung nicht zum Ändern einer Sitzungsvariablen verwenden.
Bill Karwin
2
Das liegt daran, dass die Abfrage, die ich erstellen musste, in ein schlechtes hausgemachtes PHP-Framework eingebettet war und ich keinen anderen Teil bearbeiten durfte. Die Art und Weise, wie dieses Projekt codiert wurde, war wirklich beschämend.
ZeWaren
1
Ich wunderte mich, als ich die group_concat-Funktion verwendete, dass meine Zeichenfolge eine Unterbrechung war. Ich hatte keine Ahnung, dass diese Funktion eine begrenzte Anzahl von
Zeichen zurückgibt.

Antworten:

335
SET SESSION group_concat_max_len = 1000000;

ist eine temporäre Einstellung für den Sitzungsbereich. Dies gilt nur für die aktuelle Sitzung. Sie sollten es so verwenden.

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

Sie können dies auch beim Freigeben von Hosting tun. Wenn Sie jedoch eine andere Sitzung verwenden, müssen Sie den SET SESSIONBefehl wiederholen .

Keatkeat
quelle
4
Ich habe es vorgezogen, GLOBAL anstelle von SESSION zu verwenden: SET GLOBAL group_concat_max_len=6999um die Einstellung für alle Abfragen gültig zu machen
IcedDante
2
Rackspace und andere Cloud-Server erlauben keinen GLOBAL-Zugriff. Ich versuche jdbc.execute zu verwenden ("SET SESSION group_concat_max_len = ..."); innerhalb der Dao-Initialisierungsmethode, aber wie keatkeat angegeben hat, ist dies nur vorübergehend. Wenn jemand den richtigen Weg kennt, um diese Änderung dauerhaft vorzunehmen, lassen Sie es mich bitte wissen
IcedDante
61

Der richtige Parameter zum Einstellen der maximalen Länge ist:

SET @@group_concat_max_len = value_numeric;

value_numericmuss> 1024 sein; Standardmäßig ist der group_concat_max_lenWert 1024.

Oscar
quelle
3
SET SESSION und SET GLOBAL funktionierten auf einem bestimmten Server nicht, aber das tat es! Vielen Dank!
mfink
Dies funktionierte, während die anderen Vorschläge nicht @ MySQL Server 5.1.41 (ich weiß, es ist eine alte Version)
low_rents
2
Sie können tatsächlich eingestellt group_concat_max_lenauf so niedrig wie 4 . ( MySQL-Dokumente ). " value_numericmuss> = 4 sein" ist hier der Fall. Ich habe dies tatsächlich verwendet, um zu testen, was passiert, wenn Sie den group_concat_max_lenWert überschreiten .
Thomas F
1
Ich kann bestätigen, dass dieser Parameter absolut NICHT reboot-sicher ist: Sobald MySQL neu gestartet wurde, wird die Eigenschaft auf 1024 zurückgesetzt, also -1 für mich
Frédéric
2
@NoWay Sie müssen den Wert in einer Konfigurationsdatei (z. B. my.cnf) festlegen, damit die Einstellung bei einem Neustart von MySQL angewendet wird. SETNach einem Neustart wirkt sich keine Abfrage auf die Einstellungen aus.
Buttle Butkus
18

Fügen Sie diese Einstellung in die Konfigurationsdatei xampp my.ini ein:

[mysqld]
group_concat_max_len = 1000000

Starten Sie dann xampp mysql neu

Chinnadurai Ramalingam
quelle
8

Sie können dies versuchen

SET GLOBAL group_concat_max_len = 1000000;
Mohamed El Mrabet
quelle
Ich verwende dies ist ein SQLlyog-Client für meine Datenbank, aber er spiegelt sich nicht wider. Aber es scheint zu funktionieren, wenn ich es durch mein Java-Programm laufen lasse
Jerry
5

Die korrekte Syntax lautet mysql> SET @@global.group_concat_max_len = integer;
Wenn Sie auf dem Server, auf dem sich Ihre Datenbank befindet, nicht über die entsprechenden Berechtigungen verfügen, verwenden Sie eine Abfrage wie:
mySQL = "SET @@session.group_concat_max_len = 10000;"oder einen anderen Wert.
Nächste Zeile:
SET objRS = objConn.Execute(mySQL)  Ihre Variablen können unterschiedlich sein.
dann
mySQL="SELECT GROUP_CONCAT(......);"usw. verwende
ich die letzte Version, da ich nicht die Berechtigungen habe, den Standardwert von 1024 global zu ändern (mit cPanel).
Hoffe das hilft.

Ola Balstad
quelle
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');

Diese Abfrage ist etwas seltsam, benötigt jedoch keine weitere Abfrage, um die Variable zu initialisieren. und es kann in eine komplexere Abfrage eingebettet werden. Es werden alle 'Felder2' durch ein Semikolon getrennt zurückgegeben.

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; 
ZeWaren
quelle
1
Dies ist eine großartige Antwort, aber die Frage ist noch nicht ganz erledigt. So erhalten Sie einen sehr langen Concat, aber was ist mit der Gruppierung? Ihre Abfrage gibt nur eine Zeile anstelle einer Zeile pro Gruppe zurück.
Benubird
Ich erinnere mich, dass ich versucht habe, die gesamte Ergebnismenge in einer einzigen Zeichenfolge zusammenzufassen.
ZeWaren
9
@ Benubird das ist eine sehr schlechte Abfrage. und mit schlecht meine ich schrecklich. Das OP führt eine korrelierte Unterabfrage durch, die eine Unterabfrage enthält, die sich in einer Unterabfrage befindet. Wenn Sie das durch Datenvergleiche untersuchen würden, hätten Sie 256 Vergleiche in seinem Beispieldatensatz, auch bekannt als 4 Zeilen. Stellen Sie sich nun vor, Sie haben 1k Zeilen, das sind 1 Billion Vergleiche.
John Ruddell
@ JohnRuddell Ja, das ist es. Ich kann Ihnen versichern, dass diese Abfrage in einem seriösen Live-System bei weitem nicht vorhanden ist. Zu der Zeit brauchte ich es für eine Art Herausforderung / Übung.
ZeWaren
5
Ah gotcha .. Ich würde empfehlen, dass Sie dies für andere Passanten notieren ... Da diese Antwort irreführend sein wird :) Interessanter Versuch
John Ruddell