MySQL ve GROUP_CONCAT () maksimum uzunluğu


260

GROUP_CONCAT()Tek bir dizeye birden çok satır dönüştürmek için bir MySQL sorgusu kullanıyorum . Ancak, bu işlevin sonucunun maksimum uzunluğu 1024karakterdir.

group_concat_max_lenBu sınırı artırmak için param değiştirebileceğimin çok iyi farkındayım :

SET SESSION group_concat_max_len = 1000000;

Ancak, kullandığım sunucuda herhangi bir parametre değiştiremiyorum. Önceki sorguyu kullanarak değil, herhangi bir yapılandırma dosyasını düzenleyerek değil.

Benim sorum: Çok satırlı bir sorgunun çıktısını tek bir dizeye almanın başka bir yolu var mı?


1
İstemci tarafındaki işi yapmak dışında mı demek istiyorsun?
lexu

40
Teşekkürler dostum ... sorunuz soruma cevap :)
Mansoorkhan Cherupuzha

Zaten bir cevap seçmiş görünüyorsunuz, ancak meraktan dolayı, neden SETbir oturumu değiştirmek için ifadeyi kullanmıyorsunuz ?
Bill Karwin

2
Çünkü ben oluşturmak zorunda sorgu çürümüş ev yapımı php çerçevesine gömülü ve başka bir bölümünü düzenlemek için izin verilmedi çünkü. Bu projenin kodlanma şekli gerçekten utanç vericiydi.
ZeWaren

1
i grup_concat işlevini kullanırken merak ediyorum benim dize dönüş sonu vardı, ben bu işlevin char sınırlı sayıda geri dönüş hakkında hiçbir fikrim yoktu dostum sorunuzun beni açıkladı :)
MasoodUrRehman

Yanıtlar:


335
SET SESSION group_concat_max_len = 1000000;

geçici, oturum kapsamı bir ayardır. Sadece geçerli oturum için geçerlidir. Bunu böyle kullanmalısınız.

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

Barındırma paylaşımında bile bunu yapabilirsiniz, ancak başka bir oturum kullandığınızda, SET SESSIONkomutu tekrarlamanız gerekir .


4
OTURUM yerine GLOBAL kullanmayı tercih ettim: SET GLOBAL group_concat_max_len=6999ayarı sorgularda geçerli kılmak için
IcedDante

2
Rackspace ve diğer bulut sunucuları GLOBAL erişimine izin vermez. Jdbc.execute ("SET SESSION group_concat_max_len = ...") kullanmayı deneyin; Dao başlatma yönteminin içinde ancak keatkeat'in belirttiği gibi, bu sadece geçicidir. Herkes bu değişikliği kalıcı olarak yapmak için doğru yolu biliyorsa pls bana bildirin
IcedDante

61

Maksimum uzunluğu ayarlamak için doğru parametre:

SET @@group_concat_max_len = value_numeric;

value_numeric> 1024 olmalıdır; varsayılan olarak group_concat_max_lendeğer 1024'tür.


3
SET OTURUMU ve SET GLOBAL belirli bir sunucuda çalışmadı, ancak bu işe yaradı! Teşekkürler!
mfink

diğer öneriler @ MySQL Server 5.1.41 (eski bir sürüm olduğunu biliyorum)
low_rents

2
Aslında 4'egroup_concat_max_len kadar düşük olarak ayarlayabilirsiniz . ( mysql dokümanları ). " = 4 olmalı" burada böyledir. Aslında değeri aştığınızda ne olduğunu test etmek için kullandım . value_numericgroup_concat_max_len
Thomas F

1
Bu parametre kesinlikle olduğunu teyit edebilir DEĞİL reboot geçirmez: MySQL yeniden bir kere, mülkiyet böylece -1 benim için 1024 sıfırlanır
Frédéric'in

2
@NoWay, mysql'nin yeniden başlatılmasında uygulanacak ayarın bir yapılandırma dosyasındaki (örn. My.cnf) değeri ayarlamanız gerekir. SETYeniden başlatma sonrasında hiçbir sorgu ayarları etkilenmez.
Buttle Butkus

18

Bu ayarı xampp my.ini yapılandırma dosyasına dahil et:

[mysqld]
group_concat_max_len = 1000000

Sonra xampp mysql'yi yeniden başlatın


8

Bunu deneyebilirsin

SET GLOBAL group_concat_max_len = 1000000;

Bu benim db için sqlyog istemcisi çalıştırıyorum, ama yansıtan değil. Ama benim java programımla çalıştırdığımda işe yarıyor
Jerry

5

Doğru sözdizimi mysql> SET @@global.group_concat_max_len = integer;
Veritabanınızın bulunduğu sunucuda bunu yapma ayrıcalıklarınız yoksa, aşağıdaki gibi bir sorgu kullanın:
mySQL = "SET @@session.group_concat_max_len = 10000;"veya farklı bir değer.
Sonraki satır:
SET objRS = objConn.Execute(mySQL)  değişkenleriniz farklı olabilir.
sonra
mySQL="SELECT GROUP_CONCAT(......);"vb
Ben küresel (1024 cPanel kullanarak) varsayılan değerini değiştirmek için ayrıcalık yok çünkü son sürümünü kullanın.
Bu yardımcı olur umarım.


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');

Bu sorgu biraz garip ama değişkeni başlatmak için başka bir sorguya gerek yok; ve daha karmaşık bir sorguya gömülebilir. Tüm 'field2'leri noktalı virgülle ayırarak döndürür.

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
Bu harika bir cevap, ama soruyu tam olarak bitirmiyor - bu çok uzun bir konsat nasıl elde edilir, ama gruplama ne olacak? Sorgunuz, grup başına bir satır yerine yalnızca bir satır döndürür.
Benubird

Hatırlıyorum yapmaya çalıştığım şey - tüm sonuç kümesini tek bir dizgiye yerleştirmek.
ZeWaren

9
@Benubird bu çok kötü bir sorgu. ve kötü demek korkunç. OP, bir alt sorgunun içinde bir alt sorgusu olan ilişkili bir alt sorgu yapıyor. Eğer veri karşılaştırmalarına göre, örnek veri seti üzerinde 4 sıra olarak 256 karşılaştırmaya sahip olsaydınız, şimdi 1 trilyon karşılaştırma yapan 1k satırınız olduğunu hayal edin.
John Ruddell

@JohnRuddell Evet, öyle. Bu sorgunun ciddi bir canlı sistemin içinde hiçbir yerde olmadığından emin olabilirim. O zaman, bir çeşit meydan okuma / alıştırma için ona ihtiyacım vardı.
ZeWaren

5
Ah gotcha .. Bunu diğer yolcular için not almanızı tavsiye ederim ... Bu cevap yanıltıcı olacağı gibi :) ilginç bir girişim olsa da
John Ruddell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.