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