背景
- mysql 5.7.26-29 数据库,此版本数据库支持json类型数据
- 进行insert时出现异常( nested exception is java.sql.SQLException: Incorrect string value: ‘\xF0\xA2\x86\x89’ for column ‘name’ at row 1)
- 问题背景是,保存为json格式时数据正常,拆分json数据并保存为字符串时,不支持部分特殊字符并且出现。
分析
- 分析原因是:mysql的utf8格式只支持最多三个字节的单位数据表示,并不是完整意义上的utf-8编码,即utf8表示的数据范围不能完全涵盖Unicode字符集,超出的部分会造成字符串类型保存失败。
- 疑问,idea设置是utf-8文件格式,把如下数据赋值给字符串时(♈☹目录𢆉🙁🈶),也会出现超出部分不能真实展示现象。
相关方案
- 考虑到业务已上线,并且库表很多地方使用字符串格式,所以添加字符串过滤校验业务,避免json格式保存不兼容的字符。
//如果json字符串包含不兼容字符,则返回并提示
for(Matcher matcher = Pattern.compile("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]").matcher(info); matcher.find();){
return resultComponentUtil.error(ErrorCodeEnum.XMIND_USE_SPECIAL_STR.getCode(),
ErrorCodeEnum.XMIND_USE_SPECIAL_STR.getMsg()+matcher.group());
}