mysql表格不显示中文出现乱码,本质是数据存储、传输、展示环节的字符集配置不一致,导致中文编码无法正确解析。常见的有服务端字符集设置错误、客户端连接编码不匹配、表或字段的字符集不符合要求等情况,需要逐一排查调整。

一、排查当前mysql字符集配置
首先可以通过命令查看mysql当前的全局字符集和会话字符集配置,确认是否存在配置异常的情况。
-- 查看全局字符集配置 SHOW VARIABLES LIKE 'character_set%'; -- 查看全局排序规则配置 SHOW VARIABLES LIKE 'collation%';
正常情况下,核心的字符集配置应该统一为utf8mb4,对应的排序规则为utf8mb4_general_ci,如果出现latin1等不支持中文的字符集,就需要进行调整。
二、修改数据库和表的字符集
如果数据库或者已有表的字符集不符合要求,需要单独修改对应的配置,确保存储中文的容器支持utf8mb4编码。
1. 修改数据库字符集
-- 修改已有数据库的字符集和排序规则 ALTER DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 新建数据库时直接指定字符集 CREATE DATABASE 新数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
2. 修改表的字符集
-- 修改单个表的字符集,同时转换已有字段的编码 ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 查看表的字符集配置 SHOW CREATE TABLE 表名;
三、调整客户端连接编码
即使服务端和表的字符集正确,如果客户端连接时的编码设置不匹配,依然会出现乱码,需要在连接时指定编码。
1. 命令行客户端设置
在连接mysql后执行以下命令,设置当前会话的字符集:
SET NAMES utf8mb4;
该命令会同时设置character_set_client、character_set_connection、character_set_results三个会话变量为utf8mb4,确保传输过程编码一致。
2. 程序连接配置
如果是通过编程语言连接mysql,需要在连接参数中指定编码,以下是常见语言的配置示例:
Java连接配置
// jdbc连接url中指定字符集 String url = "jdbc:mysql://127.0.0.1:3306/数据库名?useUnicode=true&characterEncoding=utf8mb4";
Python连接配置
import pymysql
# 连接时指定charset参数
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='密码',
database='数据库名',
charset='utf8mb4'
)
PHP连接配置
// 连接后设置编码
$mysqli = new mysqli('127.0.0.1', 'root', '密码', '数据库名');
$mysqli->set_charset('utf8mb4');
四、永久配置mysql服务端字符集
为了避免每次重启mysql后字符集配置恢复默认,需要修改mysql的配置文件,永久设置字符集。
找到mysql的配置文件my.cnf(Linux系统)或者my.ini(Windows系统),在对应节点添加以下配置:
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_general_ci
修改完成后重启mysql服务,配置即可永久生效。
五、常见问题说明
- utf8和utf8mb4的区别:mysql中的utf8是阉割版,最多支持3字节字符,无法存储emoji和部分生僻中文,建议使用utf8mb4,它支持4字节字符,兼容性更好。
- 修改表字符集后,已有的乱码数据不会自动恢复,需要重新插入正确的中文数据,或者导出数据后转码再导入。
- 如果使用的是云数据库,部分配置可能需要在控制台调整,不能直接修改配置文件。
注意:修改字符集操作前建议先备份数据库,避免操作失误导致数据丢失。