mysql作为常用的关系型数据库,默认配置下可能不支持中文存储,插入中文时会出现报错或者乱码问题,这和数据存储、传输环节的字符集设置直接相关。下面我们来详细分析问题的成因和解决方法。

常见原因分析
mysql不能插入中文的核心原因是字符集不匹配,常见的场景有以下几种:
- 数据库实例创建时使用了latin1等不支持中文的默认字符集
- 数据表的字符集未设置为支持中文的类型,或者字段单独设置了不兼容的字符集
- 客户端连接数据库时,没有指定正确的字符集,导致传输的中文数据编码和数据库要求的编码不一致
- mysql配置文件未做全局字符集设置,重启后配置失效
解决步骤
1. 检查当前字符集配置
首先可以登录mysql终端,执行以下命令查看当前全局和会话级别的字符集设置:
-- 查看全局字符集配置 SHOW VARIABLES LIKE 'character_set%'; -- 查看排序规则配置 SHOW VARIABLES LIKE 'collation%';
如果character_set_database、character_set_server等值为latin1,就说明字符集配置不符合中文存储要求。
2. 修改mysql全局配置文件
需要修改mysql的配置文件my.cnf(Linux系统)或者my.ini(Windows系统),在对应节点下添加字符集配置:
[mysqld] # 服务端默认字符集 character-set-server=utf8mb4 # 服务端排序规则 collation-server=utf8mb4_general_ci [client] # 客户端默认字符集 default-character-set=utf8mb4 [mysql] # mysql命令行客户端默认字符集 default-character-set=utf8mb4
修改完成后重启mysql服务,配置即可生效。
3. 修改已有数据库和表的字符集
如果已经存在需要存储中文的数据库和表,可以执行以下命令修改字符集:
-- 修改数据库字符集 ALTER DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 修改表的字符集和所有字段的字符集 ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
4. 验证插入功能
配置完成后,可以创建测试表插入中文验证是否生效:
-- 创建测试表
CREATE TABLE test_chinese (
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(100)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 插入中文数据
INSERT INTO test_chinese (content) VALUES ('测试中文插入功能');
-- 查询验证
SELECT * FROM test_chinese;
如果查询结果显示中文正常,说明问题已经解决。
注意事项
建议使用utf8mb4而不是utf8字符集,因为mysql中的utf8是阉割版,最多只支持3字节字符,无法存储emoji和部分生僻汉字,utf8mb4是完整的utf8实现,支持4字节字符,兼容性更好。另外连接数据库时,需要在连接参数中指定字符集为utf8mb4,比如使用jdbc连接时,连接串需要添加useUnicode=true&characterEncoding=utf8mb4参数。