【问题标题】:mysql group_concat, does size limit apply only to returning value?mysql group_concat,大小限制是否仅适用于返回值?
【发布时间】:2013-03-19 21:05:33
【问题描述】:

在不详细说明原因的情况下,我想根据 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 函数,或者差异可能是由其他原因引起的?

【问题讨论】:

    标签: mysql md5 group-concat


    【解决方案1】:

    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,您将不得不另谋出路。

    【讨论】:

      【解决方案2】:

      group_concat 的默认限制为 1024,正如 documentation 中所明确解释的:

      结果被截断为由 group_concat_max_len 系统变量,默认值为 1024.

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

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

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

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

      【讨论】:

      • 确实我也打算订购它...但现在看起来它又回到了绘图板上
      • 感谢您提及order by。我发现选择的顺序受非直观因素的影响(例如 mysql 版本或附近 where id between x and y 子句的边界)。
      【解决方案3】:

      一种策略是首先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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多