mysql插入中文出现乱码是开发中非常常见的问题,核心原因是数据存储、传输、展示环节的字符集配置不统一,只要将全链路的字符集都设置为支持中文的utf8mb4,就能彻底解决这个问题。

中文乱码的常见原因
mysql出现中文乱码主要有几个场景:
- 数据库创建时默认字符集不是utf8mb4,不支持中文存储
- 数据表的字符集和数据库不一致,或者单独设置了其他字符集
- 客户端连接mysql时,没有指定正确的字符集,传输过程中编码转换出错
- 服务端mysql的配置文件没有设置默认字符集,导致新建对象继承错误的配置
全链路设置字符集的步骤
1. 修改mysql服务端配置文件
首先修改mysql的配置文件my.cnf(linux系统)或者my.ini(windows系统),在对应节点添加字符集配置,重启mysql服务生效。
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
2. 创建数据库时指定字符集
新建数据库时直接指定字符集为utf8mb4,避免继承服务端的错误配置:
-- 创建支持中文的数据库 CREATE DATABASE test_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
如果已经存在旧数据库,可以修改现有数据库的字符集:
-- 修改已有数据库的字符集 ALTER DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 创建数据表时指定字符集
数据表的字符集优先级高于数据库,创建表时也需要显式指定utf8mb4:
-- 创建支持中文的数据表
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
修改已有数据表的字符集:
-- 修改已有数据表的字符集 ALTER TABLE user_info CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4. 客户端连接时指定字符集
不管是命令行客户端还是程序连接mysql,都需要在连接时设置字符集为utf8mb4。
命令行连接时添加参数:
mysql -u root -p --default-character-set=utf8mb4
如果是程序连接,以python的pymysql为例,连接时指定字符集:
import pymysql
# 连接mysql时指定字符集为utf8mb4
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='your_password',
database='test_db',
charset='utf8mb4'
)
验证配置是否生效
可以通过sql语句查看当前各环节的字符集配置:
-- 查看数据库字符集 SHOW CREATE DATABASE test_db; -- 查看数据表字符集 SHOW CREATE TABLE user_info; -- 查看当前连接字符集 SHOW VARIABLES LIKE 'character_set%';
执行插入中文的测试语句,验证是否正常存储:
-- 插入中文测试数据
INSERT INTO user_info (name, age) VALUES ('张三', 25);
-- 查询数据验证是否正常显示
SELECT * FROM user_info;
如果查询结果中中文正常显示,说明乱码问题已经解决。
注意事项
不要使用旧的utf8字符集,mysql中的utf8实际是utf8mb3,最多只支持3字节的字符,无法存储emoji和部分生僻中文,utf8mb4才是完整的utf8实现,支持所有unicode字符。另外如果已经存在乱码数据,修改字符集后不会自动修复旧数据,需要重新插入正确的中文数据。