【问题标题】:Large float values are lost when inserted into SQL Server using Sequelize使用 Sequelize 将大浮点值插入 SQL Server 时会丢失
【发布时间】: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.

【问题讨论】:

标签: sql-server floating-point sequelize.js tedious node-mssql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是给我的。运行应用程序,并在 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
    

    【讨论】:

    • 谢谢。很奇怪,我在网上没有发现其他提及这一点。正如你所做的那样,我发布了我的第二次编辑。
    猜你喜欢
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多