2

我正在尝试使用 knex.js 从 express.js 控制器向表中插入几行:

yield knex.withSchema(MySchema).insert(something).into('MyTable');

但我收到此错误:

Error: parseLengthCodedNumber: JS precision range exceeded, number is >= 53 bit: "18446744073709551615"

'something' 变量是来自另一个表的一组行,它们的 id 为负数:

'-2', '552', 'something1', NULL, '-2', '1', '0000-00-00 00:00:00', '2020-03-31 14:27:32'
'-1', '552', 'something2', NULL, '-1', '0', '0000-00-00 00:00:00', '0000-00-00 00:00:00'

我的数据库是 MariaDB 10.3.21,我使用的是 knex 0.12.9

有任何想法吗?

4

1 回答 1

0

我相信 MySQL.increments()会默认为unsigned. 我还没有测试过,但我希望尝试插入负整数会导致溢出(有关确切行为,请参阅MySQL 整数溢出)。这似乎导致了一个大于 JavaScript 的正整数MAX_SAFE_INTEGER

如果您绝对必须有负 ID,您可以通过将表设置为使用有符号整数作为主键、导入数据、然后将自动增量起始值设置为大于数据中表示的最高 id 的值来解决它。我想您所有的表都需要有符号整数作为 ID,因此您可以将其与同类进行比较。

于 2020-04-04T23:17:36.707 回答