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

为什么Node.js中查询MySQL的Double类型字段返回值为字符串类型

问题原因

mysql2 默认会将 MySQL 中的 DOUBLE、DECIMAL 等可能存在精度溢出风险的浮点类型字段转换为 JavaScript String 类型返回,目的是避免直接转成 Number 时出现精度丢失问题,而 INT 类型因为长度在 JS Number 安全范围内,所以默认直接返回 Number 类型。


解决方案

你有两种方案可选,优先推荐第一种,性能最高,完全适配百万级数据的处理需求,无额外转换开销:

方案1:配置 decimalNumbers 参数

创建数据库连接/连接池时,添加 decimalNumbers: true 配置项即可实现驱动层面自动将 DOUBLE、FLOAT、DECIMAL 类型转换为 JS Number 类型,无需后续手动遍历转换。

const mysql = require("mysql2");
// 创建连接时添加配置
const connection = mysql.createConnection({
  host: "你的数据库地址",
  user: "用户名",
  password: "密码",
  database: "数据库名",
  // 新增以下配置
  decimalNumbers: true
});

配置完成后你原有查询逻辑不需要做任何修改,rows[0].price 就会直接返回 Number 类型。

方案2:自定义 typeCast 转换规则

如果你只需要对部分 DOUBLE 字段做转换,其他字段保持默认规则,可以自定义类型转换逻辑:

const connection = mysql.createConnection({
  host: "你的数据库地址",
  user: "用户名",
  password: "密码",
  database: "数据库名",
  typeCast: (field, next) => {
    // 仅处理DOUBLE类型字段
    if (field.type === 'DOUBLE') {
      return Number(field.string());
    }
    // 其他类型走默认转换逻辑
    return next();
  }
});

注意事项

  • 若你存储的 DOUBLE 字段数值精度超过 JS Number 可精确表示的范围(即整数部分超过 2^53 -1),直接转换会有精度丢失风险,对精度要求极高的场景建议保留字符串类型自行处理。
  • 你原有代码直接拼接请求参数到 SQL 语句存在 SQL 注入风险,建议改用参数化查询:
const q = `SELECT time, price FROM price_table WHERE symbol=? LIMIT 1`
connection.query(q, [req.params.symbol], (error, rows) => {
  // 原有逻辑
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 21:39:02