解决:SQL 错误 [1366] [HY000]: Incorrect string value: ‘\xE8\xAF\xAD\xE6\x96\x87’ for column ‘subject’ at row 1
1. 起因:
验证Oracle数据类型 VARCHAR2(Oracle数据库提供的独有的数据类型)和mysql数据类型VARCHAR的区别时;在MySQL数据库插入中文数据报错:
SQL 错误 [1366] [HY000]: Incorrect string value: '\xE8\xAF\xAD\xE6\x96\x87' for column 'subject' at row 1
2. 报错原因:
在往MySQL数据库学生表插入包含非ASCII字符(如中文)的字符串时。MySQL的utf8字符集只支持最多3个字节的字符编码,而中文字符通常需要更多的字节(通常是4个字节),因此会导致数据插入错误。
原建表语句:
CREATE TABLE `students` (
`name` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`userid` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`sourse` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`subject` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`remarks` varchar(2000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.解决办法:
- 使用
utf8mb4
字符集替换utf8
。utf8mb4
字符集支持4个字节的UTF-8编码,可以存储包括中文在内的所有Unicode字符。修改表的字符集命令语法如下:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
例子:
ALTER TABLE students CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
执行后可看到字符集和建表语句已经改变:
如下图:数据插入成功!
4.拓展
-
如果你正在使用MySQL的旧版本,可能需要升级到5.5.3或更高版本来使用
utf8mb4
字符集。 -
确保MySQL服务器、数据库连接和客户端都配置为支持
utf8mb4
。 -
另外若需要更改数据库或列的字符集和排序规则。例如,如果你的数据库已经创建,你可能需要执行以下SQL命令来更改字符集和排序规则,语法如下:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ALTER TABLE table_name CHANGE column_name column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
例子:
--修改学习库的字符集 ALTER DATABASE study CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; --修改学生表科目字段的字符集 ALTER TABLE students CHANGE subject subject VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
注意:若是生产字符集,切记不要乱改,特别是涉及到整个数据库的字符集编码
b4_unicode_ci;
注意:**若是生产字符集,切记不要乱改,特别是涉及到整个数据库的字符集编码**
在进行任何结构性更改前备份数据库的数据。备份很重要,当然啦,如果是学习阶段,自己弄着玩,那可以随意一些,生产上的东西一定慎重操作