group by分组异常主因是字符集或校对规则不一致,需统一character_set_client/connection/results为utf8mb4,并确保字段及连接层collation均为utf8mb4_unicode_ci,避免简繁异体、零宽字符等隐形差异导致误分组。

GROUP BY 分组结果出错,八成是字符集或排序规则(collation)在背后搞鬼——不是数据错了,而是 MySQL 比较字符串时“认不出同一个字”。
GROUP BY 中文字段分组重复或漏分
现象是 SELECT dept_name, COUNT(*) FROM staff GROUP BY dept_name 返回 12 行,但实际只有 10 个部门。常见原因包括:
- 两个视觉一致的中文名含隐形差异:全角空格、零宽字符、简繁异体(如「张三」vs「張三」)
- 字段 collation 不统一:A 表用
utf8mb4_unicode_ci,B 表同名字段却是utf8mb4_general_ci(已废弃) - 连接层 collation 不匹配:
@@collation_connection是latin1_swedish_ci,而字段存的是 utf8mb4 字节
临时验证方式:GROUP BY dept_name COLLATE utf8mb4_unicode_ci;长期解法是建表时就明确声明 dept_name VARCHAR(50) COLLATE utf8mb4_unicode_ci NOT NULL。
GROUP_CONCAT 拼接后乱码或截断
乱码和截断本质不同:乱码是字符集转码失败,截断是长度硬限制。
- 乱码必查三项 session 变量:
character_set_client、character_set_connection、character_set_results——任一不是utf8mb4,GROUP_CONCAT就会拿 latin1 解 utf8mb4 字节,输出类似æŸäºº - 别用
CONVERT(GROUP_CONCAT() USING utf8mb4)补救:转换发生在拼接之后,损坏已发生 - 截断看
group_concat_max_len:默认 1024 字节,一个中文占 3–4 字节,撑不过 256 个字;应设为SET SESSION group_concat_max_len = 1000000
多表 JOIN + GROUP BY 结果漂移
跨表聚合时,JOIN 条件字段 collation 不一致,MySQL 可能静默降级比较精度,导致本该合并的行被拆开。
- 查字段实际 collation:
SELECT COLUMN_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'your_table' - 查当前连接 collation:
SELECT @@collation_connection - 三者必须对齐:字段定义 collation、列级 collation、
collation_connection——少一个就可能让「张三」和「张叁」在GROUP BY中被分到不同组
最容易被忽略的是 collation_connection:它不写进建表语句,却决定 GROUP_CONCAT 拼接时用什么规则,也影响隐式转换行为。










