MySQL编码问题 1366ERROR

Posted by Kanon on December 12, 2017

1. cmd插入中文数据时报如下错误

mysql> insert into test1 (id, salary, name) values (6, 10, '小明');
ERROR 1366 (HY000): Incorrect string value: '\xC3\xF7' for column 'name' at row 1

凡是出现1366 ERROR都是编码不匹配的问题,我在使用Workbench时也出现过这种情况。

解决:告诉mysql我这边的文字编码是GBK(cmd默认编码是GBK)。

mysql> set character_set_client=gbk;

2. cmd查询数据时中文乱码

解决:告诉mysql希望返回的结果集编码。

mysql> set character_set_results=gbk;

3. 查看表字段存储时的编码

mysql> show full columns from 表名;

4. 查看数据库的编码

mysql> show variables like '%character%';

我们来看看没做任何修改前数据库中的编码:

可以清楚地看到对于character_set_clientcharacter_set_results都默认为utf8,由于cmd的默认编码是GBK,直接导致了mysql无法识别中文字符以及传出到cmd的中文字符乱码!!!

既然我们知道了问题出现的原因,那么接下来就是

终极大招

mysql> set names gbk;

这一招相当于既解决了中文插入的问题,也解决了显示乱码的问题。唯一的缺点就是每次连接断开后都会失效。

我们可以再来看看数据库中的编码信息:

ok,大功告成,问题已解决。

修改配置文件

有时候数据库内部的编码character_set_databasecharacter_set_server可能不是utf-8,这时候就需要去修改MySQL配置文件。

Windows系统对应的配置文件为my.ini,Linux对应的为my.cnf

在[mysqld]下面添加两行:

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci

重启mysql服务:

service mysqld restart

搞定!

注意事项: 在修改字符集之前已经建立的数据库,character_set_database值不会发生改变,往数据库中插入中文数据仍然会报1366错误,所以最好在安装完MySQL后就将字符集改成utf8,否则后续修改会较麻烦。

疑问

到了最后,我们不禁有疑问,为啥cmd和mysql的编码不同,只有中文会出现乱码,而英文却没有乱码,emmmm这里就得移步关于编码另一个的问题。 逼乎

参考资料

10分钟学会理解和解决MySQL乱码问题
在CMD中操作mysql数据库出现中文乱码解决方案
MySQL中UTF-8编码的数据在CMD命令行显示乱码解决方案
Centos7下设置mysql5.6字符集编码为utf8