1. 字符集配置未正确设置
原因
-
数据库/表/列的字符集非 UTF-8:若数据库、表或字段的字符集为
latin1
等非 UTF-8 编码,存储或查询中文时会乱码。 -
客户端与服务器字符集不匹配:客户端工具(如 MySQL 命令行)的字符集与数据库不一致,导致数据显示异常。
解决步骤
-
检查数据库和表的字符集
sql
复制
-- 查看数据库字符集 SHOW CREATE DATABASE your_database; -- 查看表字符集 SHOW CREATE TABLE tb_user;
-
确认字符集为
utf8mb4
(推荐)或utf8
,排序规则为utf8mb4_unicode_ci
。
-
-
修改字符集(如需要)
sql
复制
-- 修改数据库字符集 ALTER DATABASE your_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 修改表字符集 ALTER TABLE tb_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 客户端字符集未正确配置
原因
-
客户端工具(如 MySQL 命令行)未指定 UTF-8 编码,导致中文显示为乱码或问号(
???
)。
解决步骤
-
在连接时指定字符集
bash
复制
mysql -u username -p --default-character-set=utf8mb4
-
在 MySQL 会话中动态设置
sql
复制
SET NAMES 'utf8mb4'; -- 统一客户端、连接、结果的字符集
-
永久配置客户端字符集
在 MySQL 配置文件(如my.cnf
)的[client]
部分添加:ini
复制
[client] default-character-set = utf8mb4
3. 数据写入时已损坏
原因
-
若数据在插入时未使用正确的字符集,即使后续修改字符集,已存储的中文仍可能为乱码。
解决步骤
-
重新插入数据
确保在字符集统一后,使用正确的编码重新插入中文数据。sql
复制
INSERT INTO tb_user (name) VALUES ('中文测试');
-
转换已有数据编码
若已有数据因字符集问题损坏,可导出后重新导入:bash
复制
mysqldump --default-character-set=latin1 -u root -p your_database > dump.sql # 修改 dump.sql 文件字符集声明为 utf8mb4 mysql --default-character-set=utf8mb4 -u root -p your_database < dump.sql
4. 终端工具或操作系统不支持 UTF-8
原因
-
终端工具(如 PuTTY、Xshell)或操作系统的字符编码未设置为 UTF-8,导致中文无法渲染。
解决步骤
-
设置终端编码为 UTF-8
-
Windows(PuTTY):在 Connection > Data 中设置 "UTF-8"。
-
Linux/macOS:在终端配置中确认编码为 UTF-8。
-
-
安装中文字体
确保操作系统或终端工具安装了中文字体(如 Noto Sans CJK)。
验证中文显示是否正常
-
插入测试数据
sql
复制
INSERT INTO tb_user (name) VALUES ('中文测试');
-
查询数据
sql
复制
SELECT * FROM tb_user WHERE name = '中文测试';
-
若正确显示中文,则问题已解决。
-
总结
-
统一字符集:确保数据库、表、客户端、连接均使用
utf8mb4
。 -
配置优先级:
-
数据库层 > 客户端层 > 操作系统/终端工具。
-
-
数据完整性:若已有数据乱码,需重新插入或转换编码。