Pregunta

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

Como se puede ver que se necesita todas las páginas de un artículo (que son cada uno almacenado como longtext en filas separadas) y les GROUP_CONCATs en una fila longtext sola. El problema es que los resultados sólo son tantos personajes y luego se pone completamente truncada, perdiendo alrededor del 90% de los contenidos. No CONCAT no maneja muy bien longtext o hay algo que estoy haciendo mal?

¿Fue útil?

Solución

De acuerdo con la MySQL manual , la longitud máxima de GROUP_CONCAT está definida por la variable de sistema group_concat_max_len, que por defecto es 1024.

Este valor se puede aumentar, mediante el comando siguiente:

SET group_concat_max_len = <int>

Cabe señalar, sin embargo, que el valor de group_concat_max_len es en sí misma limitada por el valor de otra variable de sistema, max_allowed_packet, que por defecto a 1.048.576.

Este valor se puede aumentar a un máximo de 1073741824, utilizando la misma sintaxis:

SET max_allowed_packet = <int>

Otros consejos

El título de este post es "Problemas con CONCAT y longtext", que es engañosa ya que el que planteó la pregunta en realidad quería saber acerca de GROUP_CONCAT. He encontrado este blog en Google, ya que estaba tratando con una limitación con CONCAT en MySQL. Para aquellos de ustedes que se encuentran este post y están buscando la manera de aumentar la longitud máxima permitida para CONCAT aquí es cómo hacerlo:

El problema se está ajustando group_concat_max_len no funcionará para CONCAT sólo funciona para GROUP_CONCAT lo que significa que si está ejecutando en esta limitación con CONCAT tendrá que rehacer su consulta para utilizar GROUP_CONCAT.

Así que si se está usando CONCAT de la siguiente manera:

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

Sin embargo, los datos que está intentando concatenar en el extremo de los contenidos de some_field se está estableciendo el campo some_field a null / vacío avión truncada o simplemente. Así que aquí es la forma en la consulta tendrá que buscar para aliviar las limitaciones claras 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'

Para obtener más información en profundidad compruebe el artículo donde encontré esta respuesta en el enlace de abajo. Fuente: http://boulderapps.co/mysql-concat-limitation

GROUP_CONCAT en documentos de MySQL:

  

El resultado se trunca al máximo   longitud que se da por la   group_concat_max_len variable del sistema,   que tiene un valor predeterminado de 1024. El   valor se puede ajustar más alto, aunque el   longitud máxima efectiva de la devolución   valor está limitado por el valor de   max_allowed_packet. La sintaxis para   cambiar el valor de   group_concat_max_len en tiempo de ejecución es tan   siguiente, donde val es un unsigned   número entero:

SET [GLOBAL | SESSION] group_concat_max_len = val;

http: // dev .mysql.com / doc / RefMan / 5,0 / en / grupo por functions.html # function_group-concat

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top