MySQL JavaScript 查询将数字的最后一位替换为 0

MySQL JavaScript query replaces last digits of a number with 0

我有连接到数据库的代码(如下所示),然后运行 ​​SQL 查询,选择“id”列中的所有值(bigint snowflake ID),这些值也在写在查询中的数组。完成后,它会将结果记录到控制台。

尽管出于某种原因,它似乎对数字进行了四舍五入,或者至少用 0 替换了一些最后的数字。我正在尝试找出原因以及如何解决此问题,因此将不胜感激!

const mysql = require('mysql');
const con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "root",
  database: "botproject"
});

con.connect(function(err) {
    if (err) throw err;

    con.query("SELECT id FROM xplevel WHERE id IN (718141588043202731, 294126883694444544, 685325127373553689, 307409641262940160, 478536470081175562);", function (err, result, fields) {
      if (err) throw err;
      
    console.log(result);
 
    });

});

预期的输出将是这样的(与放入查询数组中的值完全相同):

[
  RowDataPacket { id: 294126883694444544 },
  RowDataPacket { id: 307409641262940160 },
  RowDataPacket { id: 478536470081175562 },
  RowDataPacket { id: 685325127373553689 },
  RowDataPacket { id: 718141588043202731 }
]

但我得到的实际输出是这样的:

[
  RowDataPacket { id: 294126883694444540 },
  RowDataPacket { id: 307409641262940160 },
  RowDataPacket { id: 478536470081175550 },
  RowDataPacket { id: 685325127373553700 },
  RowDataPacket { id: 718141588043202700 }
]

编辑: 请注意,当 运行 直接在 mysql 终端中查询时,它不会这样做:

mysql> SELECT id FROM xplevel WHERE id IN (718141588043202731, 294126883694444544, 685325127373553689, 307409641262940160, 478536470081175562);
+--------------------+
| id                 |
+--------------------+
| 294126883694444544 |
| 307409641262940160 |
| 478536470081175562 |
| 685325127373553689 |
| 718141588043202731 |
+--------------------+
5 rows in set (0.00 sec)

这是 JavaScript IEEE754 数字的限制。

您可以在浏览器控制台做简单的测试:

let a = 685325127373553689
a
685325127373553700 //prints rounded value

要在 JS 中处理此类数据,您需要禁用自动转换为数字的功能,并将其 return 设为字符串形式的数据。或者转换成新的BigInt类型,或者使用一些3rd方库进行large-numbers处理().