每当我尝试使用序列化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