专栏首页腾讯云数据库专家服务MySQL案例:关于JSON的一个bug
原创

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_test\G
*************************** 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。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL案例:8.0统计信息不准确?

    不管是Oracle还是MySQL,新版本推出的新特性,一方面给产品带来功能、性能、用户体验等方面的提升,另一方面也可能会带来一些问题,如代码bug、客户使用方法...

    brightdeng@DBA
  • MySQL 8.0新特性 — 不可见索引

    在MySQL 8.0中,引入了不可见索引的新特性;不可见索引,是指实际存在但不会被优化器选用的索引。有童鞋就会问,不可见索引究竟有什么用?虽然在大多数情况下,业...

    brightdeng@DBA
  • MySQL案例:一个实例无法启动的问题分析

    前几天,有位朋友微信联系我,告知一个生产数据库,在机器宕机恢复后,实例启动失败,而且该实例没有做任何的高可用、容灾、备份等,对业务影响非常大,希望能够协助排查一...

    brightdeng@DBA
  • Python编程一定要注意的那些“坑”(五)

    已发“坑”请参考Python函数默认值参数的2个坑,Python编程中一定要注意的那些“坑”(一),Python编程中一定要注意的那些“坑”(二),Python...

    Python小屋屋主
  • PHP获取数据库表中的数据插入新的表再原删除数据方法

    砸漏
  • TP踩过的坑[修改功能]前台要给input加上隐藏属性

    简单、
  • MyBatis学习总结(三)——多表关联查询与动态SQL

    假定一个员工(emp)拥有一个登录用户(user),员工与用户表之间是一对一关系:

    张果
  • 用户行为分析-埋点实时数仓实践

    此文重点讲述埋点的数据模型、数据格式、数据实时采集、加工、存储及用户关联。关于用户行为分析的概念、意义以及埋点相关的东西此文不作赘述

    大数据真好玩
  • 是时候血洗小电影网站了-Seacms SQL注入与RCE分析及实战

    海洋cms是为解决站长核心需求而设计的视频内容管理系统,一套程序自适应电脑,手机,平板,APP多个终端入口,无任何加密代码,安全有保障,是您最佳的建站工具。——...

    天钧
  • 马斯克宣传AI威胁,被Facebook AI负责人diss「胡说八道」,回怼:「Facebook真烂!」

    很多AI从业人员对他很反感,认为他在危言耸听,但因为他自己的名人身份,对AI的过度警惕和反对给实际研究工作带来了困难。

    新智元

扫码关注云+社区

领取腾讯云代金券