Страницы

Поиск по вопросам

понедельник, 22 октября 2018 г.

mysql обрезает большое текстовое поле в запросе

SELECT q.*, a.answer FROM `questions` q LEFT JOIN ( SELECT question_id, GROUP_CONCAT(text SEPARATOR '|| ') answer FROM answers GROUP BY question_id ) a ON q.uid = a.question_id WHERE q.deleted = 0 GROUP BY q.uid
Этот запрос выбирает вопросы и ответы к ним, склеивая их. В табличке ответы хранятся в виде text. При выборке и конкатенации часть текста обрезается. Например если у меня 3 больших ответа, мне возвращает где-то целый первый ответ и половину второго. Если в базе все эти ответы сделать маленькими - все отлично. В чем здесь проблема?


Ответ

У функции GROUP_CONCAT есть ограничение на объем выводимых данных. По умолчанию 1024 символа для каждого объединения - для каждой выводимой строки. Если размер данных, полученных в результате конкатенации, больше, выводимый текст будет обрезан.
Чтобы расширить размер, нужно выполнить команду:
SET SESSION group_concat_max_len = 1000000;
или SET @@group_concat_max_len = 1000000; (аналогична предыдущей).
Но данная команда будет применена только к текущей сессии. По завершении сессии, например, при открытии нового соединения, значение данной переменной вернётся к начальному значению. Для установки глобальной переменной нужно выполнить следующую команду:
SET GLOBAL group_concat_max_len = 1000000;

Комментариев нет:

Отправить комментарий