页面需要微信授权时,如果用户微信名称中带有emoji表情,会无法存储在数据库中。
报错:java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94’ for column ‘nickname’ at row 1
根据面向百度编程:
(1)MySQL的utf8编码只支持3字节的数据。
(2)移动端的表情数据是4个字节的字符。
(3)如果直接往采用utf-8编码的数据库中插入表情数据,Java程序中将报SQL异常。
将数据库的编码格式修改为为utf8mb4(需要mysql升级到MySQL 5.5.3以上),utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。
指令:
(1)查看原有表字段的字符集:
show full columns from 表名;
(2)修改表字符集
alter table xxxxxxTableName convert to character set utf8mb4;
建议:后期建数据库直接建mb4编码格式。
在数据库已经不方便重新创建的情况下,可以选择将emoji表情进行转义,再保存到数据库中,取出展示时再转回。
此处选用了Hutool基于Emoji-java库提供的Emoji工具实现。
// 引入依赖
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>4.0.0</version>
</dependency>
1.转义Emoji字符
String alias = EmojiUtil.toAlias("");//:smile:
2.将转义的别名转为Emoji字符
String emoji = EmojiUtil.toUnicode(":smile:");//
java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x98\x8B’ for column ‘a’ at row 1
Emoji工具-EmojiUtil
emoji-java