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处理().
我有连接到数据库的代码(如下所示),然后运行 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处理(