mysql中文乱码需server、database、table、column四层及客户端连接编码统一为utf8mb4,且collation推荐utf8mb4_unicode_ci;须检查并修改配置文件、已有对象及应用连接参数。

MySQL中文乱码不是单一配置能解决的问题,必须同时确保 server、database、table、column 四个层级的 character_set 和 collation 一致,且客户端连接时也使用相同编码。否则插入、查询、排序都会出问题。
查清当前各层字符集实际值
乱码前先别急着改,用这条命令一次性看清所有关键变量:
SHOW VARIABLES LIKE 'character\_set%';
重点关注这三项是否全为 utf8mb4(不是 utf8):
-
character_set_client:客户端发来的数据按什么编码解析 -
character_set_connection:SQL语句在服务端内部处理时用的编码 -
character_set_results:结果返回给客户端时用的编码
如果其中任一值是 latin1 或 gbk,就注定会乱码。另外,character_set_server 决定新建库/表的默认值,也必须是 utf8mb4。
修改 my.cnf/my.ini 配置文件
Linux 下配置文件通常在 /etc/my.cnf,Windows 下是 MySQL 安装目录下的 my.ini。只加以下三段,其他旧写法(如 default-character-set)在 MySQL 5.5+ 已被废弃:
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
注意:utf8mb4_unicode_ci 比 utf8mb4_general_ci 排序更准确(尤其对中文、emoji),推荐优先使用。改完必须重启 MySQL 服务,否则不生效。
批量修复已有库、表、列的字符集
配置文件改了,但旧库旧表还是 latin1 或 utf8,照样乱码。逐级执行:
- 改数据库:
ALTER DATABASE `your_db_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 改单张表:
ALTER TABLE `your_table_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 只改某列(如字段类型是
TEXT或VARCHAR):ALTER TABLE `your_table_name` MODIFY `column_name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
⚠️ 注意:CONVERT TO 会重建整张表,大数据量表慎用;MODIFY 更安全,但需显式指定字段类型和长度。
连接时强制指定字符集
即使服务端全配对了,如果应用层连接没声明编码,依然可能走默认 latin1。常见场景:
- PHP PDO 连接字符串里加
;charset=utf8mb4 - Java JDBC URL 加
?characterEncoding=utf8mb4 - 命令行登录时用
mysql -u root -p --default-character-set=utf8mb4 - MyBatis 的
url配置中必须包含characterEncoding=utf8mb4,否则BLOB字段读取也会乱码
最易忽略的一点:MySQL 8.0+ 默认 collation 是 utf8mb4_0900_ai_ci,它和 utf8mb4_unicode_ci 在中文排序行为上略有差异——比如“张”和“章”谁排前面。业务若依赖固定排序顺序,建议显式指定 COLLATE 而非依赖默认值。











