MySQL: Incorrect string value: '\xF0\xA4\xBD\x82'分析解决

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

一、问题由来

今天应用报错:

### Error updating database.  Cause: java.sql.SQLException: Incorrect string value:
 '\xF0\xA4\x9E\x8F",...' for column 'message_content' at row 1

二、初次分析

我们可以看到xF0xA4x9Ex8F是4字节很可能就是utf8mb4中某些生僻字的编码。我们将表更改为utf8mb4后还是报错。所以第一步一定要将字段或者表修改为utf8mb4如下语句

alter table test101 convert to character set utf8mb4;
or
alter table test101 change `name` `name` varchar(20) CHARSET utf8mb4 DEFAULT NULL ;
注意:这个语句是copy算法会受到MDL LOCK的影响完全堵塞,不是online ddl如下:
mysql> alter table test204 algorithm=inplace, change `name` `name` 
varchar(20) CHARSET utf8 DEFAULT NULL ;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

三、详细分析

随后当然报错还在继续,然后我简单描述一下我的分析的过程。具体知识见如下文章:

关于ORACLE和MYSQL中文字符乱码的根源剖析]
http://blog.itpub.net/7728585/viewspace-2086271/ 

我们当前环境为:

  • 客户端入库字符集 utf8mb4
  • 转换字符集 utf8
  • 存储端字符集utf8mb4

对于这种情况的设置,对已某些生僻字比如:

insert into test204 values('𤽂');

(𤽂)的其utf8mb4编码为:
image.png

就需要将四字节的0Xf0a4bd82编码转换为utf8显然是不可能的。因为utf8根本不认识而且还是三个字节所以报错如下:

[SQL] 
insert into test204 values('𤽂');
[Err] 1366 - Incorrect string value: '\xF0\xA4\xBD\x82' for column 'name' at row 1

为此实际上我们只需要做一个操作就是不做转换及

set names utf8mb4;

这样环境如下:

  • 客户端入库字符集 utf8mb4
  • 转换字符集 utf8mb4
  • 存储端字符集utf8mb4
insert into test204 values('𤽂');
[SQL] 
insert into test204 values('𤽂');
受影响的行: 1
时间: 0.218s

插入成功。我们读取数据文件二进制进行底层验证取到的数据如下:
image.png
红色部分为('𤽂')这个字的十六进制编码。没有问题数据入库完成。

作者微信:
微信.jpg

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
12 0
|
3月前
|
关系型数据库 MySQL Serverless
高顿教育:大数据抽数分析业务引入polardb mysql serverless
高顿教育通过使用polardb serverless形态进行数据汇总,然后统一进行数据同步到数仓,业务有明显高低峰期,灵活的弹性伸缩能力,大大降低了客户使用成本。
|
3月前
|
关系型数据库 MySQL 索引
【MySQL 解析】Hash索引和B+树索引对比分析
【1月更文挑战第11天】【MySQL 解析】Hash索引和B+树索引对比分析
|
26天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
95 0
|
2月前
|
关系型数据库 MySQL Docker
MySQL 5.7 timestamp类型设置default value为'0000-00-00 00:00:00'报错的解决方法
MySQL 5.7 timestamp类型设置default value为'0000-00-00 00:00:00'报错的解决方法
|
15天前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
80 1
|
21天前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
|
23天前
|
SQL 关系型数据库 MySQL
【MySQL】慢SQL分析流程
【4月更文挑战第1天】【MySQL】慢SQL分析流程
|
26天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)(一)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)
30 0
|
1月前
|
存储 关系型数据库 MySQL
TiDB与MySQL、PostgreSQL等数据库的比较分析
【2月更文挑战第25天】本文将对TiDB、MySQL和PostgreSQL等数据库进行详细的比较分析,探讨它们各自的优势和劣势。TiDB作为一款分布式关系型数据库,在扩展性、并发性能等方面表现突出;MySQL以其易用性和成熟性受到广泛应用;PostgreSQL则在数据完整性、扩展性等方面具有优势。通过对比这些数据库的特点和适用场景,帮助企业更好地选择适合自己业务需求的数据库系统。