GROUP_CONCAT() 是將分組欄位值拼接為字符串的聚合函數,預設最大長度僅 1024 字節,超長截斷導致資料不完整。本文詳解參數調整方法、作用域差異與生產環境最佳實踐。
mysql> SHOW VARIABLES LIKE 'group_concat_max_len';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| group_concat_max_len | 1024 |
+----------------------+-------+
當拼接結果超過 1024 字節時靜默截斷,不報錯、不警告,極易造成業務數據損失。
# /etc/my.cnf 或 my.ini
[mysqld]
group_concat_max_len = 4294967295 # 最大值 (2^32-1),或按需設定如 1048576 (1MB)
重啟後驗證:
mysql> SHOW VARIABLES LIKE 'group_concat_max_len';
+----------------------+------------+
| Variable_name | Value |
+----------------------+------------+
| group_concat_max_len | 4294967295 |
+----------------------+------------+
SET GLOBAL group_concat_max_len = 4294967295;
當前連接不生效,需重連或執行 Session 級設定。
SET SESSION group_concat_max_len = 4294967295;
-- 當前連接立即生效,斷開自動失效
SELECT GROUP_CONCAT(long_text_col SEPARATOR '|') FROM big_table;
group_concat_max_len × 並發連接數,極大值易導致 OOM;GROUP_CONCAT(col SEPARATOR ',') 減少分隔符開銷;sort_buffer/tmp_table,建議應用層分頁拼接。max_allowed_packet:限制單次網絡傳輸包大小,需同步調大(如 64MB);tmp_table_size/max_heap_table_size:臨時表超限轉磁盤,影響拼接效能。