当前位置:网站首页>解决一个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);
}
边栏推荐
- 基于ABP实现DDD--仓储实践
- WSL安装图形界面并通过xrdp/X-Launch访问
- It is enough for MySQL to have this article (disgusting typing 37k words, just for Bojun!!!)
- The most complete Redis basic + advanced project combat summary notes in history
- 不用bs4的原因居然是名字太长?爬取彩票开奖信息
- ClickHouse to create a database to create a table view dictionary SQL
- 【云驻共创】HCSD大咖直播–就业指南
- Solve npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead
- MySQL user authorization
- A simple rich text editor
猜你喜欢
随机推荐
proxy反向代理
MySQL Soul 16 Questions, How Many Questions Can You Last?
Learning about XML (1)
ThinkPHP high imitation blue play cloud network disk system source code / docking easy payment system program
MySQL索引常见面试题(2022版)
宁波中宁典当转让29.5%股权为283.38万元,2021年所有者权益为968.75万元
d使用among的问题
ArrayList扩容机制分析
MySQL删除表数据 MySQL清空表命令 3种方法
mysql创建表
WinDbg实践--入门篇
Collapse legacy apps
Jetson AGX Orin 平台关于c240000 I2C总线和GMSL ses地址冲突问题
TCP 连接 三次握手 四次挥手
Navicat cannot connect to mysql super detailed processing method
The mysql time field is set to the current time by default
PhpMetrics 使用
【Untitled】
The Road to Ad Monetization for Uni-app Mini Program Apps: Rewarded Video Ads
Installation and use of cnpm