环境
:
mysql5.7 + CentOS release 6.5 (Final)
操作
:
执行 source /data/sql/one_player_data.sql
现象
:
1、执行source XXX.sql命令后会报错,错误如下:
ERROR 1366 (HY000) at line 1 in file: ‘/data/sql/one_player_data.sql’: Incorrect string value: ‘\xF0\x9F\x97\xBF’ for column ‘des’ at row 1
2、通过本地 navicat 单独执行sql语句不会报错。
分析
:
1、通过 file -i 确认过sql文件的编码格式为: utf-8
2、通过进入mysql后台( mysql -u root -p ), 进入后执行 SHOW VARIABLES LIKE ‘character%’;
3、同时查看成功案例,navicat中设置的表结构参数
4、再结合数据源本身为Emoji表情可知,字段转储失败的原因为特殊字符的字节数有差异。Mysql的utf8编码最多是3个字节,而Emoji表情或特殊字节是4个字节,所以会出现插入失败的情况,同时提示 Incorrect string value
针对 utf8mb4
进行说明
:
Mysql5.5.3版本之后新增了utf8mb4编码,mb4 = most bytes,其就是专门用来兼容四个字节的unicode,utf8mb4就是utf8的超集。
结论:
1、通过查看表结构编码,以及直接insert语句的正确性可知,表结构无问题;
2、通过file -i查看sql文件编码格式(utf-8),sql文件无问题;
3、通过查看mysql字符集配置及数据源本身为emoji表情,可以定位为字符集配置问题;
解决方案:
去往mysql服务器上 修改对应mysql的配置参数
a) 进入mysql安装目录,vim对应配置文件(myini 或my.cnf)
b) 添加或修改对应配置
character_set_server=utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
c) 配置修改完成后,重启mysql,并再次查看mysql字符集