微信 Emoji 表情存储到 MySql 中乱码的问题

最近在做微信相关的项目,自然绕不过 Emoji 表情这个问题,简单的存储直接报错: Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x80' for column 'data' at row 1

这个错误的原因是由于字符集不支持造成的,因为 Emoji 表情是4个字节,而 MySql的 utf8 编码最多3个字节,所以导致数据插入失败。

修改 MySql 以支持 Emoji 表情

如果想让 MySql 直接存储 Emoji 表情,则需要字符集为 utf8mb4,这里需要注意的是,修改字符集不仅仅需要修改这个字段的字符集,而是 database、table、column 三者的字符集全部要修改。切换中主要考虑的是需要对 MySql 进行重启,如果有线上服务在运行,这个方法就比较麻烦,有需要的可以参考这篇文章 mysql/Java服务端对emoji的支持

通过 Java 代码不修改 MySql 以支持 Emoji 表情

使用 GitHub 上面的一个项目 emoji-java

这个项目的大致意思就是,给每个 Emoji 表情一个代替的字符(这里叫别名,aliases),存入之前,先把表情转换成别名,再存入 MySql 中,而从 MySql 中读取的时候也通过这么一个过程将别名再转换成 Emoji 表情。

引入依赖

<dependency>
  <groupId>com.vdurmont</groupId>
  <artifactId>emoji-java</artifactId>
  <version>4.0.0</version>
</dependency>

将 Emoji 转换为别名

String result = EmojiParser.parseToAliases(data);

将别名转换为 Emoji

String data = EmojiParser.parseToUnicode(result);

案例 Demo

在测试中,我们就可以发现:

  • 保存的时候 测试😀 已经被转换成了 测试:grinning:,而存入 MySql 中正常

    java-mysql-emoji-save-1.jpg

  • 读取的时候 测试:grinning: 又被转换回了 测试😀 ,读取也可以正常处理

    java-mysql-emoji-save-2.jpg

其他 API

该项目还提供了一些其他 API 以供使用,具体请查阅 GitHub 项目:emoji-java

参考链接

解决Emoji存储MySQL乱码问题

mysql/Java服务端对emoji的支持

发表评论

发表回复

*

沙发空缺中,还不快抢~