Emoji表情符 - 数据库存储

一.问题

页面需要微信授权时,如果用户微信名称中带有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异常。

三.解决方法

- 方案1

将数据库的编码格式修改为为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编码格式。

- 方案2

在数据库已经不方便重新创建的情况下,可以选择将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

你可能感兴趣的:(工作日常,数据库)