Большие значения с плавающей точкой теряются при вставке в SQL Сервер с использованием Sequelize - PullRequest
0 голосов
/ 08 апреля 2020

Всякий раз, когда я пытаюсь вставить число с плавающей запятой, превышающее ~ 50k, используя секвенирование ORM, база данных заполняется чем-то другим.

Для этого значения 123456789.123456 я получаю это вставленное 11186.78219.

Некоторые другие коллеги получили другие выходы, но близкие к 11186.78219, как 11177.782191683797, для других входов. Я не уверен, на что это намекает.

Все работает нормально, когда я выполняю ту же вставку через node-mssql клиент, который также используется Sequelize внутри

Так что я проследил выполнение путь от оператора создания модели Sequelize, через 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:

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

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

Таким образом, данные поступают поврежденными. ..

Редактировать 3: Мне кажется, я нашел источник проблемы и открыл здесь проблему .

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Так что это ошибка в Sequelize v5, а исправлена ​​ в основной ветке. Я планирую также представить PR, чтобы интегрировать его в v5.

0 голосов
/ 08 апреля 2020

Это репро для меня. Запустил приложение и захватил трафик c в Профилировщике. Приложение отправлено

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
...