Độ dài tối đa của MySQL và GROUP_CONCAT ()


260

Tôi đang sử dụng GROUP_CONCAT()trong truy vấn MySQL để chuyển đổi nhiều hàng thành một chuỗi. Tuy nhiên, độ dài tối đa của kết quả của chức năng này là các 1024ký tự.

Tôi biết rất rõ rằng tôi có thể thay đổi thông số group_concat_max_lenđể tăng giới hạn này:

SET SESSION group_concat_max_len = 1000000;

Tuy nhiên, trên máy chủ tôi đang sử dụng, tôi không thể thay đổi bất kỳ thông số nào. Không phải bằng cách sử dụng truy vấn trước và không bằng cách chỉnh sửa bất kỳ tệp cấu hình.

Vì vậy, câu hỏi của tôi là: Có cách nào khác để có được đầu ra của một truy vấn nhiều hàng thành một chuỗi không?


1
Bạn có nghĩa là khác hơn là làm công việc phía khách hàng?
lexu

40
Cảm ơn bạn thân ... câu hỏi của bạn là câu trả lời cho câu hỏi của tôi :)
Mansoorkhan Cherupuzha

Có vẻ như bạn đã chọn một câu trả lời rồi, nhưng vì tò mò, tại sao bạn không thể sử dụng SETcâu lệnh để thay đổi biến phiên?
Bill Karwin

2
Đó là bởi vì truy vấn tôi phải tạo được nhúng vào một số khung php tự chế thối và tôi không được phép chỉnh sửa bất kỳ phần nào khác. Cách dự án này được mã hóa thực sự đáng xấu hổ.
ZeWaren

1
tôi đã ngạc nhiên khi sử dụng chức năng group_concat chuỗi đã phá vỡ sự trở lại của tôi, tôi đã không có ý kiến cho rằng chức năng này trả về một số hạn chế về char nhờ bạn thân câu hỏi của bạn đã cho tôi rõ ràng :)
MasoodUrRehman

Câu trả lời:


335
SET SESSION group_concat_max_len = 1000000;

là tạm thời, phạm vi phiên, cài đặt. Nó chỉ áp dụng cho phiên hiện tại Bạn nên sử dụng nó như thế này.

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

Bạn có thể làm điều này ngay cả trong việc chia sẻ lưu trữ, nhưng khi bạn sử dụng một phiên khác, bạn cần lặp lại SET SESSIONlệnh.


4
Tôi thích sử dụng GLOBAL thay vì SESSION: SET GLOBAL group_concat_max_len=6999để làm cho cài đặt hợp lệ trên các truy vấn
IcedDante

2
Rackspace và các máy chủ đám mây khác không cho phép truy cập GLOBAL. Tôi thử sử dụng jdbc.execute ("SET SESSION group_concat_max_len = ..."); bên trong phương thức khởi tạo Dao nhưng như keatkeat đã nêu, đây chỉ là tạm thời. Nếu bất cứ ai biết cách đúng để thực hiện thay đổi này vĩnh viễn, vui lòng cho tôi biết
IcedDante

61

Tham số chính xác để đặt độ dài tối đa là:

SET @@group_concat_max_len = value_numeric;

value_numericphải> 1024; theo mặc định, group_concat_max_lengiá trị là 1024.


3
SET SESSION và SET GLOBAL không hoạt động trên một máy chủ nhất định, nhưng điều này đã làm! cảm ơn!
mfink

điều này hoạt động trong khi các đề xuất khác không @ MySQL Server 5.1.41 (Tôi biết đó là phiên bản cũ)
low_rents

2
Bạn thực sự có thể đặt group_concat_max_lenở mức thấp là 4 . ( tài liệu mysql ). " value_numericphải> = 4" là trường hợp ở đây. Tôi thực sự đã sử dụng điều này để kiểm tra những gì xảy ra khi bạn vượt quá group_concat_max_lengiá trị.
Thomas F

1
Tôi có thể xác nhận rằng tham số này hoàn toàn KHÔNG phải khởi động lại bằng chứng: một khi mysql được khởi động lại, thuộc tính được đặt lại thành 1024, vì vậy -1 đối với tôi
Frédéric

2
@ Không, bạn phải đặt giá trị trong tệp cấu hình (ví dụ: my.cnf) để cài đặt được áp dụng khi khởi động lại mysql. Không có SETtruy vấn sẽ ảnh hưởng đến cài đặt sau khi khởi động lại.
Butussy Butkus

18

Bao gồm cài đặt này trong tệp cấu hình xampp my.ini:

[mysqld]
group_concat_max_len = 1000000

Sau đó khởi động lại mysam xampp


8

Bạn có thể thử cái này

SET GLOBAL group_concat_max_len = 1000000;

Tôi đang chạy đây là máy khách sqlyog cho db của tôi, nhưng nó không phản ánh. Nhưng nó dường như hoạt động khi tôi chạy nó thông qua chương trình java của mình
Jerry

5

Cú pháp đúng là mysql> SET @@global.group_concat_max_len = integer;
Nếu bạn không có đặc quyền để thực hiện việc này trên máy chủ nơi cơ sở dữ liệu của bạn cư trú thì hãy sử dụng một truy vấn như:
myQuery = "SET @@session.group_concat_max_len = 10000;"hoặc một giá trị khác.
Dòng tiếp theo:
SET objRS = objConn.Execute(mySQL)  các biến của bạn có thể khác nhau.
sau đó
mySQL="SELECT GROUP_CONCAT(......);"vv
Tôi sử dụng phiên bản mới nhất kể từ khi tôi không có đặc quyền để thay đổi giá trị mặc định 1024 trên toàn cầu (sử dụng cPanel).
Hi vọng điêu nay co ich.


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

Truy vấn này hơi lạ nhưng nó không cần truy vấn khác để khởi tạo biến; và nó có thể được nhúng trong một truy vấn phức tạp hơn. Nó trả về tất cả các 'trường2 được phân tách bằng dấu chấm phẩy.

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
Đây là một câu trả lời tuyệt vời, nhưng không hoàn thành câu hỏi - đây là cách để có được một concat rất dài, nhưng còn việc phân nhóm thì sao? Truy vấn của bạn chỉ trả về một hàng, thay vì một hàng cho mỗi nhóm.
Benubird

Tôi nhớ đó là những gì tôi đã cố gắng thực hiện - đưa toàn bộ kết quả vào một chuỗi.
ZeWaren

9
@Benubird đây là một truy vấn rất xấu. và bởi xấu tôi có nghĩa là khủng khiếp. OP đang thực hiện một truy vấn con tương quan có một truy vấn con bên trong một truy vấn con. nếu bạn kiểm tra xem bằng cách so sánh dữ liệu, bạn sẽ có 256 so sánh trên tập dữ liệu mẫu của anh ấy hay còn gọi là 4 hàng .. bây giờ hãy tưởng tượng nếu bạn có 1k hàng so với 1 nghìn tỷ so sánh.
John Ruddell

@ JohnRuddell Vâng, đúng vậy. Tôi có thể đảm bảo với bạn truy vấn này không ở đâu trong một hệ thống trực tiếp nghiêm túc. Vào thời điểm đó, tôi cần nó cho một số loại thử thách / bài tập.
ZeWaren

5
Ah Gotcha .. Tôi muốn giới thiệu bạn thực hiện một lưu ý về điều đó cho người qua đường khác bằng cách ... Như câu trả lời này sẽ gây hiểu lầm :) thú vị nỗ lực mặc dù
John Ruddell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.