报错
java.sql.SQLException: Incorrect string value: '\xF0\x9D\x92\xA9'
背景
- 保存一个Emoji表情至数据中时出现如标题的报错
原因
- 当前Mysql数据库字符集设定为:utf8,只能保存3字节的字符
- emoji表情为4字节字符,保存时报错(一些特殊字符和表达式保存报错一般也是由于这个原因)
解决方案
- 修改数据库字符集为 utf8mb4
吐槽
- 字符集分为数据库级别,表级别,字段级别三个级别;
- 由于这个服务是一个很老的核心服务,针对方案是最小最稳妥的改动来修复问题,所以我们采用的是仅仅修改字段级别的字符集为utf8mb4,表级别为utf8保持不动,库级别的下面再说。
- 因为在自己电脑上进行DEMO预演过,本来以为很简单,一个SQL的事就解决问题,结果。。。
遭遇坎坷历程
1. 修改字段的字符集为utf8mb4后,插入表情时,报错依旧
怀疑是不是仅修改字段级别字符集无用,数据库级别字符集也需要修改,于是对比了本地数据库和运行环境数据库的字符集
查看数据库级别字符集SQL: show variables like '%char%';