使用Sequelize插入SQL Server时,会丢失大的float值

每当我尝试使用序列化ORM插入大于〜50k的浮点数时,数据库中就会填充其他内容。

对于这个值123456789.123456,我插入了11186.78219

其他一些同事得到了不同的输出,但对于其他输入,却像11186.78219一样接近11177.782191683797。我不确定这暗示了什么。

当我通过node-mssql客户端执行相同的插入操作时,一切正常,该操作也由Sequelize内部使用

因此,我跟踪了Sequelize模型的create语句,node-mssql,乏味的代码以及到node.js网络请求库的执行路径,只是发现我的初始输入数字始终保持不变。 / p>

在发送请求之后,发生了一些事情,数据库收到了另一个值。

直接在数据库上设置一个较大的值并通过Sequelize检索它也很好。

我创建了GEORADIUS - Redis Command,以查看是否有人可以复制它。

编辑:我想我应该澄清一下我如何使用Sequelize:)

此示例用户模型和创建失败:

const User = sequelize.define('User',{
    networth: {
        type: DataTypes.FLOAT,// none of these work
        // type: DataTypes.FLOAT(20,5),// type: DataTypes.DECIMAL(20,// 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调用之间的区别:

node-mssql:exec sp_executesql @statement=N'insert into users (networth) values (@networth)',@params=N'@networth float',@networth=123456798,123456

续集:exec sp_executesql @statement=N'INSERT INTO [Users] ([networth]) OUTPUT INSERTED.* VALUES (@0);',@params=N'@0 numeric(30,15)',@0=11186.782191684157440

所以数据确实到达了坏处...

编辑3:我认为我找到了问题的根源,并且打开了一个问题this repo

zhangzhiwei1986913 回答:使用Sequelize插入SQL Server时,会丢失大的float值

它是我的复制品。运行该应用程序,并在Profiler中捕获流量。应用已发送

exec sp_executesql @statement=N'INSERT INTO [Users] ([networth]) OUTPUT INSERTED.* VALUES (@0);',@params=N'@0 numeric(30,15)',@0=11186.782191684157440

运行该应用程序后,Users表包含:

id          networth
----------- ----------------------
1           11186.7821916842
,

因此,这是master分支上Sequelize v5和it is resolved上的错误。 我计划提交一个PR,以将其也集成到v5中。

本文链接:https://www.f2er.com/2482803.html

大家都在问