今天开发微信授权登录,需要保存用户昵称,发现有一个同事授权登录一直报错,查看了日志,发现日志提示:
uncategorized SQLException; SQL state [HY000]; error code [1366]; Incorrect string value
错误日志
一、原因分析
1、查看服务接口api编码
通过UrlDecode对接口api解码发现,接口使用方对接口api进行了GBK编码。
2、查看mysql数据表中对应字段
发现数据表中的编码格式是utf8的。
通过这个就可以很明显的看出来,是因为存储的数据是十六进制的字符
3、查看mysql字符集所支持的字节范围
我们可以知道utf8最大支持3个字节的字符,查看mysql官网发现,mysql5.5.3之后,新增了一个与utf-8类似的字符集,utf8mb4,并且它的编码支持4个字节每字符
二、解决方法
1、我们可以修改该字段的字符集格式为utf8mb4
2、我们可以通过修改mysql的my.cnf文件中的字符集键值,
2.1、在[client]字段里加入default-character-set=utf8,如下:
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set=utf8
2.2、在[mysqld]字段里加入character-set-server=utf8,如下:
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
character-set-server=utf8
2.3、在[mysql]字段里加入default-character-set=utf8,如下:
[mysql]
no-auto-rehash
default-character-set=utf8
修改完成后,service mysql restart重启mysql服务就生效。注意:[mysqld]字段与[mysql]字段是有区别的。
2.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。