在做facebook相关工作时,将接口返回来的数据,存入数据库报错!错误内容:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F…'
先说一下原因:'\xF0\x9F\x91\xBD\xF0\x9F…'实际上是表情。例如这两个委屈的表情,实际上就是这种格式的数据。那么将表情存储到数据库的时候,如果数据库的字符集是utf-8等字符集,则不支持这种格式数据的存储。
解决办法:参考了网上的很多博客,同时也根据自己的实战经验
方法主要有两个(针对不同业务场景去选择合适的方法):
第一,修改数据库、数据库表、数据库字段的字符集
这种方法需要的硬性要求就是你的mysql数据库版本5.5以后的,同时你要看这个表情对你是不是重要的。如果你存储的是聊天记录或者评论记录,那这个表情你是一定要存储的,所以你只能用这个方法来解决问题。解决办法:如果你用的是数据库管理工具(Navicat for MySQL)/云数据库(例如阿里云的数据库啊),则直接在这些可视化的工具/网页上更改数据库、数据库表、数据库字段的字符集修改为utf8mb4即可。需要注意的是:这个修改需要重启数据库。
第二,将这些表情过滤掉
如果我只想存储有用的数据,表情对我是不重要的(例如:一个字符串里,可能有表情,有邮箱,但是我只要邮箱)。
建议做成工具方法,方便实用。
/**
* emoji表情替换
*
* @param source 原字符串
* @param slipStr emoji表情替换成的字符串
* @return 过滤后的字符串
*/
public static String filterEmoji(String source) {
if(StringUtils.isNotBlank(source)){
source = StringEscapeUtils.unescapeJava(source);//去掉转义字符 这句话具体加还是不加,看自己的代码情况吧 我是从facebook接口获取的数据,所以需要加上这句话
return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "");
}else{
return source;
}
}
参考文章:https://blog.csdn.net/u010814849/article/details/53996950