一、错误提示
ERROR 1366 (HY000): Incorrect string value: ‘\xE6\x9D\x8E\xE5\x8B\x87’ for column ‘Sname’ at row 1
二、过程描述
1.创建如下表
#建立一个学生表
Create TABLE Student
(Sno CHAR(9) PRIMARY KEY not null,/*列级完整性约束,Sno是主码*/
Sname CHAR(20) not null,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
2.插入如下元组
#向学生表插入数据
insert
into Student(Sno,Sname,Ssex,Sage,Sdept)
values('201215121','李勇','男',20,'CS');
3.报错如下
ERROR 1366 (HY000): Incorrect string value: '\xE6\x9D\x8E\xE5\x8B\x87' for column 'Sname' at row 1
- 报错释义:第1行“sname”列的字符串值
\xE6\x9D\x8E\xE5\x8B\x87
不正确 - 报错原因:原因是因为已建立的数据表,默认的字符集为latin1,latin1字符集为8bit,不能表示中文,故而报错。
三、解决
1.查看表建立结构
show create table Student;
-
显示如下
-
由最后一行的描述得知,默认的表字符集编码为latin1
2.修改表字符集编码为utf8
alter table Student default character set utf8;
-
再次查看表建立结构
show create table Student;
-
显示如下
-
由最后一行的描述得知,默认的表字符集编码已经改为utf8
-
但是当再次向表中插入元组数据时,仍然报错
ERROR 1366 (HY000): Incorrect string value: '\xE6\x9D\x8E\xE5\x8B\x87' for column 'Sname' at row 1
-
原因是上述知识修改了表的字符集编码为utf8,但是属性列的字符集编码仍为latin1(如上图红色矩形框所示)
3.修改属性列的字符集编码为utf8
alter table Student change Sname Sname varchar(20) character set utf8;
-
再次查看表建立结构
-
显示如下
-
由最后一行的描述得知,属性列Sname的字符集编码已经改为默认的utf8
-
当再次向表中插入数据时,报错改成了属性列Ssex,说明刚刚改的属性列Sname的字符集编码已经通过
ERROR 1366 (HY000): Incorrect string value: '\xE7\x94\xB7' for column 'Ssex' at row 1
-
接着修改属性列Ssex的字符集编码为utf8即可
alter table Student change Ssex Ssex varchar(20) character set utf8;
-
再次向表中插入元组数据时,即可正常插入
-
如果由于其他属性列的字符集编码方式仍为latin1,导致仍然报错,那么如上方法,继续修改为utf8即可
4.如果数据表中有汉字,在建立表时,就应该指定字符集的编码方式为utf8
#建立一个学生表
Create TABLE Student
(Sno CHAR(9) PRIMARY KEY not null, /*列级完整性约束,Sno是主码*/
Sname CHAR(20) not null,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 在建表时指定字符集的编码方式为utf8后,后续即可正常插入元组数据