Maksymalna długość MySQL i GROUP_CONCAT ()

260

Używam GROUP_CONCAT()w zapytaniu MySQL do konwersji wielu wierszy w pojedynczy ciąg. Jednak maksymalna długość wyniku tej funkcji to 1024znaki.

Jestem bardzo świadomy, że mogę zmienić parametry, group_concat_max_lenaby zwiększyć ten limit:

SET SESSION group_concat_max_len = 1000000;

Jednak na serwerze, którego używam, nie mogę zmienić żadnego parametru. Nie przy użyciu poprzedniego zapytania ani edycji pliku konfiguracyjnego.

Więc moje pytanie brzmi: czy jest jakiś inny sposób, aby uzyskać wynik zapytania z wielu wierszy w jednym ciągu?

ZeWaren
źródło
1
Masz na myśli inne niż wykonywanie pracy po stronie klienta?
Lexu
40
Dzięki kolego ... twoje pytanie jest odpowiedzią na moje pytanie :)
Mansoorkhan Cherupuzha,
Wygląda na to, że już wybrałeś odpowiedź, ale z ciekawości, dlaczego nie możesz użyć SETinstrukcji do zmiany zmiennej sesji?
Bill Karwin
2
To dlatego, że zapytanie, które musiałem utworzyć, było osadzone w jakiejś zgniłej domowej strukturze php i nie mogłem edytować żadnej innej części. Sposób, w jaki zakodowano ten projekt, był naprawdę wstydliwy.
ZeWaren,
1
zastanawiałem się, kiedy korzystałem z funkcji group_concat mój ciąg znaków był przerwą powrotu, nie miałem pojęcia, że ​​ta funkcja zwraca ograniczoną liczbę znaków, dzięki, kolego, twoje pytanie mnie wyjaśniło :)
MasoodUrRehman,

Odpowiedzi:

335
SET SESSION group_concat_max_len = 1000000;

jest tymczasowym ustawieniem zakresu sesji. Dotyczy to tylko bieżącej sesji. Powinieneś jej używać w ten sposób.

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

Możesz to zrobić nawet podczas udostępniania hostingu, ale gdy korzystasz z innej sesji, musisz powtórzyć SET SESSIONpolecenie.

keatkeat
źródło
4
SET GLOBAL group_concat_max_len=6999
Wolałem
2
Rackspace i inne serwery w chmurze nie pozwalają na GLOBALNY dostęp. Próbuję użyć pliku jdbc.execute („SET SESSION group_concat_max_len = ...”); wewnątrz metody inicjalizacji Dao, ale jak stwierdził keatkeat, jest to tylko tymczasowe. Jeśli ktoś zna właściwy sposób na trwałe wprowadzenie tej zmiany, proszę dać mi znać
IcedDante
61

Prawidłowy parametr do ustawienia maksymalnej długości to:

SET @@group_concat_max_len = value_numeric;

value_numericmusi być> 1024; domyślnie group_concat_max_lenwartość wynosi 1024.

oscar
źródło
3
SET SESSION i SET GLOBAL nie działały na określonym serwerze, ale tak się stało! dzięki!
mfink,
zadziałało, podczas gdy inne sugestie nie działały @ MySQL Server 5.1.41 (wiem, że to stara wersja)
low_rents 28.01.2016
2
Możesz ustawić group_concat_max_lentak niskie, jak 4 . ( mysql docs ). W tym przypadku ma miejsce „ value_numericmusi być> = 4”. Użyłem tego do przetestowania, co się stanie, gdy przekroczysz group_concat_max_lenwartość.
Thomas F
1
Mogę potwierdzić, że ten parametr absolutnie NIE jest odporny na ponowne uruchomienie: po ponownym uruchomieniu mysql właściwość jest resetowana do 1024, więc -1 dla mnie
Frédéric
2
@NoWay musisz ustawić wartość w pliku konfiguracyjnym (np. My.cnf), aby ustawienie miało zastosowanie przy ponownym uruchomieniu mysql. Żadne SETzapytanie nie wpłynie na ustawienia po ponownym uruchomieniu.
Buttle Butkus
18

Uwzględnij to ustawienie w pliku konfiguracyjnym xampp my.ini:

[mysqld]
group_concat_max_len = 1000000

Następnie uruchom ponownie xampp mysql

Chinnadurai Ramalingam
źródło
8

Możesz tego spróbować

SET GLOBAL group_concat_max_len = 1000000;
Mohamed El Mrabet
źródło
Korzystam z tego klienta sqlyog dla mojej bazy danych, ale to nie odzwierciedla. Ale wydaje się, że działa, gdy uruchomię go w moim programie Java
Jerry,
5

Prawidłowa składnia to mysql> SET @@global.group_concat_max_len = integer;
Jeśli nie masz uprawnień, aby to zrobić na serwerze, na którym znajduje się baza danych, użyj zapytania typu:
mySQL = "SET @@session.group_concat_max_len = 10000;"lub innej wartości.
Następny wiersz:
SET objRS = objConn.Execute(mySQL)  twoje zmienne mogą być inne.
następnie
mySQL="SELECT GROUP_CONCAT(......);"itp.
Używam ostatniej wersji, ponieważ nie mam uprawnień do zmiany wartości domyślnej 1024 na całym świecie (przy użyciu cPanel).
Mam nadzieję że to pomoże.

Ola Balstad
źródło
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');

To zapytanie jest nieco dziwne, ale nie wymaga innego zapytania do zainicjowania zmiennej; i może być osadzony w bardziej złożonym zapytaniu. Zwraca wszystkie pola „2” oddzielone średnikiem.

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; 
ZeWaren
źródło
1
To świetna odpowiedź, ale nie do końca kończy się pytanie - jak uzyskać bardzo długi konkat, ale co z grupowaniem? Twoje zapytanie zwraca tylko jeden wiersz zamiast jednego wiersza na grupę.
Benubird
Pamiętam, że to właśnie starałem się zrobić - zebranie całego zestawu wyników w jeden ciąg.
ZeWaren,
9
@Benubird to bardzo złe zapytanie. i przez złe mam na myśli okropne. OP wykonuje skorelowane podkwerendę, która ma podkwerendę wewnątrz podkwerendy. gdybyś miał to sprawdzić na podstawie porównań danych, miałbyś 256 porównań na jego przykładowym zbiorze danych, czyli 4 rzędy. Teraz wyobraź sobie, że masz 1k wierszy, to jest 1 bilion porównań.
John Ruddell,
@JohnRuddell Tak, to prawda. Zapewniam cię, że to zapytanie nie znajduje się w żadnym poważnym systemie na żywo. W tym czasie potrzebowałem go do jakiegoś wyzwania / ćwiczenia.
ZeWaren,
5
Ah gotcha .. Polecam zanotować to dla innych przechodniów ... Ponieważ ta odpowiedź będzie myląca :) ciekawa próba
John Ruddell,