Всякий раз, когда я пытаюсь вставить число с плавающей запятой, превышающее ~ 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: Мне кажется, я нашел источник проблемы и открыл здесь проблему .