龙空技术网

mysql存储4字节字符,emoji报错解决方法,Incorrect string value

成小同 150

前言:

当前大家对“mysql按字节截取”都比较讲究,看官们都需要知道一些“mysql按字节截取”的相关文章。那么小编也在网络上收集了一些有关“mysql按字节截取””的相关资讯,希望看官们能喜欢,大家快快来了解一下吧!

今天在使用mysql存储4字节字符,如emoji时,程序报错,在此记录一下解决方法。测试数据为"",错误如下。

Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x83' for column 'username' at row org.apache.ibatis.exceptions.PersistenceException: 

解决方法就是对4字节字符进行编码,变成单字节字符。使用时再进行解码。

编码解码代码如下。

public static String encode(String source){        if(null == source || "" == source){            return null;        }        StringBuffer sb = new StringBuffer(source.length()*3);        for(char c : source.toCharArray()){            if(c >= 0xd800 && c <= 0xdfff ){                sb.append("\\u").append(Integer.toHexString(c));            }else{                sb.append(c);            }        }        return sb.toString();    }    public static String decode(String source){        if(null == source || "" == source){            return null;        }        StringBuffer sb = new StringBuffer();        char [] cArr = source.toCharArray();        for(int i = 0 ; i < cArr.length;){            if((i+5) < cArr.length){                if(cArr[i] == '\\' && cArr[i+1] == 'u'){                    sb.append((char)Integer.parseInt(new String(new char[]{cArr[i+2],cArr[i+3],cArr[i+4],cArr[i+5]}),16));                    i = i+6;                    continue;                }else{                    sb.append(cArr[i++]);                }            }else{                sb.append(cArr[i++]);            }        }        return sb.toString();    }

来看看结果吧。

请求参数如下,username包含emoji表情字符。

编码存入数据库的结果如下,username中存储的是编码过后的字符。

解码过后的结果如下,username解码过后显示正常。

到此这个问题就解决了。

有问题欢迎反馈,大家一起交流学习!

标签: #mysql按字节截取