为什么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
相关产品推荐
相关产品推荐

