您的位置:首页 > 数据库

让musql数据库支持表情存入

2017-11-02 00:00 169 查看

需求:表情存入数据库

原因:uft8最多可以存储占3个字符的数据,而emoji表情数据是四个字符,因此mysql的utf8无法存储会报错

解决方法

mysql5.5.3以前版本

1.urlencode转换(缺点:每次存入和取出都要加密和解密,而且一个字符经过处理后变成了12字节)

2.base64加密(缺点:每次存入和取出都要加密和解密,而且一个字符经过处理后变成了6字节)

emoji表情的正则表达式

各种语言的字符串替换方法("[\\x{10000}-\\x{10ffff}\ud800-\udfff]", "");


mysql5.5.3以后版本

1.上面的加密解密同样可以用

2.修改数据库字符集utf8mb4,这个字符集是支持表情存入的

注意:数据库字符集,表字符集自动字符集,当你发现所有字符集都改了,还是不行,那么请你检查下character_set_server utf8mb4 (让数据库允许表情存入---需要重启数据库)

标签转换

/**
* @Description 将字符串中的emoji表情转换成可以在utf-8字符集数据库中保存的格式(表情占4个字节,需要utf8mb4字符集)
* @param str
*            待转换字符串
* @return 转换后字符串
* @throws UnsupportedEncodingException
*             exception
*/
public static String emojiConvert1(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) {
LOG.error("emojiConvert error", e);
throw e;
}
}
matcher.appendTail(sb);
LOG.debug("emojiConvert " + str + " to " + sb.toString()
+ ", len:" + sb.length());
return sb.toString();
}

/**
* @Description 还原utf8数据库中保存的含转换后emoji表情的字符串
* @param str
*            转换后的字符串
* @return 转换前的字符串
* @throws UnsupportedEncodingException
*             exception
*/
public static String emojiRecovery2(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) {
LOG.error("emojiRecovery error", e);
throw e;
}
}
matcher.appendTail(sb);
LOG.debug("emojiRecovery " + str + " to " + sb.toString());
return sb.toString();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息