【问题标题】:MySQL JavaScript query replaces last digits of a number with 0MySQL JavaScript 查询用 0 替换数字的最后一位
【发布时间】:2020-11-09 10:11:59
【问题描述】:

我有这段代码(如下所示)连接到数据库,然后运行 ​​SQL 查询,该查询选择“id”列中的所有值(bigint 雪花 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)

【问题讨论】:

  • 这看起来是某种舍入/精度错误。
  • 尝试将数字转换为 BigInt:SELECT id FROM CAST(xplevel AS UNSIGNED) WHERE...
  • @ZephDavies 使用 SELECT CAST(id AS CHAR) AS id FROM . . . 有效!

标签: javascript mysql replace output digits


【解决方案1】:

这是 JavaScript IEEE754 编号的限制。

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

let a = 685325127373553689
a
685325127373553700 //prints rounded value

要在 JS 中处理此类数据,您需要禁用自动转换为数字并使其以字符串形式返回数据。或者将其转换为新的 BigInt 类型,或者使用一些 3rd-party 库进行大数处理(Extremely large numbers in javascript)。

【讨论】:

  • 谢谢!使用SELECT CAST(id AS CHAR) AS id FROM . . . 将其转换为字符串就像一个魅力。
  • 让 MySQL 转换数据类型来愚弄 JS 是很肮脏的 :) 我最好寻找如何在 JS 端解决它的选项。但无论如何,如果它有效,那为什么不呢。
猜你喜欢
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多