2009-02-09 8 views
4

SQL ...Trouble with GROUP_CONCAT LONGTEXT dans MySQL

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és sous forme longtext en rangées séparées) et les GROUP_CONCATs en seule ligne longtext. Le problème est que les résultats ne sont que tellement caractères, puis il est complètement tronqué, perdant environ 90% de le contenu. Est-ce que CONCAT ne gère pas très bien le longtext ou est-ce qu'il y a autre chose que je fais de mal?

Répondre

12

Selon le MySQL manual, la longueur maximale de GROUP_CONCAT est définie par la variable système group_concat_max_len, qui par défaut à 1024.

Cette valeur peut être augmentée, à l'aide de la commande suivante:

SET group_concat_max_len = <int> 

Il convient de noter, cependant, que la valeur de group_concat_max_len est elle-même limitée par la valeur d'une autre variable système, max_allowed_packet, qui est par défaut de 1 048 576.

Cette valeur peut être augmentée jusqu'à un maximum de 1073741824, en utilisant la même syntaxe:

SET max_allowed_packet = <int> 
+0

Merci. J'apprécie l'aide! – Iwasakabukiman

+0

Notez qu'en raison de certains bogues MySQL (wontfix) 'max_allowed_packet' ne ** signifie pas ** maximum de paquets autorisés seulement. Voir https://bugs.mysql.com/bug.php?id=20458#c113677 et http://dba.stackexchange.com/a/2383/9405 – Pacerier

0

GROUP_CONCAT à mysql documents:

Le résultat est tronqué à la longueur maximale qui est donnée par la variable système group_concat_max_len, qui a une valeur par défaut de 1024. La valeur peut être réglée plus haut, bien que le soit la longueur maximale effective du retour La valeur est contrainte par la valeur max_allowed_packet. La syntaxe de changer la valeur de group_concat_max_len lors de l'exécution est comme suit , où val est un entier non signé :

SET [GLOBAL | SESSION] group_concat_max_len = val; 

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

Hope this helps.

4

Le titre de cet article est "Problème avec CONCAT et Longtext" qui est trompeur car celui qui a posé la question voulait vraiment en savoir plus sur GROUP_CONCAT. J'ai trouvé cet article dans Google parce que j'avais affaire à une limitation avec CONCAT dans MySQL. Pour ceux d'entre vous qui trouvent ce poste et cherchent comment augmenter la longueur maximale autorisée pour CONCAT voici comment faire:

Le problème est d'ajuster group_concat_max_len ne fonctionnera pas pour CONCAT cela ne fonctionne que pour GROUP_CONCAT qui signifie Si vous rencontrez cette limitation avec CONCAT, vous devrez retravailler votre requête pour utiliser GROUP_CONCAT.

dites donc 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 de un_champ devient de plan tronqué ou tout simplement régler le un_champ champ null/vide . Voici donc 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 consultez l'article où j'ai trouvé cette réponse sur le lien ci-dessous. Source: http://boulderapps.co/mysql-concat-limitation