mysql group_concat, ограничение размера применяется только к возвращаемому значению?

Не вдаваясь в детали того, почему, я хочу сделать соединение на основе результата функции 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, или разница может быть вызвана чем-то еще?

3 ответа

Решение

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вам придется искать другой путь.

Предел по умолчанию для group_concat 1024, как четко объяснено в документации:

Результат усекается до максимальной длины, заданной системной переменной group_concat_max_len со значением по умолчанию 1024.

Вы можете изменить это, изменив настройку group_concat_max_len системная переменная.

Это повлияет как на результаты, которые вы видите, так и на аргументы функций.

Кроме того, инструмент, который вы используете для получения результатов, может дополнительно усечь возвращаемое значение.

И, наконец, если вы используете group_concat() как это, то вы должны явно использовать order by пункт. Заказ не гарантируется. На практике я не думаю, что это изменится между прогонами, если базовые данные не изменятся. Однако удаление и вставка записей может изменить порядок.

Одна стратегия будет в первую очередь 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 под угрозой перебить их процессор с помощью вышеуказанной стратегии.

Другие вопросы по тегам