起因
最近有部分用户反馈网页报错,看了下后台日志发现有如下记录
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
修改完毕后可以查询下,没有变化再 set 下
show variables like 'character%';
-- set character_set_client='utf8mb4';
-- set character_set_connection = 'utf8mb4';
-- set character_set_results = 'utf8mb4';
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
3. 修改 jdbc 连接的参数
添加 useUnicode 参数
jdbc:mysql://127.0.0.1:3306/bc?autoConnect=true&useUnicode=true&characterEncoding=UTF8&useSSL=false