Максимальна довжина MySQL та GROUP_CONCAT ()


260

Я використовую GROUP_CONCAT()в запиті MySQL для перетворення декількох рядків в одну рядок. Однак максимальна довжина результату цієї функції - 1024символи.

Я дуже добре розумію, що можу змінити параметр, group_concat_max_lenщоб збільшити цю межу:

SET SESSION group_concat_max_len = 1000000;

Однак на сервері, який я використовую, я не можу змінити жоден парам. Не використовуючи попередній запит, а не редагуючи будь-який файл конфігурації.

Отже, моє питання: Чи є інший спосіб отримати вихід із запиту з декількох рядків в одну рядок?


1
Ви маєте на увазі, крім того, щоб виконувати роботу на стороні клієнта?
lexu

40
Дякую приятелю ... ваше питання відповідає на моє запитання :)
Mansoorkhan Cherupuzha

Здається, ви вже вибрали відповідь, але з цікавості, чому ви не можете використовувати SETоператор для зміни змінної сеансу?
Білл Карвін

2
Це тому, що запит, який мені довелося створити, був вбудований в якусь гнилу домашню рамку php, і мені не було дозволено редагувати жодну іншу частину. Спосіб кодування цього проекту був справді ганебним.
ZeWaren

1
Мені було цікаво, коли за допомогою функції group_concat мою рядок було перерва повернення, я не мав уявлення, що ця функція повертає обмежену кількість знаків завдяки приятелю, ваше питання мені зрозуміло :)
MasoodUrRehman

Відповіді:


335
SET SESSION group_concat_max_len = 1000000;

є тимчасовим, сеансом дії. Це стосується лише поточного сеансу. Ви повинні використовувати його так.

SET SESSION group_concat_max_len = 1000000;
select group_concat(column) from table group by column

Це можна зробити навіть при спільному хостингу, але коли ви використовуєте інший сеанс, вам потрібно повторити SET SESSIONкоманду.


4
Я вважав за краще використовувати GLOBAL замість SESSION: SET GLOBAL group_concat_max_len=6999щоб налаштування було дійсним для запитів
IcedDante

2
Rackspace та інші хмарні сервери не дозволяють GLOBAL доступ. Я намагаюся використовувати jdbc.execute ("SET SESSION group_concat_max_len = ..."); всередині методу ініціалізації Дао, але, як заявив кіт-кіт, це лише тимчасово. Якщо хтось знає правильний спосіб змінити цю зміну назавжди, будь ласка, повідомте мене
IcedDante

61

Правильний параметр для встановлення максимальної довжини:

SET @@group_concat_max_len = value_numeric;

value_numericповинно бути> 1024; за замовчуванням group_concat_max_lenзначення - 1024.


3
SET SESSION і SET GLOBAL не працювали на певному сервері, але це було! Дякую!
mfink

це спрацювало, поки інші пропозиції не @ MySQL Server 5.1.41 (я знаю, це стара версія)
low_rents

2
Насправді ви можете встановити group_concat_max_lenдо 4 . ( mysql docs ). " value_numericmust be> = 4" - такий випадок тут. Я фактично використовував це для перевірки того, що відбувається, коли ви перевищуєте group_concat_max_lenзначення.
Томас F

1
Я можу підтвердити, що цей параметр абсолютно НЕ перезавантажений: як тільки mysql перезапускається, властивість скидається до 1024, тому -1 для мене
Фредерік

2
@NoWay вам потрібно встановити значення у файлі конфігурації (наприклад, my.cnf), щоб налаштування застосовувалося при перезапуску mysql. Жоден SETзапит не вплине на налаштування після перезавантаження.
Buttle Butkus


8

Ви можете спробувати це

SET GLOBAL group_concat_max_len = 1000000;

Я запускаю це клієнт sqlyog для мого db, але він не відображає. Але це, здається, спрацьовує, коли я запускаю його через свою програму Java
Джеррі

5

Правильний синтаксис - mysql> SET @@global.group_concat_max_len = integer;
Якщо у вас немає привілеїв робити це на сервері, де знаходиться ваша база даних, тоді використовуйте запит типу:
mySQL = "SET @@session.group_concat_max_len = 10000;"або інше значення.
Наступний рядок:
SET objRS = objConn.Execute(mySQL)  ваші змінні можуть бути різними.
тоді
mySQL="SELECT GROUP_CONCAT(......);"і т. д.
Я використовую останню версію, оскільки не маю привілеїв змінювати значення за замовчуванням 1024 в усьому світі (використовуючи cPanel).
Сподіваюсь, це допомагає.


2
CREATE TABLE some_table (
  field1 int(11) NOT NULL AUTO_INCREMENT,
  field2 varchar(10) NOT NULL,
  field3 varchar(10) NOT NULL,
  PRIMARY KEY (`field1`)
);

INSERT INTO `some_table` (field1, field2, field3) VALUES
(1, 'text one', 'foo'),
(2, 'text two', 'bar'),
(3, 'text three', 'data'),
(4, 'text four', 'magic');

Цей запит трохи дивний, але йому не потрібен інший запит для ініціалізації змінної; і його можна вбудувати у складніший запит. Він повертає все поле '2, розділене крапкою з комою.

SELECT result
FROM   (SELECT @result := '',
               (SELECT result
                FROM   (SELECT @result := CONCAT_WS(';', @result, field2) AS result,
                               LENGTH(@result)                            AS blength
                        FROM   some_table
                        ORDER  BY blength DESC
                        LIMIT  1) AS sub1) AS result) AS sub2; 

1
Це чудова відповідь, але не зовсім закінчує питання - ось як отримати дуже довгий конмат, а як бути з групуванням? Ваш запит повертає лише один рядок, а не один рядок у групі.
Benubird

Я пам’ятаю, що саме це я намагався зробити - перетворивши весь набір результатів в одну рядок.
ZeWaren

9
@Benubird це дуже поганий запит. і погано маю на увазі жахливе. OP робить співвіднесений підзапит, який має підзапит, який знаходиться всередині підзапиту. якби ви перевірили, що за допомогою порівняння даних у вас було б 256 порівнянь у наборі даних зразка, який називався 4 рядами .. тепер уявіть, чи є у вас 1k рядків - це 1 трлн порівнянь.
Джон Руддел

@JohnRuddell Так, так. Я можу запевнити, що цей запит ніде не знаходиться в межах серйозної системи живого життя У той час мені це було потрібно для якихось викликів / вправ.
ZeWaren

5
Ах готча .. Я рекомендую вам зауважити це для інших перехожих ... Оскільки ця відповідь буде вводити в оману :) Хоча цікава спроба
Джон Руддел
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.