在不详细说明原因的情况下,我想根据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函数返回了完整的结果,或者这种差异可能是由其他原因造成的?
发布于 2013-03-20 05:17:55
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-20 05:19:58
如documentation中所述,group_concat的默认限制为1024
将结果截断为group_concat_max_len系统变量指定的最大长度,其默认值为1024。
可以通过更改设置group_concat_max_len系统变量来更改此设置。
这将同时影响您看到的结果和函数的参数。
此外,您用来获取结果的工具可能会进一步截断返回值。
最后,如果您像这样使用group_concat(),那么应该显式地使用order by子句。不保证排序。在实践中,如果底层数据没有改变,我不认为它会在两次运行之间改变。但是,删除和插入记录可能会更改顺序。
发布于 2018-07-17 04:24:26
一种策略是首先对行执行md5(concat())操作,这会将大小减少到每行32字节,然后对整个操作执行group_concat操作。这将允许您一次获得floor(group_concat_max_len / 33)行的散列(不要忘记逗号)。
我做了类似的here。
如果这仍然不适合您的group_concat_max_len,那么您可以使用GROUP BY生成比floor(group_concat_max_len / 33)行更小的组,对这些行进行散列,然后对这些散列进行散列(同样是在小于...的组中)。这将是丑陋的,但您可以继续嵌套到所需的深度,以散列所需的行数。
或者你可以要求某个有能力修改group_concat_max_len的人用上面的策略来威胁他们的CPU。
https://stackoverflow.com/questions/15510418
复制相似问题