Java支持emoji表情的处理方案/ Cause: java.sql.SQLException: Incorrect string value: ‘\\xF0\\x9F\\x98\\x9

mysql数据库存储emoji表情出错的解决方案

Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x98\x97\xE2\x98…’ for column ‘content’ at row 1\r\n###。。。。


问题分析:

昨天代码测试,有个单子说是评论和反馈填写emoji表情报错,记录一下。普通的字符串或者表情都是占位3个字节,数据库我们常用utf8编码格式,但是移动端的emoji表情符号占位是4个字节,普通的utf8就不够用了, 所以数据库要使用新的编码格式: utf8mb4 字符集;以下有三种解决方案供参考:


解决方法:

方案1.修改数据库编码格式 utf8mb4

首先需要到linux的数据库上,找到my.cnf配置文件,将其改为如下内容:

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
character-set-server=utf8mb4
skip-name-resolve
bind-address=0.0.0.0
[client]
#skip-name-resolve
#bind-address=0.0.0.0
default-character-set=utf8mb4
[mysql]
#skip-name-resolve
#bind-address=0.0.0.0
default-character-set=utf8mb4

数据库配置修改完成后重启数据库;
然后修改对应的字段,比如我这是评论字段content,就需要将编码格式从utf8改为utf8mb4

在这里插入图片描述


方案2::将表情的字符直接 replace,不需要对数据库编码及配置进行修改

此方案相当于删除掉了表情内容,如果用在评论这块的话,用户评论之后表情没了,用户体验会不好,所以应用的时候需要考虑一下,是否需要保存完整性;我把这个方法用在了我们项目的反馈功能上,因为反馈功能是用户反馈意见提交给我们管理后台的,所以管理后台看不到表情也基本不会影响可读性。

用法如下

如,反馈内容 content,在存入数据库之前,做一个replaceAll()的替换处理,这样存入数据库就不会有emoji字符,数据库也就不会报错了!

content = content.replaceAll("[\ud800\udc00-\udbff\udfff\ud800-\udfff]","");

完美避开,哈哈哈哈!


方案3: Base64加密处理

此方案理论上也是可行的,但是我没有验证过,就是将拿到的emoji表情编码使用Base64进行加密处理,然后存储到数据库,读取的时候再进行Base64解码,就可以恢复读取到emoji表情。

=

=

=

=

=

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44958006/article/details/108287792