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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

一、问题由来

今天应用报错:

### 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
相关文章
|
13天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
19 0
|
13天前
|
关系型数据库 MySQL 数据挖掘
轻松入门MySQL:利用MySQL时间函数优化产品销售数据统计与分析(9)
轻松入门MySQL:利用MySQL时间函数优化产品销售数据统计与分析(9)
|
13天前
|
SQL 存储 Oracle
mysql中Group By 分析
mysql中Group By 分析
27 0
|
13天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
111 0
|
13天前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
119 1
|
13天前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
|
13天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)(二)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)
65 1
|
4天前
|
关系型数据库 分布式数据库 数据库
【阿里云云原生专栏】云原生时代的数据库选型:阿里云RDS与PolarDB对比分析
【5月更文挑战第24天】阿里云提供RDS和PolarDB两种数据库服务。RDS是高性能的在线关系型数据库,支持MySQL等引擎,适合中小规模需求;而PolarDB是分布式数据库,具备高扩展性和性能,适用于大规模数据和高并发场景。RDS与PolarDB在架构、性能、弹性伸缩、成本等方面存在差异,开发者应根据具体需求选择。示例代码展示了如何通过CLI创建RDS和PolarDB实例。
279 0
|
13天前
|
存储 关系型数据库 MySQL
MySQL 8 索引原理详细分析
了解索引的详细原则,不仅有助于优化,能把索引搞清楚的,面试中优势也会很突显。 关于数据库优化的话题,V哥觉得还有很多地方可以聊,如果你有兴趣,欢迎关注一起讨论。
MySQL 8 索引原理详细分析
|
13天前
|
SQL 关系型数据库 MySQL
【mysql】mysq优化全方面分析
【mysql】mysq优化全方面分析
20 0