mysql字符串保存异常问题,(utf8、utf-8、Unicode编码的异同及兼容性问题)

背景

  • 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());
        }

相关资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值