Trouble with GROUP_CONCAT LONGTEXT dans MySQL
-
22-08-2019 - |
Question
Le 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
)
Comme vous pouvez le voir prend toutes les pages d'un article (qui sont chacun stockées sous forme de longtext en rangées séparées) et les GROUP_CONCATs dans un une rangée de longtext. Le problème est que les résultats ne sont que tant de caractères et il devient complètement tronquée, perdant environ 90% des les contenus. Ne pas manipuler CONCAT longtext très bien ou est-il quelque chose que je fais mal?
La solution
Selon le MySQL manuel , la longueur maximale de GROUP_CONCAT
est définie par la variable système group_concat_max_len
, qui par défaut est 1024.
Cette valeur peut être augmentée en utilisant la commande suivante:
SET group_concat_max_len = <int>
Il convient de noter, toutefois, que la valeur de group_concat_max_len
est elle-même limitée par la valeur d'une autre variable du système, max_allowed_packet
, qui par défaut 1048576.
Cette valeur peut être augmentée jusqu'à un maximum de 1.073.741.824, en utilisant la même syntaxe:
SET max_allowed_packet = <int>
Autres conseils
Le titre de ce post est « Trouble with CONCAT et LONGTEXT » qui est trompeur, car celui qui a posé la question voulait vraiment savoir sur GROUP_CONCAT. J'ai trouvé ce poste dans Google parce que je traitais une limitation CONCAT dans MySQL. Pour ceux d'entre vous qui trouvent ce poste et sont à la recherche de la façon d'augmenter la longueur maximale autorisée pour CONCAT est de savoir comment faire ici:
Le problème de l'ajustement du group_concat_max_len ne fonctionnera pas pour CONCAT il ne fonctionne que pour GROUP_CONCAT ce qui signifie que si vous exécutez dans cette limitation avec CONCAT vous devrez retravailler votre requête à utiliser GROUP_CONCAT.
Alors dites que vous utilisez CONCAT de la manière suivante:
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';
Mais les données que vous essayez de concaténer à la fin du contenu un_champ devient plan tronqué ou simplement régler le un_champ champ null / vide. Alors, est ici la façon dont la requête devra chercher à alléger les limites claires de CONCAT:
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'
Pour plus d'informations approfondies consulter l'article où j'ai trouvé cette réponse sur le lien ci-dessous. Source: http://boulderapps.co/mysql-concat-limitation
GROUP_CONCAT à mysql docs:
Le résultat est tronqué au maximum longueur qui est donnée par la variable système group_concat_max_len, qui a une valeur par défaut de 1024. Le valeur peut être plus élevée, bien que la la longueur maximale de la déclaration La valeur est limitée par la valeur de max_allowed_packet. La syntaxe changer la valeur de group_concat_max_len lors de l'exécution est tel que suit, où val est un non signé entier:
SET [GLOBAL | SESSION] group_concat_max_len = val;
Hope this helps.