Node.js查询MySQL返回BigInt结果被舍入精度丢失如何解决
问题根因
该现象不是Node.js主动修改返回值,本质是JavaScript语言本身的数值精度限制导致:
JavaScript 常规Number类型为64位双精度浮点数,可安全精确表示的最大整数为2^53 - 1(即9007199254740991),你查询到的实际值946134226196123658已远超这个安全整数范围。Node.js生态下常用的MySQL驱动默认会将数据库返回的BIGINT类型值自动转换为JS的Number类型,转换时超出精度范围的数位会丢失,最终出现末尾数字被舍入为0的偏差。
解决方法
你可以任选以下一种方案修复问题:
- 调整数据库连接配置,开启大数字支持
初始化数据库连接时,加上supportBigNumbers: true和bigNumberStrings: true两个配置项,驱动会把BIGINT类型的值以字符串格式返回,从根源上避免数值转换的精度丢失,配置示例:
配置生效后,拿到的字段值是和数据库存储内容完全一致的字符串,如果后续需要对这个值做数值运算,可以直接用JS原生的const sql = mysql.createConnection({ host: '数据库地址', user: '数据库用户名', password: '数据库密码', database: '目标库名', supportBigNumbers: true, bigNumberStrings: true });BigInt()方法把字符串转成BigInt类型再计算。 - 查询时显式将BIGINT字段转为字符串
如果不想修改全局连接配置,可以在写SQL语句的时候,用CAST函数把目标BIGINT字段显式转换成字符串返回,示例代码:
这种写法返回的结果同样是无精度损失的字符串,不需要额外调整驱动配置。let query = `SELECT CAST(transcriptchannel AS CHAR) AS transcriptchannel FROM guilds WHERE guild_id = 933323734322913301;`
内容的提问来源于stack exchange,提问作者Felaxocraft
相关产品推荐
相关产品推荐

