Неполный вывод после конкатенации и экранирования символов

У меня есть строка с конкатенированными значениями, выполненными в MySQL, как показано ниже:

CONCAT("[\"",GROUP_CONCAT(DISTINCT(concat_ws("=>",val_1, val_2,val_3)) ORDER BY val_4 DESC SEPARATOR "\",\""),"\"]")

Я заметил, что вывод каждой строки кажется неполным, из var_dump это выглядит так:

"["CONFECTIONERY=>BISCUITS=>CRACKERS",
  "CONFECTIONERY=>BISCUITS=>COOKIES",
  "ORIENTAL GROCERY=>KOREAN GROCERY=>KOREAN FOOD (DRY, PACKET)",
  "BEVERAGE=>COFFEE=>PREMIX COFFEE POWDER",
  "CLEANING AGENT & PEST CONTROL=>LAUNDRY=>LAUNDRY LIQUID",
  "CLEANING AGENT & PEST CONTROL=>LAUNDRY=>LAUNDRY POWDER",
  "BEVERAGE=>TEA=>WESTERN TEA",
  "CEREAL & SPREADS=>CEREAL=>"

В нем отсутствует закрывающая квадратная скобка, а также третий элемент после символа =>. А также другие строки прерываются в том же месте. Если я попытаюсь json_decode в PHP, этот вывод я получу NULL, вероятно, потому, что он плохо закодирован, так как самые длинные строки (более 345 символов) обрезаны.

Или, может быть, проблема связана с длиной строки? Потому что я заметил, что они очень длинные и прерываются в той же позиции, что и символы. См. приведенный ниже снимок экрана с выходными данными mysqlworkbench: введите здесь описание изображения

Я также посчитал, и в каждой строке ровно 345 символов, и она прерывается в одной и той же точке. Это не похоже на совпадение:

введите здесь описание изображения

Из того, что я вижу, я должен был правильно экранировать символы. Какие-либо предложения?


person UgoL    schedule 08.09.2018    source источник
comment
У вас установлен xdebug? Если да, возможно, потребуется установить параметр xdebug.var_display_max_data.   -  person    schedule 08.09.2018
comment
У меня не установлен xdebug. И проблема, связанная с ограничением длины, начинается, когда я выбираю данные из таблиц MySQL в mysqlworkbench. Я предположил, что это не коррелирует с выходными данными, отображаемыми в PHP.   -  person UgoL    schedule 08.09.2018
comment
Может быть проблема с драйвером; вы проверяете ошибки в php? Также см. stackoverflow.com/a/20457466/5051310.   -  person    schedule 08.09.2018
comment
Я думаю, что это ограничение на стороне MySQL, потому что длина ограничения начинается оттуда, с SELECT.   -  person UgoL    schedule 08.09.2018
comment
ага: stackoverflow.com/questions /5545875/   -  person    schedule 08.09.2018
comment
хммм.. это может быть мой случай! позволь мне проверить..   -  person UgoL    schedule 08.09.2018
comment
Если я поставлю SET GLOBAL group_concat_max_len = 9999999; перед выбором я сталкиваюсь с ошибкой привилегий... это говорит о том, что мне нужны привилегии SUPER для этой операции..   -  person UgoL    schedule 08.09.2018
comment
это звучит как новый вопрос (возможно, ответ здесь). попробуй SET SESSION   -  person    schedule 08.09.2018
comment
@Terminus SESSION работает!! Спасибо   -  person UgoL    schedule 08.09.2018


Ответы (1)


Это не проблема с экранированием или php-кодом, это ограничение сервера mysql, добавленное к функции механизма группировки, для этого примера group_concat.

Для получения дополнительной информации прочитайте руководство: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_group_concat_max_len

Вы можете изменить эту sys_option для этого запроса или глобально, но группировать такое количество данных на стороне базы данных — плохая идея.

person Daredzik    schedule 08.09.2018