mysql中group_concat默认截断为1024字符,需调大group_concat_max_len;postgresql中string_agg遇全null返回null,须用coalesce兜底,且参数顺序、排序语法与mysql不兼容。

直接用 GROUP_CONCAT(MySQL)或 STRING_AGG(PostgreSQL),别写子查询或 array_agg + 转换——原生函数更稳、更快、更少坑。
MySQL 里 GROUP_CONCAT 结果被截断了怎么办
不是数据丢了,是默认只返回前 1024 字符,超长部分静默丢弃。查当前限制:SELECT @@group_concat_max_len;
- 临时调大(当前会话有效):
SET SESSION group_concat_max_len = 1000000; - 永久生效需改
my.cnf,加一行group_concat_max_len = 1000000,然后重启 MySQL - 注意:
GROUP_CONCAT返回类型是TEXT,但受该全局变量限制,和字段定义长度无关
PostgreSQL 里 STRING_AGG 返回 NULL 怎么办
当整组所有值都是 NULL 时,STRING_AGG 直接返回 NULL,不是空字符串。上游逻辑一碰就崩。
- 安全兜底写法:
COALESCE(STRING_AGG(col, ','), '') - 如果只想跳过
NULL但保留空字符串(''),不用额外处理;但若想把''也当NULL过滤掉,得用:STRING_AGG(CASE WHEN col = '' THEN NULL ELSE col END, ',') -
STRING_AGG的分隔符是必填参数,传NULL会报错:delimiter must not be null
GROUP_CONCAT 和 STRING_AGG 参数顺序不兼容
看着都是“字段 + 分隔符”,但实际参数位置和默认行为差异大,硬套会静默出错。
- MySQL:
GROUP_CONCAT(col ORDER BY x SEPARATOR '|')——SEPARATOR是关键字,可省略,默认逗号 - PostgreSQL:
STRING_AGG(col, '|' ORDER BY x)—— 分隔符是第二个**位置参数**,必须显式传,且ORDER BY必须包在括号里:STRING_AGG(col, '|' ORDER BY x) - 排序语法不通用:MySQL 的
ORDER BY写在SEPARATOR前,PostgreSQL 必须紧贴分隔符后并加括号
跨数据库迁移或写通用 SQL 时,最易踩的坑不是语法写错,而是 GROUP_CONCAT 截断没察觉、STRING_AGG 遇全 NULL 返回 NULL 没兜底、还有参数顺序反着套导致拼接结果乱序或报错——这些都不是运行时报错,而是数据逻辑出问题,查起来特别费时间。











