当前位置:网站首页>解决一个Mysql的utf8编码导致的问题
解决一个Mysql的utf8编码导致的问题
2022-07-30 22:17:00 【软件开发随心记】
1、问题背景
在一个基于NLP(自然语言处理)算法分析用户诉求的系统中,使用了 Mysql作为数据库储存来自其他各系统的用户反馈,数据库编码统一设置为utf8。在运行过程中,偶尔出现数据库异常,主要表现为:Incorrect string value: ‘\xF0\x9F\x8D\x83…’ for column ‘xxx’。
2、分析问题
'\xF0\x9F\x8D\x83’的二进制以11110开头,是一个4字节的utf8字符,通过查阅相关资料,了解到Mysql的utf8编码只能支持到3字节,当存入4字节字符时,便会出现以上异常。正常情况下,英文或汉字的字符都在3字节以内编码,4字节编码的字符一般是表情符号。
3、解决问题
3.1、方式1 - 修改编码方式
utf8mb4编码是utf8编码的超集,兼容utf8,且能存储4字节的表情字符。将Mysql数据库编码格式修改为utf8mb4,JDBC连接时声明编码为utf8mb4,可以解决以上问题。
3.2、方式2 - 移除4字节字符
在我们这个系统中,由于采用NLP算法,仅基于文本分析语义,表情符号不影响最终结果,可以忽略,故可以在入库前移除4字节字符。
utf8是不定长的编码格式,1-4字节都有各自的特定格式。
1字节格式:0xxxxxxx
2字节格式:110xxxxx, 10xxxxxx
3字节格式:1110xxxx, 10xxxxxx, 10xxxxxx
4字节格式:11110xxx, 10xxxxxx, 10xxxxxx, 10xxxxxx
通过以上格式可知,只有4字节拥有11110xxx字节,所以只需要检测字节流中是否存在11110xxx字节,如果有则将该字节以及之后的3个字节删除。代码如下:
public static String remove4ByteChar(String s) {
if (s == null || s.length() == 0) {
return "";
}
byte[] bytes = s.getBytes();
List<Byte> byteList = new ArrayList<>();
for (int i = 0; i < bytes.length; i++) {
// UTF-8的4字节编码以11110开头
if ((bytes[i] & 0xF8) == 0xF0) {
i += 3;
} else {
byteList.add(bytes[i]);
}
}
bytes = new byte[byteList.size()];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = byteList.get(i);
}
return new String(bytes);
}
边栏推荐
- 微信公众号授权登录后报redirect_uri参数错误的问题
- 正则表达式语法及使用
- Py's pdpbox: a detailed introduction to pdpbox, installation, and case application
- 语言代码表
- ClickHouse删除数据之delete问题详解
- MySQL 8.0.29 decompressed version installation tutorial (valid for personal testing)
- MySQL 5.7 detailed download, installation and configuration tutorial
- navicat连接MySQL报错:1045 - Access denied for user ‘root‘@‘localhost‘ (using password YES)
- 【翻译】作为混沌网的LFX门徒的经验
- 【Untitled】
猜你喜欢

ML之shap:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用RF随机森林+计算SHAP值单样本力图/依赖关系贡献图可视化实现可解释性之攻略

Learning about XML (1)

基于ABP实现DDD--领域逻辑和应用逻辑

解决centos8 MySQL密码问题ERROR 1820 (HY000) You must reset your password using ALTER USER

When Navicat connects to MySQL, it pops up: 1045: Access denied for user 'root'@'localhost'

Uni-app 小程序 App 的广告变现之路:激励视频广告

史上最全的Redis基础+进阶项目实战总结笔记

MYSQL JDBC图书管理系统

IDEA 连接 数据库

MySQL 灵魂 16 问,你能撑到第几问?
随机推荐
系统结构考点之PM2I单级网络
2022.7.27
proxy反向代理
WSL安装图形界面并通过xrdp/X-Launch访问
ML's shap: Based on FIFA 2018 Statistics (2018 Russia World Cup) team match star classification prediction data set using RF random forest + calculating SHAP value single-sample force map/dependency c
IDEA 连接 数据库
使用LVS和Keepalived搭建高可用负载均衡服务器集群
MySQL 8.0.29 decompressed version installation tutorial (valid for personal testing)
mysql获取近7天,7周,7月,7年日期,根据当前时间获取近7天,7周,7月,7年日期
DistSQL 深度解析:打造动态化的分布式数据库
系统结构考点之并行计算霍纳法则
NEOVIM下载安装与配置
MySql统计函数COUNT详解
ClickHouse to create a database to create a table view dictionary SQL
2022.7.30
Golang 切片删除指定元素的几种方法
语言代码表
解决npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead
正则表达式语法及使用
About the data synchronization delay of MySQL master-slave replication