MariaDB 10.2 与 MySQL 5.7 对 JSON 数据类型支持程度有什么差异?

文章导读
MySQL 5.7 采用紧凑二进制格式存储 JSON,而 MariaDB 10.2 虽支持 JSON 类型但实际存储为原始 JSON 文本串,且使用 row based replication 时不支持从 MySQL 5.7 复制包含 JSON 列的 binlog。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

MariaDB 10.2 与 MySQL 5.7 对 JSON 数据类型支持程度有什么差异?

核心结论:MySQL 5.7 采用紧凑二进制格式存储 JSON,而 MariaDB 10.2 虽支持 JSON 类型但实际存储为原始 JSON 文本串,且使用 row based replication 时不支持从 MySQL 5.7 复制包含 JSON 列的 binlog。

原因分析

MySQL 从 5.7 版本开始支持由 RFC 7159 定义的原生 JSON 数据类型,可以高效地访问 JSON 文档中的数据。相比之下,MariaDB 认为 JSON 数据类型不是 SQL 标准的一部分,为了支持从 MySQL 复制数据,MariaDB 为 JSON 定义了一个别名,实际上就是一个 LONGTEXT 列。这种底层存储机制的差异导致了两者在二进制日志兼容性和读取效率上的不同,MariaDB 从 10.2 版本开始引入了对 JSON 数据类型的支持,但实现方式与 MySQL 5.7 存在本质区别。

解决方案

在进行数据库迁移或主从复制配置时,需针对 JSON 列的特殊性进行处理:

MariaDB 10.2 与 MySQL 5.7 对 JSON 数据类型支持程度有什么差异?
  • 复制兼容性处理:若尝试使用 row based replication 从 MySQL 5.7 复制数据到 MariaDB,原生不支持包含 JSON 列的 binlog。根据 2019 年 7 月 27 日发布的技术分析,需魔改 MariaDB 10.4 分支以解析 MySQL 5.7 binlog 里的 MYSQL_TYPE_JSON 类型,否则无法就地读取包含 JSON 列的 MySQL 数据文件。
  • 数据类型映射:在 MariaDB 中创建表时,若需兼容 MySQL 5.7 的 JSON 结构,应明确其底层为 LONGTEXT。虽然 MariaDB 从 10.2 版本开始支持 JSON 数据类型,但开发者需注意其并非原生二进制存储,例如创建表语句需考虑字段类型定义差异。

注意事项

在实际生产环境中,以下问题已被用户或技术人员记录:

  • 性能基准缺失:MariaDB 声称其 JSON 实现与 MySQL 之间没有显著的性能差异,但截至 2024 年 9 月 26 日的对比资料显示,他们并没有提供基准测试数据来支持这个说法。
  • 版本对应关系:MariaDB 10.2 版本对应引入 JSON 支持,而 MySQL 早在 5.7 版本已开始支持。若项目强依赖原生 JSON 二进制存储特性,需避免直接使用 MariaDB 10.2 作为 MySQL 5.7 的无缝替代品。
  • 功能扩展差异:MariaDB 10.2 引入了 Window function、Recursive Common Table Expressions 等特性,但就 JSON 而言,双方对于数据类型的实现不指望主动做兼容层,且不支持就地写包含 JSON 列的 MySQL 数据文件。

参考来源

来源:CSDN 博客 - 10 分钟了解 MySQL5.7 对原生 JSON 的支持与用法(截至 2017 年 11 月 15 日)

来源:技术社区文章 - 魔改了下 MariaDB 支持 JSON binary(发布时间是 2019 年 7 月 27 日)

MariaDB 10.2 与 MySQL 5.7 对 JSON 数据类型支持程度有什么差异?

来源:数据库对比文章 - MariaDB 和 MySQL 全面对比:选择数据库需要考虑这几点(消息于 2024 年 9 月 26 日发布)

来源:技术知识库 - mariadb 版本对比 mysql(该信息的时间戳是 2025 年 1 月 6 日)