今天想创建两个简单的表,学习下union 和 union all的使用和区别,谁知在对只有两个字段,一个id,一个name的表插入数据的时候,却出现了如下错误:
ERROR 1366 (HY000): Incorrect string value: '\xE5\xA7\x9A\xE5\xAE\x87' for column 'name' at row 1
从错误信息中,大概知道应是编码的问题,但是具体是什么问题呢?如何导致的呢?
从网上资料了解到,MySQL数据库每次重新开启就会将字符串编码改为默认latin1(拉丁文),所以会导致操作中涉及中文字符会报错。
那么,碰到了这种问题该如何解决呢?
首先,登录mysql后,通过命令: show variables like '%char%'; 查看下数据库的编码:
从上图中看到character_set_database和character_set_server两个变量的值是latin1,即拉丁文。
这就会导致我们操作中文字符的时候出现编码错误。
方式一:在创建数据库之前修改character_set_database和character_set_server两个变量的值
分别敲入命令:
set chartacter_set_database = 'utf8';
set character_set_server = 'utf8';
然后再次查看character相关变量的值,敲入命令:show variables like '%char%'; :
从上图看到character_set_database和character_set_server两个变量的值已改为utf8。
然后就可以创建数据库和数据表了,再无编码错误之忧:
如果你已经创建好了数据库和数据表,在往表中插入中文字符数据的时候碰到这个问题,且不想删除表和库,该如何解决呢?下面教给你方法。(我就是这个时候碰到的ERROR 1366......)
方式二、依次修改数据库、数据表、表中varchar类型字段的编码
首先查看下数据库和数据表的编码,敲入命令:
show create database isTester; # isTester是你已经创建的数据库名
show create table t1; # t1是你在数据库isTester中创建的数据表名
从上图看到你已创建的数据库和数据表的编码都是latin1。
先修改数据库isTester的编码,敲入命令:alter database isTester character set 'utf8'; :
然后查看是否修改成功,敲入命令:show create database isTester; :
接着修改数据表t1的编码,敲入命令:alter table t1 character set 'utf8'; :
然后查看是否修改成功,敲入命令:show create table t1; :
从上图看到数据表t1的编码已改为utf8,但是name字段的编码仍是latin1,尝试插入数据还是报错,如下:
所以还需要单独对name字段设置编码,敲入命令:alter table t1 change name name varchar(20) character set 'utf8'; :
查看是否修改成功,敲入命令:show create table t1; :
如上字段name的编码已经修改,和表t1的编码一致了。
再次插入数据就可以了:
至此,ERROR 1366 (HY000): Incorrect string value: '\xE5\xA7\x9A\xE5\xAE\x87' for column ‘xx’ 编码问题解决。
参考资料:https://blog.csdn.net/weixin_44767769/article/details/90514605