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

的默认限制是 1024,如文档group_concat中明确解释的那样:

结果被截断为 group_concat_max_len 系统变量给出的最大长度,默认值为 1024。

您可以通过更改设置group_concat_max_len系统变量来更改此设置。

这会影响您看到的结果和函数的参数。

此外,您用于获取结果的工具可能会进一步截断返回值。

最后,如果你group_concat()像这样使用,那么你应该明确地使用一个order by子句。不保证订购。在实践中,如果基础数据没有改变,我认为它不会在运行之间改变。但是,删除和插入记录可能会更改排序。

于 2013-03-19T21:19:58.403 回答
0

一种策略是先行md5(concat()),这会将大小减少到每行 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 回答