近日,Node.js 生态中广受欢迎的 ORM 框架 Sequelize 被曝出一项与 MariaDB 数据库的兼容性问题。自 Sequelize 6.21.5 版本起,当使用 MariaDB 作为数据库时,原本应自动解析为 JSON 对象的列,在读取后仍然保持为字符串格式。该问题直接导致 autoJsonMap 功能失效,影响了大量依赖 JSON 字段进行数据存储和查询的开发者。
问题表现:JSON 列“变性”为普通字符串
根据开发者在 GitHub 及相关技术社区的反馈,问题具体表现为:在使用 Sequelize ≥ 6.21.5 并连接 MariaDB 数据库时,定义在模型中的 JSON 类型字段(在 MariaDB 中实际以 LONGTEXT 存储),在查询结果中始终以原始字符串形式返回,而非经过 JSON.parse 自动转换为 JavaScript 对象。例如,一个存储用户配置信息的 settings 字段,本应直接返回 { theme: 'dark' } 这样的对象,却变成了 "{ \"theme\": \"dark\" }" 这样的纯字符串。
这一行为与之前版本(如 6.21.4 及更早版本)截然不同,并使得 Model.init() 中的 autoJsonMap 选项形同虚设。该选项原本用于指示 Sequelize 自动检测并解析 JSON 格式的字符串列。
根源探寻:版本升级引发的隐式变更
Sequelize 作为 Node.js 生态中最流行的 ORM 之一,其版本迭代往往伴随着对底层数据库驱动(如 mysql2、mariadb)的依赖更新。经过社区初步排查,该问题可能源自 Sequelize 6.21.5 对 MariaDB 连接器的处理逻辑调整。有开发者指出,新版本中 Sequelize 内部对 LONGTEXT 类型的识别逻辑发生了变化,将其错误归类为非 JSON 数据类型,从而跳过了自动解析步骤。
值得一提的是,MariaDB 的 JSON 列在底层存储上确实采用 LONGTEXT(或 LONGBLOB)格式,但其内部会进行 JSON 校验和优化。Sequelize 需要依靠数据库返回的元数据(如字段类型标记)来判断是否为 JSON 类型。如果驱动层没有正确传递该标记,或 Sequelize 的解析层未能正确理解,就会导致 JSON 列被当作普通长文本处理。
影响范围:依赖 JSON 字段的应用首当其冲
该问题波及了所有使用 Sequelize ≥ 6.21.5 且数据库为 MariaDB 的项目。尤其是那些在表中大量使用 JSON 字段存储半结构化数据的应用——例如内容管理系统(CMS)中的自定义字段、电子商务平台中的商品属性、配置文件存储、埋点日志等。由于 JSON 列未被自动解析,开发者必须手动调用 JSON.parse() 处理每个字段,这不仅增加了代码量,还容易因遗漏而引发运行时错误。同时,若项目从旧版本升级至新版本,且未注意到这一行为变化,可能导致生产环境出现诡异的类型错误。
社区反应:多数开发者选择降级或锁定版本
该问题在 GitHub issue 评论区引发热议。截至目前,官方尚未发布修复版本。多数受影响开发者采取了以下临时方案:
- 回退版本:将 Sequelize 版本锁定为 6.21.4 或更早,等待官方修复后再升级。
- 手动解析:在查询结果后统一对 JSON 字段调用
JSON.parse(),并在写入时确保数据为字符串。 - 改用 MySQL:部分开发者表示暂时切换到 MySQL 8.x 可规避该问题,因为 MySQL 对 JSON 列的原生支持更为完善。
- 使用 TypeScript 类型断言:忽略实际运行时类型,通过类型声明强制将字段视为对象——但这仅能骗过编译器,实际运行时仍需小心。
官方动向与未来展望
Sequelize 核心维护者已在 GitHub 上确认该问题,并标记为“bug”。根据以往经验,此类兼容性问题通常会在下一个补丁版本(如 6.21.6)中得到修复。开发者可关注 Sequelize 官方仓库的 Pull Request #16523 及相关 Issue #16489 获取最新进展。
值得一提的是,该问题也提醒我们:在维护跨数据库 ORM 项目时,不同数据库之间的细微行为差异往往是最容易被忽略的陷阱。MariaDB 虽然与 MySQL 高度兼容,但其在 JSON 类型处理、存储引擎等方面的差异仍可能带来意料之外的 bug。建议生产环境的数据库选型与 ORM 版本保持定期测试,并配置充分的回归测试用例。
小结:如果你正在使用 Sequelize 6.21.5 或更高版本连接 MariaDB,并且发现 JSON 列在读取后一直保持为字符串,请不必惊慌——这大概率是 ORM 的 bug,而非你的数据出了问题。在官方修复之前,降级至 6.21.4 是最稳妥的选择。我们将持续跟踪该问题的修复进展,并在第一时间为您更新。