
常见原因
-
字符集不兼容
-
插入的数据包含当前字符集(如
latin1
)不支持的特殊字符(如中文、Emoji 等)。 -
表、列或连接的字符集未正确配置为支持目标字符(如未使用
utf8mb4
)。
-
-
客户端/服务端编码不一致
- 客户端连接时未指定正确的字符集,导致传输数据与服务端预期不符。
-
无效字符或二进制数据
- 试图插入无法被当前字符集解析的二进制数据。
解决方案
检查数据库和连接的字符集
SHOW VARIABLES LIKE '%database';

需修改数据库配置(需管理员权限)
ALTER DATABASE rainbow CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

配置连接字符集
在连接 MySQL 时指定字符集(以 JDBC 为例):
jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8

修改表的默认字符集
ALTER TABLE employees CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
重启数据库 我用的系统是红帽
service mysqld status
service mysqld restart

问题解决

utf8mb4 数据库字符集
特性 | utf8 (MySQL) |
utf8mb4 (MySQL) |
---|---|---|
Unicode 版本 | 仅支持 Basic Multilingual Plane (BMP),即 U+0000 到 U+FFFF | 支持 完整 Unicode ,包括 Supplementary Planes(扩展字符集,如 Emoji、古文字、特殊符号等),即 U+0000 到 U+10FFFF |
存储容量 | 每个字符最多 3 字节 | 每个字符最多 4 字节 |
实际标准 | 不符合 UTF-8 规范(存在历史遗留问题) |
生僻字
特别是生产 数据迁移改造 ,容易出现字节长度问题,因此设计表时需考虑使用场景。
颛顼 (zhuān xū):五帝之一
帝喾 (dì kù):上古帝王
金兀术 (jīn wù zhú):金朝名将
麴 (qū):姓氏(如麴义)
彧 (yù):常用于人名(如荀彧)
sql
INSERT INTO rainbow.employees (name, gender, age, income) VALUES ('麴', 'Male', 30, 5000.00);
INSERT INTO rainbow.employees (name, gender, age, income) VALUES ('彧三', 'Male', 30, 5000.00);
select name ,length(name) from rainbow.employees;
