MySQL仅在数字较大时返回错误值

MySQL Returns Wrong Value Only When Number Is Larger

提问人:Vince 提问时间:11/7/2018 最后编辑:O. JonesVince 更新时间:11/7/2018 访问量:501

问:

我正在编写一个具有存储值的机器人。其中之一是18个地方。我能够将这些值作为 BIGINT[20] 正确地存储到我的数据库 MySQL 中。存储的值是正确的。

当尝试获取该数字时,问题就出现了。存储在数据库内部的值是502033097630416897,但是,mysql返回的实际值是这个502033097630416900。为了进行比较,它们又来了:

502033097630416900
502033097630416897

似乎返回值要么被舍入,要么被更改。我想测试这个理论,所以我将存储在MySQL中的值更改为较小的数字,123,1234567,依此类推。返回的值实际上是正确的。出于某种原因,如果存储在MySQL中的数字太大,则返回的值不正确。我会发布我的代码进行存储,但我认为这无关紧要,因为存储的实际值是正确的。

至于调用,我有一个函数可以得到多个返回 new

Promise((success, fail) => {
    con.query(`SELECT * FROM serversettings WHERE serverId = ${serverID}`, (err, rows) => {
        switch(type){
            case "onjoin":
                success(rows[0].onjoin);

其中 type 是我想要提取的数据。任何见解都会有所帮助,谢谢!

JavaScript MySQL 节点 .js 浮点 精度

评论

0赞 Strawberry 11/7/2018
查看 meta.stackoverflow.com/questions/333952/...
0赞 Kevin B 11/7/2018
你确定这是mysql返回的值吗?或者这正是 Node.js 告诉你的数字。(提示,尝试console.log(502033097630416897))
0赞 Vince 11/7/2018
我直接记录了 rows[0].onjoin 返回的值(只有一个条目),所以它应该是返回的确切值。@KevinB
0赞 Kevin B 11/7/2018
@Vince 是的,但请尝试使用控制台自己记录它.log我作为示例进行了演示。Javascript 确实有限制,您使用的数字超出了上述限制。(console.log(Number.MAX_SAFE_INTEGER))
0赞 Kevin B 11/7/2018
要测试 mysql 的结果,请在其他上下文中运行此查询,而不是 javascript。您拥有的值作为 BIGINT 应该是安全的,因此 mysql 应该返回正确的值。是javascript无法处理它。

答:

0赞 O. Jones 11/7/2018 #1

Javascript 使用 64 位 IEEE 754 浮点数进行算术运算。在这种算术中,示例中的两个数字彼此相等;IEEE 754 仅提供大约 16 位十进制数字的精度。

要在 Javascript 中处理这些数字,您必须像使用文本字符串一样使用它们,或者使用长数字包。

如果将查询更改为

SELECT CAST(bigint_column AS CHAR) bigint_column, other, else, etc
  FROM serversettings 
  ...

您将获得字符串。