Pergunta

O 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 você pode ver que toma todas as páginas de um artigo (que são cada armazenado como longtext em linhas separadas) e GROUP_CONCATs-los em um linha longtext única. O problema é que os resultados são apenas tantos caracteres e, em seguida, ele fica completamente truncado, perdendo cerca de 90% o conteúdo. Does CONCAT não lidar com longtext muito bem ou há outra coisa que eu estou fazendo errado?

Foi útil?

Solução

De acordo com o manual MySQL , o comprimento máximo de GROUP_CONCAT é definido pela variável sistema group_concat_max_len, cujo padrão é 1024.

Este valor pode ser aumentado, usando o seguinte comando:

SET group_concat_max_len = <int>

Deve-se notar, entretanto, que o valor de group_concat_max_len é limitada pelo valor de outra variável de sistema, max_allowed_packet, cujo padrão é 1.048.576.

Este valor pode ser aumentado até um máximo de 1073741824, usando a mesma sintaxe:

SET max_allowed_packet = <int>

Outras dicas

O título deste post é "Problemas com CONCAT e LONGTEXT", que é enganosa, já que ele que colocou a questão realmente queria saber sobre GROUP_CONCAT. Eu encontrei este post no Google, porque eu estava lidando com uma limitação com CONCAT no MySQL. Para aqueles de vocês que acham este post e está procurando a forma de aumentar o comprimento máximo permitido para o CONCAT aqui é como fazê-lo:

O problema está se ajustando group_concat_max_len não vai funcionar para CONCAT ele só funciona para GROUP_CONCAT o que significa que se você estiver executando a esta limitação com CONCAT você terá que refazer sua consulta ao uso GROUP_CONCAT.

Então, digamos que você está usando CONCAT da seguinte maneira:

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

Mas os dados que você está tentando concatenar na extremidade do conteúdo de some_field está ficando truncado ou apenas avião definindo o some_field campo como nulo / vazio. Então aqui é a forma como a consulta vai ter que olhar para aliviar as limitações 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 obter mais informações em cheque profundidade para fora o artigo onde eu encontrei esta resposta no link abaixo. Fonte: http://boulderapps.co/mysql-concat-limitation

GROUP_CONCAT em docs MySQL:

O resultado é truncado ao máximo comprimento que é dada pela variável sistema group_concat_max_len, que tem um valor padrão de 1024. O valor pode ser definido superior, embora o O comprimento efectivo máximo do retorno valor é limitado pelo valor de max_allowed_packet. A sintaxe para alterar o valor de group_concat_max_len em tempo de execução é tão segue, em que Val é um unsigned inteiro:

SET [GLOBAL | SESSION] group_concat_max_len = val;

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

Espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top