1

理由の詳細には触れませんが、group_concat関数の結果に基づいて結合を実行したいと思います。(言うまでもなく、最大長パラメーターを変更することはできませんが、結合に使用できるハッシュをキャプチャすることを計画しています)見た目から、md5を使用すると異なる値が得られます。例えば。

select CONVERT(md5(group_concat(mycolumn))  USING utf8) ... 

group_concat値を引用符に貼り付けた場合とは異なる結果を返します

select CONVERT(md5(group_concat('truncated value returned by group_concat...')) USING utf8)

group_concatが完全な結果をmd5関数に返すと想定できますか、それとも他の何かが原因で違いが生じる可能性がありますか?

4

3 に答える 3

2

GROUP_CONCAT完全な結果をに返しませMD5。私はそれを具体的にテストしました:

SET group_concat_max_len = 5;
SELECT MD5(GROUP_CONCAT('123456'));
-- 827ccb0eea8a706c4c34a16891f84e7b
SET group_concat_max_len = 999;
SELECT MD5(GROUP_CONCAT('123456'));
-- e10adc3949ba59abbe56e057f20f883e

変更できない場合はgroup_concat_max_len、別の方法を見つける必要があります。

于 2013-03-19T21:17:55.427 に答える
2

ドキュメントgroup_concatで明確に説明されているように、のデフォルトの制限は1024です。

結果は、group_concat_max_lenシステム変数で指定された最大長に切り捨てられます。システム変数のデフォルト値は1024です。

group_concat_max_lenこれは、システム変数の設定を変更することで変更できます。

これは、表示される結果と関数の引数の両方に影響します。

さらに、結果をフェッチするために使用しているツールは、戻り値をさらに切り捨てる場合があります。

そして最後に、group_concat()このように使用している場合は、明示的にorder by句を使用する必要があります。注文は保証されません。実際には、基になるデータが変更されない場合、実行間で変更されるとは思いません。ただし、レコードを削除および挿入すると、順序が変わる可能性があります。

于 2013-03-19T21:19:58.403 に答える
0

1つの戦略は、最初md5(concat())に行を実行することです。これにより、サイズが1行あたり32バイトに削減され、次にgroup_concat全体が削減されます。これにより、一度に行のハッシュを取得できますfloor(group_concat_max_len / 33)(コンマを忘れないでください)。

私はここで似たようなことをします。

group_concat_max_lenそれでもそれがあなたの中に収まらない場合は、行GROUP BYよりも小さいグループを生成しfloor(group_concat_max_len / 33)、それらをハッシュしてから、それらのハッシュをハッシュすることができます(ここでも...未満のグループで)。醜いですが、必要な数の行をハッシュするために必要なだけ深くネストし続けることができます。

group_concat_max_lenまたは、上記の戦略でCPUをスラッシングする恐れがある場合は、権限のある人に変更を依頼することもできます。

于 2018-07-16T20:24:25.637 に答える