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?

Était-ce utile?

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;

http: // dev .mysql.com / doc / refman / 5.0 / fr / groupe par functions.html # function_group-concat

Hope this helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top