相信很多小朋友都遇到过这样一个问题:将表情包插入到mysql数据库中表的一个字段中,总是报错,无法找到解决问题的方法,我之前也没有遇到这个问题,可能是我的开发时间少了,没有碰到过;但是今天,客户在对项目进行测试使用的时候,客户使用微信登录小程序,一直报错,最后项目总监找到我让我帮忙处理,然后我进行了一系列操作,找到了对应时间点上的运行日志,如下:
org.springframework.jdbc.UncategorizedSQLException: ###Errorupdatingdatabase. Cause: java.sql.SQLException: Incorrectstringvalue: '\xF0\x9F\x90\xB6'forcolumn'nickname'atrow1###Theerrormayexistincom/zbkj/crmeb/user/dao/UserDao.java (bestguess) ###Theerrormayinvolvecom.zbkj.crmeb.user.dao.UserDao.insert-Inline###Theerroroccurredwhilesettingparameters###SQL: INSERTINTOeb_user ( account, pwd, nickname, avatar, phone, sex, spread_uid, spread_time, user_type, addres ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) ###Cause: java.sql.SQLException: Incorrectstringvalue: '\xF0\x9F\x90\xB6'forcolumn'nickname'atrow1
在看到这报错日志之前,我还进行自我怀疑,以为我代码有问题,是哪里写错了,结果发现总的意思就是:sql无法将'\xF\x9F\x90\xB6'这个字符串插入到字段"nickname",为啥呢?这个编码是什么鬼?是个啥图呀?找到插入的数据转化成代码,发现是一个emoji图,对!没错!就是他的问题。说明数据库的编码格式不支持emoji图,我去线上的数据库看了一下,发现数据库编码格式是”utf8mb4“,呼~~,那就没事儿。。。
但是,转念一想,我这个bug还没有解决呀!数据库编码格式utf8mb4就是支持emoji图的呀!!!什么鬼!
于是我展开了思考~~~最后想出了两种解决方案!!咳~呃也不能说是两种方案,是一种不太稳妥的方案和一种比较稳妥的方案。
一、修改项目jdbc配置,在yml文件中加入以下代码
这个方法不是很稳妥,如果在项目搭建初期的话,随便怎么改,但是如果已经上线了并且数据库连接池的配置不是和下面一样的话的话,那么建议不要采取这种做法,很容易造成损失,如果你想提前走人(离职)的话......
#设置数据库支持emoj表情包 spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource spring.datasource.dbcp2.connection-init-sqls=SET nickName utf8mb4
另外,还要在pom.xml文件中导入依赖
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.1.1</version><scope>runtime</scope></dependency>
下面来看一个比较稳妥的办法
二、java对emoji表情的编码与解码
至于这种方法呢~,使用的是JavaEmojiConverter
首先,要添加mven依赖
<dependency><groupId>com.github.binarywang</groupId><artifactId>java-emoji-converter</artifactId><version>0.1.1</version></dependency>
其次,添加以下代码:
privatestaticEmojiConverteremojiConverter=EmojiConverter.getInstance(); /*** 带有表情的字符串Emoji转义为unicode,类似🐶。* emoji--->unicode字符串** @param emoji* @return*/publicStringemojiConverter2Html(Stringemoji) { Stringresult=null; if (null!=emoji&&emoji.length() >0) { result=emojiConverter.toHtml(emoji); } returnresult; } /*** 将emojiStr转为 带有表情的字符* unicode--->emoji* @param emojiStr* @return*/privateStringemojiConverter2Unicode(StringemojiStr) { Stringresult=null; if (null!=emojiStr&&emojiStr.length() >0) { result=emojiConverter.toUnicode(emojiStr); } returnresult; } /*** 带有表情的字符串Emoji转义为关键字,类似":dog:"** @param str* @return*/publicstaticStringemojiConverter2Alias(Stringstr) { Stringresult=null; if (null!=str&&str.length() >0) { result=emojiConverter.toAlias(str); } returnresult; }
下面这种方法很稳妥,可以尝试一下!!
好,今天的经验分享就到这里,如果想要更多了解我的可以点击下方卡片关注我的公众号,jackson在等着你哟~~