4 Stimmen

Probleme mit GROUP_CONCAT und Longtext in MySQL

Die SQL...

UPDATE Threads t 
SET t.Content = (
    SELECT GROUP_CONCAT(a.Content ORDER BY a.PageID SEPARATOR '<!-- pagebreak -->') 
    FROM MSarticlepages a
    WHERE a.ArticleID = t.MSthreadID GROUP BY a.ArticleID
)

Wie Sie sehen können, werden alle Seiten eines Artikels (die jeweils als Langtext in separaten Zeilen gespeichert sind) und GROUP_CONCAT fasst sie in einer eine einzige Langtextzeile. Das Problem ist, dass die Ergebnisse nur so viele Zeichen, und dann wird es komplett abgeschnitten, wobei etwa 90 % der des Inhalts. Kann CONCAT nicht sehr gut mit Langtexten umgehen oder gibt es oder mache ich etwas anderes falsch?

15voto

David Grant Punkte 13573

Nach Angaben der MySQL-Handbuch die maximale Länge von GROUP_CONCAT wird definiert durch den group_concat_max_len Systemvariable, die standardmäßig auf 1024 eingestellt ist.

Dieser Wert kann mit dem folgenden Befehl erhöht werden:

SET group_concat_max_len = <int>

Es ist jedoch zu beachten, dass der Wert von group_concat_max_len selbst durch den Wert einer anderen Systemvariablen begrenzt ist, max_allowed_packet die standardmäßig auf 1.048.576 eingestellt ist.

Dieser Wert kann mit der gleichen Syntax auf einen Höchstwert von 1.073.741.824 erhöht werden:

SET max_allowed_packet = <int>

0 Stimmen

Vielen Dank! Ich weiß die Hilfe zu schätzen!

0 Stimmen

Beachten Sie, dass aufgrund eines MySQL-Bugs (Wontfix) max_allowed_packet tut ノット nur die maximal zulässigen Pakete bedeuten. Siehe bugs.mysql.com/bug.php?id=20458#c113677 y dba.stackexchange.com/a/2383/9405

5voto

N D Punkte 667

Der Titel dieses Beitrags lautet "Trouble with CONCAT and Longtext", was irreführend ist, da der Fragesteller eigentlich etwas über GROUP_CONCAT wissen wollte. Ich habe diesen Beitrag in Google gefunden, weil ich mit einer Einschränkung von CONCAT in MySQL zu tun hatte. Für diejenigen, die diesen Beitrag finden und wissen wollen, wie man die maximal zulässige Länge für CONCAT erhöht, hier eine Anleitung:

Das Problem ist, dass die Anpassung von group_concat_max_len nicht für CONCAT funktioniert, sondern nur für GROUP_CONCAT. Das bedeutet, dass Sie Ihre Abfrage überarbeiten müssen, um GROUP_CONCAT zu verwenden, wenn Sie mit CONCAT auf diese Einschränkung stoßen.

Angenommen, Sie verwenden CONCAT auf folgende Weise:

UPDATE some_table
SET some_field=CONCAT(some_field,'super long string to append to the end of the data in some_field')
WHERE some_criteria_field = 'match on this string';

Aber die Daten, die Sie versuchen, am Ende des Inhalts von some_field zu verketten, werden abgeschnitten oder das Feld some_field wird einfach auf null/leer gesetzt. Die Abfrage muss also folgendermaßen aussehen, um die eindeutigen Einschränkungen von CONCAT zu mildern:

SET @@session.group_concat_max_len = @@global.max_allowed_packet;
UPDATE some_table SET some_table.some_field=(
     SELECT GROUP_CONCAT( queue.append_to_end SEPARATOR '') as new_some_field
     FROM
     (
          SELECT append_to_end FROM some_table WHERE some_criteria_field = 'match on this string'
          UNION
          SELECT 'super long string to append to the end of the data in some_field' as append_to_end
     ) as queue
) WHERE some_criteria_field = 'match on this string'

Weitere Informationen finden Sie in dem Artikel, in dem ich diese Antwort gefunden habe, unter dem unten stehenden Link. Quelle: http://boulderapps.co/mysql-concat-limitation

1voto

Jack Punkte 19711

GROUP_CONCAT bei mysql docs:

Das Ergebnis wird auf das Maximum abgeschnitten Länge gekürzt, die durch die Systemvariable Systemvariable group_concat_max_len angegeben ist, die einen Standardwert von 1024 hat. Der Wert kann höher gesetzt werden, obwohl die effektive Maximallänge des Rückgabewertes Wertes durch den Wert von max_allowed_packet begrenzt wird. Die Syntax zur Änderung des Wertes von group_concat_max_len zur Laufzeit wie folgt wie folgt, wobei val eine vorzeichenlose Ganzzahl ist:

SET [GLOBAL | SESSION] group_concat_max_len = val;

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X