Emoji表情存入数据库报错:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F…'

    在做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

你可能感兴趣的:(数据库)