Emoji 导致的bug

TMaize 于 2018-12-25 发布

起因

最近有部分用户反馈网页报错,看了下后台日志发现有如下记录

java.sql.SQLException: 
Incorrect string value: '\xF0\x9F\xA4\x96' for column 'nickname' at row 1

网上搜了下说是 MySQL 的 utf8 存储不了 Emoji 表情,突然明白了错误的原因

网页在完成微信授权登录后会把用户的信息存储到数据库,其中就包括昵称,openid,地理位置等信息。原因肯定就是用户昵称中含有 Emoji 表情了

解决

知道了原因,问题也就容易解决了。MySQL 的 utf8 是 3 个字节,使用 utf8mb4 就行了,Must Be 4 Byte。。。。

1. 修改 MySQL 默认字符集

防止以后再出问题,修改为默认字符集为utf8mb4

vi /etc/my.cnf
# 配置完毕重启下
systemctl restart mysqld

01

修改完毕后可以查询下,没有变化再 set 下

show variables like 'character%';

-- set character_set_client='utf8mb4';
-- set character_set_connection = 'utf8mb4';
-- set character_set_results = 'utf8mb4';

02

2. 修改对应表的字段的类型

用 sql 修改或者用其他工具,这里直接使用 Navicate 在设计表里面直接修改修改字段的字符集

排序规则没什么要求,一般都是 utf8mb4_unicode_ci 和 utf8mb4_general_ci

ALTER TABLE bc_wx_user MODIFY nickname varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

03

3. 修改 jdbc 连接的参数

添加 useUnicode 参数

jdbc:mysql://127.0.0.1:3306/bc?autoConnect=true&useUnicode=true&characterEncoding=UTF8&useSSL=false