Ärger mit GROUP_CONCAT und Long in MySQL
-
22-08-2019 - |
Frage
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 es alle eines Artikels Seiten nimmt (die jeweils gespeichert, wie in long getrennten Reihen) und sie in eine GROUP_CONCATs Einzellong Reihe. Das Problem ist, die Ergebnisse sind nur so viele Zeichen und dann wird es vollständig abgeschnittene, verlieren etwa 90% der die Inhalte. Hat CONCAT nicht umgehen long sehr gut oder gibt es etwas, was ich tue falsch?
Lösung
Dieser Wert kann erhöht werden, indem Sie den folgenden Befehl:
SET group_concat_max_len = <int>
Es sollte jedoch beachtet werden,, dass der Wert von group_concat_max_len
sich durch den Wert eines anderen Systemvariablen, max_allowed_packet
begrenzt ist, die standardmäßig auf 1.048.576.
Dieser Wert kann auf maximal 1073741824 erhöht werden, die gleiche Syntax:
SET max_allowed_packet = <int>
Andere Tipps
Der Titel dieses Beitrags ist „Trouble mit CONCAT und Long“, die irreführend ist, da er, der die Frage wirklich gestellt wollte über GROUP_CONCAT wissen. Ich fand diesen Beitrag in Google, weil ich mit einer Begrenzung mit CONCAT in MySQL zu tun war. Für diejenigen von Ihnen, die diese Post finden und suchen, wie die maximale Länge für CONCAT hier erlaubt zu erhöhen, ist, wie es geht:
Das Problem group_concat_max_len ist die Anpassung für CONCAT nicht funktioniert es nur für GROUP_CONCAT funktioniert, was bedeutet, dass, wenn Sie in diese Einschränkung mit CONCAT ausgeführt werden Sie Ihre Abfrage verwenden GROUP_CONCAT überarbeiten müssen.
So sagen Sie CONCAT auf folgende Weise verwenden:
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 am Ende des some_field Inhalt zu verketten versuchen wird immer abgeschnitten oder gerade Ebene das Feld some_field Einstellung auf null / leer. Hier ist also die Art und Weise wird die Abfrage aussehen müssen, um die klaren Grenzen CONCAT zu lindern:
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'
Für weitere ausführliche Informationen der Artikel herausfinden, wo ich diese Antwort auf dem Link unten gefunden. Quelle: http://boulderapps.co/mysql-concat-limitation
GROUP_CONCAT bei mysql docs:
Das Ergebnis wird auf die maximale abgeschnitten Länge, die durch die gegeben ist group_concat_max_len Systemvariable, was hat einen Standardwert von 1024. The Wert kann höher eingestellt werden, obwohl die effektive maximale Länge der Rück Wert wird durch den Wert eingeschränkt max_allowed_packet. Die Syntax Ändern Sie den Wert von group_concat_max_len zur Laufzeit ist als folgt, wobei val ein unsigned ist integer:
SET [GLOBAL | SESSION] group_concat_max_len = val;
http: // dev .mysql.com / doc / refman / 5.0 / de / group-by-functions.html # function_group-concat
Hope, das hilft.