【发布时间】:2020-06-15 14:49:57
【问题描述】:
每当我尝试使用 sequelize ORM 插入一个大于 ~50k 的浮点数时,数据库都会填充其他内容。
对于这个值123456789.123456 我得到这个插入11186.78219。
其他一些同事得到了不同的输出,但接近11186.78219,如11177.782191683797,其他输入。我不确定这暗示了什么。
当我通过 node-mssql 客户端执行相同的插入时,一切正常,Sequelize 内部也使用了该客户端
所以我追踪了从 Sequelize 模型的 create 语句到 node-mssql 的执行路径,再到乏味的,直到 node.js 网络请求库,只是为了看到我的初始输入编号始终保持不变。
但是,在发送请求之后,发生了一些事情,并且数据库收到了不同的值。
直接在数据库上设置一个大值并通过 Sequelize 检索它也可以正常工作。
我创建了this repo 看看你们中是否有人可以复制它。
编辑:我想我应该澄清一下我如何使用 Sequelize :)
这是一个失败的示例用户模型和创建:
const User = sequelize.define('User', {
networth: {
type: DataTypes.FLOAT,
// none of these work
// type: DataTypes.FLOAT(20, 5),
// type: DataTypes.DECIMAL(20, 5),
// type: DataTypes.DOUBLE,
},
}, {
timestamps: false,
});
User.create({ networth: 123456798.123456 });
这个node-mssql 的例子虽然有效:
await pool.request()
.input('networth', sql.Float, float_value)
.query(`insert into users (networth) values (@networth)`)
编辑 2:我从 SQL Server Profiler 中获取了一些数据,显示了 Sequelize 和 node-mssql 调用之间的差异:
节点-mssql:exec sp_executesql @statement=N'insert into users (networth) values (@networth)',@params=N'@networth float',@networth=123456798,123456
续集:@987654336@
所以数据确实损坏了......
编辑3:我想我找到了问题的根源并打开了一个问题here.
【问题讨论】:
-
这可能需要用 Sequelize 解决:github.com/sequelize/sequelize/issues
-
是的。我已经向他们提出了问题github.com/sequelize/sequelize/issues/12086
标签: sql-server floating-point sequelize.js tedious node-mssql