错误信息:
Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xAA\xE3\ for column `nickname`
背景
保存一个Emoji表情至数据中时出现如标题的报错
原因
当前Mysql数据库字符集设定为:utf8,只能保存3字节的字符
emoji表情为4字节字符,保存时报错(一些特殊字符和表达式保存报错一般也是由于这个原因)
解决方案
一、 如果非得存储emoji表情。mysql5.5.3以下的升级数据库,本来就是5.5以上的直接修改字符集和排序规则,注意一定要同时把排序规则也一起修改了。
修改数据库字符集为 utf8mb4
修改表中对应字段的字符集和排序规则
二、 直接将emoji表情过滤,我还是觉得这种办法方便,毕竟重装数据库对业务有很大的影响,特别是该数据库中有别的线上项目的数据时根本不允许重装。
package org.linlinjava.litemall.wx.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 微信小程序nickname特殊字符处理,需要转义
*
* @author jacklin
* @date 2020年08月18日
*/
public class EmojiStringUtils {
/**
* 判断是否存在特殊字符串
*/
public static boolean hasEmoji(String content) {
Pattern pattern = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]");
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
return true;
}
return false;
}
/**
* 替换字符串中的emoji字符
*/
public static String replaceEmoji(String str) {
if (!hasEmoji(str)) {
return str;
} else {
str = str.replaceAll("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", " ");
return str;
}
}
}
这时候,报错已经解决了!