MySQL案例:关于JSON的一个bug
时间:2022-07-24
本文章向大家介绍MySQL案例:关于JSON的一个bug,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
周五晚上和朋友一起去外面吃饭,本来想着不加班早点回家过周末,谁又能想到突然就接到一个电话,mysqldump逻辑备份导入时报错,具体错误为“ERROR 3144 (22032): Cannot create a JSON value from a string with CHARACTER SET 'binary'.”
下面就和大家简单分享一下这个案例,由于涉及业务数据,这里将通过自己模拟场景的方式来进行分享;关于真实场景或模拟场景分享,之前也说过,能够自己模拟复现出故障场景,往往才更加证明已经完全了解清楚其中的原理和解决办法。
案例分享
(1)创建一张含JSON列的表,并插入一条记录
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.18-log |
+------------+
1 row in set (0.00 sec)
mysql> show create table json_testG
*************************** 1. row ***************************
Table: json_test
Create Table: CREATE TABLE `json_test` (
`id` int NOT NULL,
`name` varchar(10) DEFAULT NULL,
`a` json DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> insert into json_test(id,name,a) values(1,'1','{"id":"1","name":"1"}');
Query OK, 1 row affected (0.01 sec)
(2)通过mysqldump导出该表
$ mysqldump -uroot -p --set-gtid-purged=off test json_test > json_test.sql
(3)尝试导入数据,报错如下,看起来似乎是与字符集有关
mysql> source json_test.sql
...
ERROR 3144 (22032): Cannot create a JSON value from a string with CHARACTER SET 'binary'.
...
(4)查看该SQL文件,发现里面 /*!50503 SET NAMES binary */; 这条SQL比较可疑,和报错相关
(5)进一步查阅文档,发现与官方两个bug相关,Bug #86709和Bug #88288
Bug #86709:https://bugs.mysql.com/bug.php?id=86709
Bug #88288:https://bugs.mysql.com/bug.php?id=88288
(6)尝试修改SQL文件,将 /*!50503 SET NAMES binary */; 改为 /*!50503 SET NAMES utf8mb4 */; 并导入成功,问题解决
mysql> source /tmp/backup/cdb-dki7pq4r_backup_20200828202032.sql
...
Query OK, 1 row affected (0.01 sec)
...
mysql> select * from json_test;
+----+------+--------------------------+
| id | name | a |
+----+------+--------------------------+
| 1 | 1 | {"id": "1", "name": "1"} |
+----+------+--------------------------+
1 row in set (0.00 sec)
总结
关于这个问题,我们可以通过修改SQL文件中的字符集解决;后续我也对MySQL新版本(5.7.30和8.0.20),进行了测试,已经修复该bug。
- 如何在不影响asp.net默认安全性的前提下使用ckeditor/fckeditor?
- Linux下防御DDOS攻击的操作梳理
- Android新手之旅(8) ListView的使用
- 更换Ubuntu源为国内源的操作记录
- Android新手之旅(8) ListView的使用
- CKEditor/CKFinder升级心得
- Docker容器学习梳理-Dockerfile构建镜像
- 再谈web开中几种经典的大文件上传组件
- Nginx负载均衡中后端节点服务器健康检查的操作梳理
- Linux系统下CPU使用(load average)梳理
- 基于组件的.NET技术(5)
- Silverlight与WPF中BeginInvoke的差异
- Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)
- Linux下DNS简单部署(主从域名服务器)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《JavaScript ES6 函数式编程入门经典》读书笔记
- Java9-Reactive Stream API响应式编程
- mybatis-plus增删改查以及前后端分离模式下的项目应用
- docker(常用软件安装)
- PyTorch版:集成注意力和MobileNet的YOLOv4
- 从源代码级别看懂MinIO对象存储网关的实现
- 4种主流超参数调优技术
- 一分钟学Python| 面向对象(上)
- Python 为什么不支持 switch 语句?
- 你还在认为 count(1) 比 count(*) 效率高?
- 一分钟学Python| 面向对象(中)
- uni-app自定义打包目录package.json命令配置
- 在Zeppelin中如何使用Hive
- B站真题:如何判断括号是否有效?
- (在模仿中精进数据可视化03)OD数据的特殊可视化方式