MySQL の GROUP_CONCAT とロングテキストの問題
-
22-08-2019 - |
質問
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
)
ご覧のとおり、記事のすべてのページ(それぞれ別々の行にロングテキストとして保存されています)が必要であり、Group_Concatsを単一のロングテキスト行に連れて行きます。問題は、結果が非常に多くのキャラクターであるため、完全に切り捨てられ、内容の約90%を失うことです。concatはロングテキストをうまく処理しませんか、それとも私が間違っていることが他にありますか?
解決
MySQLのマニュアルによると、GROUP_CONCAT
の最大長は1024にgroup_concat_max_len
システム変数、デフォルト値によって定義されます。
この値は、次のコマンドを使用して、増加することができる:
SET group_concat_max_len = <int>
group_concat_max_len
の値が1,048,576に別のシステム変数、max_allowed_packet
、デフォルトの値によって制限され、それ自体であることが、注目されるべきである。
この値は、同じ構文を使用して、1,073,741,824の最大値まで増加させることができる:
SET max_allowed_packet = <int>
他のヒント
この記事のタイトルは疑問を提起し、彼は本当にGROUP_CONCATについて知りたいと思ったので、誤解を招く「CONCATとLONGTEXTとのトラブル」です。私はMySQLでのCONCATの制限を扱ったので、私はグーグルで、この記事を見つけました。この記事を見つけて、CONCATに許可される最大長を増やす方法を探している人のために、ここでそれを行う方法です。
問題は、あなたがCONCATと、この制限に実行している場合は、GROUP_CONCATを使用するようにクエリを手直ししなければならないことを意味し、それが唯一のGROUP_CONCATのために働くCONCATのために動作しませんgroup_concat_max_len調整されます。
ですから、次のようにCONCATを使用していると言うます:
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';
しかし、あなたはsome_fieldの内容の端に連結しようとしているデータは、空/ nullにフィールドsome_fieldを設定切り捨てまたはちょうど飛行機を得ています。 そこでここでは、クエリは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'
深さの詳細については、私はリンク怒鳴るでこの答えを見つけた記事をチェックしてください。 出典: http://boulderapps.co/mysql-concat-limitationする
mysql ドキュメントの GROUP_CONCAT:
結果は、group_concat_max_lenシステム変数によって指定された最大長に切り捨てられ、デフォルト値は1024です。値を高く設定できますが、返品値の有効な最大長はmax_allowed_packetの値によって制約されます。実行時にgroup_concat_max_lenの値を変更する構文は次のとおりです。ここで、Valは符号なし整数です。
SET [GLOBAL | SESSION] group_concat_max_len = val;
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
お役に立てれば。