MySQL 5.7 中 GROUP_CONCAT 默认最大长度为1024字符,超长部分静默截断;需通过 SET SESSION group_concat_max_len 或修改 my.cnf 永久调大,支持 SEPARATOR、ORDER BY 和 DISTINCT;PostgreSQL 应使用 STRING_AGG 替代,并注意 NULL 处理与排序语法差异。

MySQL 5.7 用 GROUP_CONCAT 拼接分组字符串
MySQL 原生不支持数组类型,分组后合并字符串必须依赖 GROUP_CONCAT。它默认以逗号分隔,最大长度受 group_concat_max_len 系统变量限制(默认 1024),超长会被截断且无提示。
常见错误是导出时发现部分拼接结果突然变短或结尾被砍掉——大概率是这个参数卡住了。
- 查当前限制:
SELECT @@group_concat_max_len; - 临时调大(会话级):
SET SESSION group_concat_max_len = 1000000; - 永久生效需在
my.cnf中加group_concat_max_len = 1000000并重启 - 指定分隔符和排序:
GROUP_CONCAT(name ORDER BY id SEPARATOR ';')
PostgreSQL 用 STRING_AGG 处理 NULL 和排序
STRING_AGG 是 PostgreSQL 的标准方案,比 MySQL 的 GROUP_CONCAT 更严谨:默认跳过 NULL 值,但不会报错;若字段含 NULL 又想保留占位,得显式转换,比如 COALESCE(name, 'N/A')。
导出时若发现某组结果为空字符串而非预期的拼接内容,先确认原始数据里是否有全 NULL 行——STRING_AGG 对空组返回 NULL,不是空串。
- 基础用法:
STRING_AGG(title, ' | ' ORDER BY created_at) - 处理 NULL:
STRING_AGG(COALESCE(email, ''), ',') - 去重拼接(9.6+):
STRING_AGG(DISTINCT tag, ',')
SQL Server 的 FOR XML PATH('') 仍是主力方案
虽然 SQL Server 2017+ 支持 STRING_AGG,但很多生产环境还在用 FOR XML PATH(''),尤其要兼容旧版本时。它的坑在于:若拼接字段含特殊 XML 字符(如 &、),会被自动转义成 <code>&、,导出后看到的是乱码式文本。
入库前若没做预处理,导出再导入就可能出错;而用 STRING_AGG 则完全规避这个问题。
- 传统写法:
SELECT STUFF((SELECT ',' + name FROM t2 WHERE t2.group_id = t1.id FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') - 2017+ 推荐:
STRING_AGG(name, ',') WITHIN GROUP (ORDER BY sort_order) - 注意:
STRING_AGG不接受NULL作为分隔符,会报错Argument data type NULL is invalid for argument 2 of string_agg function.
导出 CSV 时引号与换行符导致解析失败
拼接后的字符串若本身含逗号、换行符或双引号,直接导出为 CSV 会导致 Excel 或 Python pandas 读取错行、列偏移。这不是拼接函数的问题,而是导出环节缺失转义。
数据库原生导出工具(如 mysql --batch --raw)通常不处理字段内换行,得靠应用层补救,或者改用 SELECT ... INTO OUTFILE 配合 FIELDS ENCLOSED BY '"' 显式包裹。
- MySQL 导出安全写法:
SELECT GROUP_CONCAT(CONCAT('"', REPLACE(name, '"', '""'), '"') SEPARATOR '","') AS csv_line FROM t GROUP BY group_id - PostgreSQL 可结合
QUOTE_IDENT或外部工具(如psql -c "COPY (...)" -o out.csv自动处理引号) - 别依赖 Excel 双击打开 CSV——它对编码、BOM、引号规则兼容性极差,用 LibreOffice 或代码读取更可靠
ORDER BY 或 DISTINCT,性能下降明显;而导出时若没统一字符集(比如表是 utf8mb4,但客户端连接用 latin1),拼接结果会出现问号或 Mojibake。这些细节不出问题时没人注意,一出就是整批数据异常。

















