线上问题 - MySQL SQL state [HY000]; error code [1366]

一、问题描述

另外一个系统调用服务接口api:/xxx/create?aName=&time=&...,数据没有保存成功提示SQL state [HY000]; error code [1366]; Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1; 相信大家看到这个错误码大概就知道什么原因了。

而当在windows系统中去调用接口并使用相同的数据库,数据竟保存成功了但是数据库中查看数据aName值却是乱码。

为什么在不同的操作系统中,相同的操作截然不同的结果?

二、原因分析

1、查看服务接口api的编码

通过UrlDecode对接口api解码发现,接口使用方对接口api进行了GBK编码。

2、MYSQL字符集

SHOW VARIABLES LIKE 'character%';

线上问题 - MySQL SQL state [HY000]; error code [1366]

解决问题的方法就很明了了,将接口api进行UTF-8编码就可以解决此问题。

我们知道Windows系统默认的编码格式GBK,Linux系统默认的编码格式UTF-8。

三、MYSQL字符集修改

UTF-8 ——支持几乎所有字符

GB2312 ——是简体中文的码

GBK ——支持简体中文及繁体中文中的任何一个。

MySQL对于字符集的指定可以细化到一个数据库、一张表、一列(字段),应该用什么字符集。

在create语句中通过添加character set 参数指定相应的字符集,如果不指定,则会默认使用其上一个层级的字符集。

线上问题 - MySQL SQL state [HY000]; error code [1366]

我们可以通过修改mysql的my.cnf文件中的字符集键值,

1、在[client]字段里加入default-character-set=utf8,如下:
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set=utf8

2、在[mysqld]字段里加入character-set-server=utf8,如下:
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
character-set-server=utf8

3、在[mysql]字段里加入default-character-set=utf8,如下:
[mysql]
no-auto-rehash
default-character-set=utf8

修改完成后,service mysql restart重启mysql服务就生效。注意:[mysqld]字段与[mysql]字段是有区别的。

4、如果上面的都修改了还有乱码,在connection连接上进行编码修改

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

四、总结

1、对接口api制定详细使用说明 aName进行UTF-8编码,避免刚接触的使用者调到坑中。

2、系统中涉及编码 统一使用UTF-8。

由于本人经验有限,文章中难免会有错误,请浏览文章的您指正或有不同的观点共同探讨!

上一篇:PHP 命名空间与自动加载机制介绍


下一篇:PHP 汉字数字互转(100以内)| PHP 汉字转数字 | PHP数字转汉字