Linux环境下MySQL出现中文乱码,本质是字符集配置不一致导致的,需要从服务端、数据库、表、客户端多个维度排查和调整配置。

问题排查步骤
首先登录MySQL服务端,查看当前全局和会话级别的字符集配置,执行以下命令:
-- 查看全局字符集配置 SHOW VARIABLES LIKE 'character_set%'; -- 查看全局排序规则配置 SHOW VARIABLES LIKE 'collation%';
正常情况下,核心参数应该符合以下配置:
| 参数名 | 推荐值 |
|---|---|
| character_set_server | utf8mb4 |
| collation_server | utf8mb4_general_ci |
| character_set_database | utf8mb4 |
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_results | utf8mb4 |
服务端配置修改
如果上述参数存在非utf8mb4的配置,需要修改MySQL的配置文件,Linux下MySQL配置文件通常位于/etc/my.cnf或者/etc/mysql/my.cnf,在对应配置段添加以下内容:
[mysqld] # 服务端默认字符集 character-set-server=utf8mb4 # 服务端默认排序规则 collation-server=utf8mb4_general_ci # 允许插入emoji等特殊字符 init_connect='SET NAMES utf8mb4' [client] # 客户端默认字符集 default-character-set=utf8mb4 [mysql] # mysql命令行客户端默认字符集 default-character-set=utf8mb4
修改完成后重启MySQL服务使配置生效:
# CentOS系统重启命令 systemctl restart mysqld # Ubuntu系统重启命令 systemctl restart mysql
已有库表字符集调整
如果是已经存在的数据库和表出现乱码,需要单独修改库表的字符集,避免新配置不生效:
-- 修改数据库字符集 ALTER DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 修改表的字符集,同时转换已有字段的字符集 ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
客户端连接配置
即使服务端配置正确,如果客户端连接时没有指定正确的字符集,依然会出现乱码。如果是通过程序连接MySQL,需要在连接参数中指定字符集:
PHP连接示例
<?php
// 创建连接时指定字符集为utf8mb4
$conn = new mysqli('localhost', '用户名', '密码', '数据库名');
$conn->set_charset('utf8mb4');
?>
Java连接示例
import java.sql.Connection;
import java.sql.DriverManager;
public class MysqlConnect {
public static void main(String[] args) throws Exception {
// 连接URL中指定字符集参数
String url = "jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8mb4";
Connection conn = DriverManager.getConnection(url, "用户名", "密码");
}
}
如果是使用mysql命令行客户端,连接时可以通过参数指定字符集:
mysql -u 用户名 -p --default-character-set=utf8mb4 数据库名
注意事项
- utf8mb4是utf8的超集,支持emoji和更多生僻汉字,建议优先使用utf8mb4而不是utf8
- 修改配置后一定要重启MySQL服务,否则配置不会生效
- 已有数据修改字符集后,建议验证数据是否正常显示,避免转换过程中出现数据丢失
- 如果使用的是云数据库,部分配置可能需要在控制台调整,不能直接修改配置文件