当前位置:网站首页>解决一个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);
}
边栏推荐
- 手动从0搭建ABP框架-ABP官方完整解决方案和手动搭建简化解决方案实践
- 【云驻共创】HCSD大咖直播–就业指南
- 482-静态库、动态库的制作、使用及区别
- ThinkPHP高仿蓝奏云网盘系统源码/对接易支付系统程序
- Detailed explanation of the delete problem of ClickHouse delete data
- MySQL 8.0.29 decompressed version installation tutorial (valid for personal testing)
- 3 minutes to take you to understand WeChat applet development
- About the data synchronization delay of MySQL master-slave replication
- 系统结构考点之PM2I单级网络
- matlab标量场作图
猜你喜欢

StoneDB 为何敢称业界唯一开源的 MySQL 原生 HTAP 数据库?

【零代码工具】15 款企业级零代码开发平台推荐,总有一款是你心仪的

Jetson AGX Orin 平台关于c240000 I2C总线和GMSL ses地址冲突问题

CISP-PTE Zhenti Demonstration

【云驻共创】HCSD大咖直播–就业指南

MySQL 游标

PhpMetrics usage

CISP-PTE真题演示

The mysql time field is set to the current time by default

ML之shap:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用RF随机森林+计算SHAP值单样本力图/依赖关系贡献图可视化实现可解释性之攻略
随机推荐
【导航规划】导航规划背景知识总结
mysql去除重复数据
It is enough for MySQL to have this article (disgusting typing 37k words, just for Bojun!!!)
2sk2225 Substitute 3A/1500V Chinese Documentation【PDF Data Book】
TransGAN code reproduction - Jiutian Bisheng Platform
【翻译】作为混沌网的LFX门徒的经验
MySql创建数据表
CISP-PTE Zhenti Demonstration
MySQL 8.0.29 decompressed version installation tutorial (valid for personal testing)
MySQL 5.7 detailed download, installation and configuration tutorial
MySQL Soul 16 Questions, How Many Questions Can You Last?
About the data synchronization delay of MySQL master-slave replication
系统结构考点之并行计算霍纳法则
Solve the problem of centos8 MySQL password ERROR 1820 (HY000) You must reset your password using the ALTER USER
mysql获取当前时间
Navicat连接MySQL时弹出:1045:Access denied for user ‘root’@’localhost’
2022.7.28
基于ABP实现DDD--仓储实践
qt使用动态库(DLL)
proxy反向代理