MariaDB JSON字段查询返回转义引号结果,求正确解析方式
问题分析与解决方法
1. 关于JSON_EXTRACT返回结果的转义问题
你看到的{"name":"string"}是HTML转义后的显示结果,并非JSON_EXTRACT本身的输出错误:
- phpMyAdmin为了避免HTML注入风险,会自动将输出中的双引号(
")转义为HTML实体",数据库实际返回的原始数据是正常的{"name":"string"}。你可以直接在MariaDB命令行执行查询语句验证,就能看到未转义的原始JSON字符串。 - 即便字段是
longtext类型(而非MariaDB原生JSON类型),只要存储的是合法JSON格式字符串,JSON_EXTRACT就能正确解析。
2. Sequelize中的正确处理方式
针对你的场景,有两种高效的处理方案:
方式一:用Sequelize的JSON类型自动映射
在定义模型时,将该字段指定为DataTypes.JSON,Sequelize会自动完成JSON字符串的解析与序列化:
const YourModel = sequelize.define('YourModel', { field: { type: DataTypes.JSON, allowNull: true } });
查询数据时,Sequelize会直接把数据库中的JSON字符串解析为JavaScript对象,无需手动调用JSON_EXTRACT。
方式二:手动解析(保留longtext类型时)
如果必须使用longtext类型存储,可通过以下两种方式处理:
- 直接查询字段值后在Node.js中手动解析:
const result = await YourModel.findOne({ attributes: ['field'] }); const parsedData = JSON.parse(result.field);
- 结合
JSON_EXTRACT查询后再解析:
const result = await sequelize.query( 'SELECT JSON_EXTRACT(field, "$") AS parsed_field FROM your_table WHERE id = :id', { replacements: { id: 1 }, type: QueryTypes.SELECT } ); const parsedData = JSON.parse(result[0].parsed_field);
关键注意事项
- 必须保证数据库中存储的是合法JSON格式字符串,否则解析过程会抛出错误。
- 若使用MariaDB原生
JSON类型(而非longtext),Sequelize的DataTypes.JSON会提供更好的适配性,无需额外处理。
内容的提问来源于stack exchange,提问作者Mohamed Aarab
相关产品推荐
相关产品推荐

