版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
在使用MySQL插入中文字符时,出现报错
ERROR 1366: 1366: Incorrect string value: '\xE6\x87\x82' for column 'username' at row 1
分析:
这里报错的原因是你要插入的一个中文字段报错
所以这里是你的字段编码方式与你的 传递的字符集 编码方式不匹配
这里中文字符一般用utf8 或 gbk
-
查看表中每个字段的编码方式
show full columns from 表名;
这里会发现我们想插入的字段username 是latin1 编码,非utf8 和 gbk
所以这里我们只需通过 -
更改字段编码方式
alter table 表名 change 字段名 字段名 字段数据类型 character set 字符编码方式;
这里建议字符编码方式都改为utf8,因为utf8 兼容性在很多平台上会更好。
所以在这里是alter table user change username username varchar(16) character set utf8;
更改后再用上述方式查询:
发现username 字段编码变为 utf8
就可以解决这个问题了
也就你想哪个字段插入中文字符就查看一下他的字符编码是不是latin1
如果是,就把它改为utf8 或者 gbk
原因:
是在创建数据库是没有指定数据库的编码模式,所以默认的编码方式为latin1。
-
查看指定数据库的编码方式
show create database 数据库名;
查询后会出现:CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */
这里会发现 character set 为 latin1
-
更改数据库编码方式
alter database 库名 charset = 编码方式;
-
查看指定表的编码方式
show create table 表名;
查询后会出现
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(16) DEFAULT NULL, `password` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
这里也会发现 charset 为 latin1
-
更改表的编码方式
alter table 表名 charset = 编码方式;
注: 通过这个方式改变表的编码方式只能决定这个再次增加加字段时的字段编码方式,而无法影响已经建好的字段。
所以这个时候再次查询表的编码方式时:CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(16) CHARACTER SET latin1 DEFAULT NULL, `password` varchar(16) CHARACTER SET latin1 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
可以看到表的编码方式变为了utf8
而username , password 字段后则加上了 latin1
说明这两个更改前已经建好的字符字段只更改表的编码方式影响不了它们;
注: 当字段的编码方式与表的编码方式相同时,不会显示该字段的编码方式。所以最终都是要通过
alter table 表名 change 字段名 字段名 字段数据类型 character set 字符编码方式;
来更改字段的编码方式
建议:在创建数据库以及创建表的时候后面都加上charset - utf8 就不会出现这种中文字符产生的问题了;