You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用Sequelize查询数据库时数值字段全部返回字符串如何解决

解决方案

1 修正模型字段类型定义

你当前代码中所有需要返回数值的业务字段(product_category_id、product_sub_category_id、min_order_qty、business_margin、discount_percentage、stock等)均被错误定义为Sequelize.TEXT类型,Sequelize会严格按照模型定义的类型做结果转换,这是问题的核心原因。
请将上述字段的类型替换为对应数值类型,示例修改如下:

product_category_id: {
    type: DataTypes.INTEGER // 字段值如果超过INTEGER上限可替换为DataTypes.BIGINT
},
product_sub_category_id: {
    type: DataTypes.INTEGER
},
min_order_qty: {
    type: DataTypes.INTEGER
},
business_margin: {
    type: DataTypes.INTEGER
},
discount_percentage: {
    type: DataTypes.INTEGER
},
stock: {
    type: DataTypes.INTEGER
},

2 解决BIGINT默认返回字符串的驱动问题

你定义为DataTypes.BIGINT的id、user_id字段,即使模型定义正确,默认也会返回字符串。这是因为Node.js原生Number类型的精度上限为253-1,而BIGINT的精度上限为264-1,超出精度的数值直接转换会丢失精度,因此mysql等数据库驱动默认将BIGINT转为字符串返回。
如果你确认业务中BIGINT字段的取值不会超过2^53-1(9007199254740991,绝大多数业务场景都不会超出),可以在Sequelize初始化时添加以下配置,自动将BIGINT转为Number类型:

const sequelize = new Sequelize('数据库名', '账号', '密码', {
  host: '你的数据库地址',
  dialect: 'mysql',
  dialectOptions: {
    supportBigNumbers: true,
    bigNumberStrings: false
  }
})

3 临时兼容方案(不推荐)

如果暂时无法修改模型定义,可以给字段添加自定义getter,手动转换类型,示例如下:

id: {
  type: DataTypes.BIGINT,
  autoIncrement: true,
  primaryKey: true,
  get() {
    return Number(this.getDataValue('id'))
  }
}

内容的提问来源于stack exchange,提问作者Jeffin Poulose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:15:03