报错日志:
java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94‘ for column  at row 1_数据库
报错原因:
数据中含有Emoji表情字符,通常情况,Mysql数据编码格式为“utf-8”,对于汉字来说足够;Mysql中utf8占3个字节,但是,3个字节对于表情符号是不够的,需4个字节;此时使用utf8,会出现‘\xF0\x9F\x8D\x83\xF0\x9F’的问题。

解决办法:

  • 1.修改Mysql数据库编码

    utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。
    第一步:修改mysql的配置文件mysql/bin/my.ini, 添加如下内容

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect=‘SET NAMES utf8mb4’

第二步:重启数据库
linux输入命令:service mysql restart
windows输入命令:net stop mysql 和 net start mysql

第三步:修改数据表的编码为utf8mb4
在改动的数据库那,执行查询语句:ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4;

  • 2.代码中对4个字节的字符进行转换

转换效果:

java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94‘ for column  at row 1_数据库_02

代码:

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * @author 在下令狐
 * @date 2020/11/3
 **/
public class EmojiTransferUtil {

    /**
     * @Description 将字符串中的emoji表情转换成可以在utf-8字符集数据库中保存的格式(表情占4个字节,需要utf8mb4字符集)
     */
    public static String emojiEncode(String str)  throws UnsupportedEncodingException {
        String patternString = "([\\x{10000}-\\x{10ffff}\ud800-\udfff])";

        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while(matcher.find()) {
            try {
                matcher.appendReplacement(
                        sb,
                        "[["
                                + URLEncoder.encode(matcher.group(1),
                                "UTF-8") + "]]");
            } catch(UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

    /**
     * @Description 还原utf8数据库中保存的含转换后emoji表情的字符串
     */
    public static String emojiDecode(String str) throws UnsupportedEncodingException {
        String patternString = "\\[\\[(.*?)\\]\\]";

        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(str);

        StringBuffer sb = new StringBuffer();
        while(matcher.find()) {
            try {
                matcher.appendReplacement(sb, URLDecoder.decode(matcher.group(1), "UTF-8"));
            } catch(UnsupportedEncodingException e) {
                throw e;
            }
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

    public static void main(String[] args) throws UnsupportedEncodingException {

        System.out.println("decode emoji " +  emojiDecode("[[%F0%9F%8D%80]]"));

        System.out.println("encode emoji " +  emojiEncode("\uD83C\uDF40"));
    }
}