SQLite的GROUP_CONCAT只支持两个位置参数,第二参数为分隔符,不支持SEPARATOR关键字;分隔符为空字符串则无间隔拼接,为NULL则整个结果为NULL;排序需用ORDER BY子句置于逗号前;默认最大长度1024字符,超长静默截断。

GROUP_CONCAT第二个参数就是分隔符,不是SEPARATOR关键字
SQLite 的 GROUP_CONCAT 不支持 MySQL 风格的 SEPARATOR 关键字写法。它只接受两个位置参数:GROUP_CONCAT(x, y),其中 y 是分隔符字符串,必须写在第二位,不能省略括号、不能加关键字。
常见错误是照搬 MySQL 写法:GROUP_CONCAT(name SEPARATOR '; ') —— 这在 SQLite 中直接报错 near "SEPARATOR": syntax error。
-
GROUP_CONCAT(name, '; ')✅ 正确 -
GROUP_CONCAT(name SEPARATOR '; ')❌ SQLite 不识别SEPARATOR -
GROUP_CONCAT(name, '; ', ...)❌ 只支持最多两个参数,第三个会被忽略或报错
分隔符为空字符串或 NULL 时的行为
传入空字符串 '' 会把值紧挨着拼接(无间隔);传入 NULL 则整个结果变为 NULL,哪怕组内有非空值。
-
GROUP_CONCAT(name, '')→ 输出类似AliceBobCharlie -
GROUP_CONCAT(name, NULL)→ 整个字段返回NULL,不报错但结果不可用 - 若想安全 fallback 到默认逗号,得在外面套
COALESCE:GROUP_CONCAT(name, COALESCE(@sep, ','))
排序 + 自定义分隔符必须用 ORDER BY 子句
SQLite 支持在 GROUP_CONCAT 内部使用 ORDER BY,但它和分隔符是正交的:分隔符仍由第二个参数控制,排序单独写在表达式里。
语法结构是:GROUP_CONCAT(x ORDER BY y ASC/DESC, separator) —— 注意 ORDER BY 在逗号前,separator 在逗号后。
-
GROUP_CONCAT(name ORDER BY name ASC, ' | ')✅ 先按 name 升序,再用|连接 -
GROUP_CONCAT(name, ' | ' ORDER BY name)❌ 语法错误,ORDER BY不能放在第二个参数后面 - 不加
ORDER BY时,连接顺序不确定,不要依赖默认顺序
结果被截断?检查 group_concat_max_len 限制
SQLite 默认限制拼接结果最大为 1024 字符,超长部分静默丢弃,不会报错也不会警告。
- 查当前值:
PRAGMA group_concat_max_len; - 临时调高(当前连接有效):
PRAGMA group_concat_max_len = 50000; - 这个设置是 session 级的,每次新连接都要重设,无法写进数据库文件本身
- 如果拼接后明显缺内容,第一反应就该查这个 pragma

















