Domanda

Lo 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
)

Come si può vedere ci vuole tutte le pagine di un articolo (che sono ciascuno memorizzato come longtext in righe separate) e in un GROUP_CONCATs fila longtext singolo. Il problema è che i risultati sono solo così tanti personaggi e poi diventa completamente troncato, perdendo circa il 90% dei i contenuti. Non CONCAT non gestisce longtext molto bene o c'è un'altra cosa che sto facendo male?

È stato utile?

Soluzione

Secondo il MySQL manuale , la lunghezza massima del GROUP_CONCAT è definita dalla variabile di sistema group_concat_max_len che imposta a 1024.

Questo valore può essere aumentato, utilizzando il seguente comando:

SET group_concat_max_len = <int>

Si deve notare, tuttavia, che il valore di group_concat_max_len è essa stessa limitata dal valore di un'altra variabile di sistema, max_allowed_packet che imposta 1.048.576.

Questo valore può essere aumentato fino ad un massimo di 1,073,741,824, utilizzando la stessa sintassi:

SET max_allowed_packet = <int>

Altri suggerimenti

Il titolo di questo post è "Problemi con CONCAT e LongText" che è fuorviante in quanto colui che ha posto la domanda in realtà voleva sapere group_concat. Ho trovato questo post in Google perché avevo a che fare con una limitazione con CONCAT in MySQL. Per quelli di voi che trovano questo post e sono alla ricerca di come aumentare la lunghezza massima consentita per CONCAT ecco come fare:

Il problema è la regolazione group_concat_max_len non funzionerà per CONCAT funziona solo per group_concat il che significa che se si esegue in questa limitazione con CONCAT si dovrà rielaborare la query per utilizzare group_concat.

Quindi dici che si sta utilizzando CONCAT nel seguente modo:

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';

Ma i dati che si sta tentando di concatenare alla fine del contenuto di some_field si sta impostando il some_field campo a null / vuoto aereo troncato o semplicemente. Così qui è il modo in cui la query dovrà guardare per alleviare i chiari limiti di 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'

Per ulteriori informazioni approfondite check out l'articolo dove ho trovato questa risposta al muggito di collegamento. Fonte: http://boulderapps.co/mysql-concat-limitation

group_concat alla documentazione MySQL:

  

Il risultato viene troncato al massimo   lunghezza che è dato dalla   variabile di sistema group_concat_max_len,   che ha un valore predefinito di 1024. Il   valore può essere impostato superiore, anche se la   effettiva lunghezza massima del ritorno   valore è vincolata dal valore di   max_allowed_packet. La sintassi per   modificare il valore di   group_concat_max_len in fase di esecuzione è   segue, dove val è un unsigned   intero:

SET [GLOBAL | SESSION] group_concat_max_len = val;

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

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top