Problemi con group_concat e LongText in MySQL
-
22-08-2019 - |
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?
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.