group_concat是mysql专用聚合函数,必须配合group by使用;默认逗号分隔、1024字节长度限制(超长静默截断)、自动跳过null;支持distinct去重、order by排序(须在separator前)、separator自定义分隔符;长度需通过set session group_concat_max_len或配置文件调整。

直接用 GROUP_CONCAT 就行,但默认分隔符是逗号,长度限制 1024 字符,超长会被截断——这是最常踩的坑。
GROUP_CONCAT 基本用法和参数控制
它本质是聚合函数,必须配合 GROUP BY 使用,否则整张表只返回一行结果。常用可调参数有三个:SEPARATOR、ORDER BY、DISTINCT。
-
SEPARATOR可设为空字符串(SEPARATOR '')或竖线(SEPARATOR '|'),不能省略引号 -
ORDER BY必须写在SEPARATOR之后,例如:GROUP_CONCAT(name ORDER BY id SEPARATOR ';') -
DISTINCT放最前面,去重后再拼接:GROUP_CONCAT(DISTINCT dept SEPARATOR ',')
被截断?检查 group_concat_max_len 配置
默认值 1024 是硬限制,不是字符数而是字节数(尤其含中文时更易超)。查当前值:SELECT @@group_concat_max_len;。临时改(当前会话生效):SET SESSION group_concat_max_len = 1000000;。永久修改需在 my.cnf 加 group_concat_max_len = 1000000 并重启 MySQL。
注意:该变量作用域是 session 级,SET GLOBAL 不影响已存在的连接;且不能设为 0(表示无限)——最小合法值是 4。
NULL 值处理与空字符串区分
GROUP_CONCAT 会自动跳过 NULL 值,但保留空字符串 ''。如果字段可能为 NULL 且你想显示为占位符(比如 '(none)'),得先用 IFNULL 或 COALESCE 转换:
SELECT GROUP_CONCAT(IFNULL(phone, '(unknown)') SEPARATOR ', ') FROM users;
另外,若所有参与聚合的值全是 NULL,整个 GROUP_CONCAT 返回 NULL,不是空字符串,做判断时要注意。
真正麻烦的是嵌套查询里用 GROUP_CONCAT 再被外层 GROUP BY 处理,容易混淆层级;还有排序字段类型不一致导致隐式转换乱序——这些细节没报错,但结果不对,得盯着执行计划和原始数据核对。











