问题描述:
使用MySQL创建user/student表时,插入中文数据发生错误。
SQL语句及SQLyog语句:
SQL:
insert into `day07case`.`test` (`name`) values ('张三')
错误信息:
Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' at row 1
原因分析:
创建表时charset设置为Latin1,Latin1不支持中文字符,因此我们需要修改编码格式
解决方案:
-
查看user表
show create table user;
-
将错误信息复制出来
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `gender` varchar(5) DEFAULT NULL, `age` int(11) DEFAULT NULL, `address` varchar(32) DEFAULT NULL, `qq` varchar(20) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
-
分析错误:
-
由此发现charset设置为Latin1,Latin1不支持中文字符,因此我们需要修改编码格式
ALTER TABLE USER DEFAULT CHARACTER SET utf8;
-
再次查看表
show create table user; sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) CHARACTER SET latin1 NOT NULL, `gender` varchar(5) CHARACTER SET latin1 DEFAULT NULL, `age` int(11) DEFAULT NULL, `address` varchar(32) CHARACTER SET latin1 DEFAULT NULL, `qq` varchar(20) CHARACTER SET latin1 DEFAULT NULL, `email` varchar(50) CHARACTER SET latin1 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ```
-
依次修改:
-
此时表的编码格式已经改变,但是列的编码格式显示为Latin1
-
依此修改列的编码格式:
ALTER TABLE USER CHANGE NAME NAME VARCHAR(20) CHARACTER SET utf8; ALTER TABLE USER CHANGE gender gender VARCHAR(5) CHARACTER SET utf8; ALTER TABLE USER CHANGE address address VARCHAR(32) CHARACTER SET utf8; ALTER TABLE USER CHANGE qq qq VARCHAR(20) CHARACTER SET utf8; ALTER TABLE USER CHANGE email email VARCHAR(50) CHARACTER SET utf8;
-
-
再次查看,问题解决!!!
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `gender` varchar(5) DEFAULT NULL, `age` int(11) DEFAULT NULL, `address` varchar(20) DEFAULT NULL, `qq` varchar(20) CHARACTER SET latin1 DEFAULT NULL, `email` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
-
拓展资料
- latin1:
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0xF之间是控制字符,0xA0-0xFF之间是文字符号。
-
本文用到的sql语句:
-
查询某个数据库的字符集:查询某个数据库的创建语句
show create database 数据库名称;
-
修改数据库的字符集
alter database 数据库名称 character set 字符集名称;
-