如何排查并修正SQL聚合查询中中文字符编码乱码问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计924个文字,预计阅读时间需要4分钟。
在SQL查询中使用GROUP BY或GROUP_CONCAT时,如果遇到中文字符或Mojibake(如%A%C%9F%90%A%C%BA%BA)等问题,通常不是SQL语法错误,而是由于连接层的字符集设置不当导致的。如果表字段是utf8mb4,但连接层的字符集是latin1或utf8(取决于MySQL的版本),就会产生乱码。
要解决这个问题,需要确保以下两点:
查当前连接实际生效的字符集
别只看建库语句或 SHOW VARIABLES LIKE 'character_set_database',GROUP BY 和 GROUP_CONCAT 用的是 session 级连接参数。执行:
SHOW VARIABLES LIKE 'character_set%';
重点关注这三项是否全为 utf8mb4:
character_set_clientcharacter_set_connectioncharacter_set_results
任一不是 utf8mb4,聚合结果就可能出问题。常见陷阱:Navicat 默认连接用 utf8(实为 utf8mb3),不支持 emoji 和部分生僻汉字;命令行 mysql -u root -p 不加参数时默认用 latin1。
连接初始化时必须显式声明 utf8mb4
应用代码里漏掉 charset 声明,等于白配数据库。
本文共计924个文字,预计阅读时间需要4分钟。
在SQL查询中使用GROUP BY或GROUP_CONCAT时,如果遇到中文字符或Mojibake(如%A%C%9F%90%A%C%BA%BA)等问题,通常不是SQL语法错误,而是由于连接层的字符集设置不当导致的。如果表字段是utf8mb4,但连接层的字符集是latin1或utf8(取决于MySQL的版本),就会产生乱码。
要解决这个问题,需要确保以下两点:
查当前连接实际生效的字符集
别只看建库语句或 SHOW VARIABLES LIKE 'character_set_database',GROUP BY 和 GROUP_CONCAT 用的是 session 级连接参数。执行:
SHOW VARIABLES LIKE 'character_set%';
重点关注这三项是否全为 utf8mb4:
character_set_clientcharacter_set_connectioncharacter_set_results
任一不是 utf8mb4,聚合结果就可能出问题。常见陷阱:Navicat 默认连接用 utf8(实为 utf8mb3),不支持 emoji 和部分生僻汉字;命令行 mysql -u root -p 不加参数时默认用 latin1。
连接初始化时必须显式声明 utf8mb4
应用代码里漏掉 charset 声明,等于白配数据库。

