【发布时间】:2018-01-23 18:13:49
【问题描述】:
我正在开发一个使用 Node.js 的 Loopback 框架开发的应用程序。我需要从 csv 读取数据并将其保存在我的 SQL Server 数据库中(我使用的是 SQL Server 2014 实例)。 csv 文件的一列包含 16 位十进制数字。我从 csv 文件中读取它们没有问题,但是当我将它们保存在数据库中时,它会更改最后的十进制数字。例如,csv 的第一行的值为“0.0059888523696288”,但在数据库中我发现“0.0059888525865972”。
我在我的javascript代码中做了一个console.log来检查数字并且它们被正确打印,所以我猜测问题发生在数据库读取数据时。
这是在我的 javascript 模型中映射的属性的定义:
"forecast": {
"type": "Number",
"required": true,
"length": null,
"precision": 53,
"scale": null,
"mssql": {
"columnName": "forecast",
"dataType": "float",
"dataLength": null,
"dataPrecision": 53,
"dataScale": null,
"nullable": "NO"
}
}
我尝试将 DB 表中的列定义更改为小数(18,16)并相应地更改模型中的定义,我再次执行了插入,但得到了相同的结果。
关于这种行为以及如何在数据库中获得正确数字的任何解释?
编辑:
我按照 cmets 中的建议进行了更多日志记录,这是一个输出示例:
从 csv 读取的值:0.0045747027551005
存储在另一个js变量中的值:0.0045747027551005
连接器输出:
loopback:connector:mssql SQL:
DECLARE @insertedIds TABLE (id INT)
INSERT INTO [dbo].[PLAN]([plan],[period],[forecast]) OUTPUT INSERTED.[id] into @insertedIds VALUES(@param1,@param2,@param3)
SELECT id AS insertId from @insertedIds
Parameters: [137,17,0.0045747027551005] +3ms
存储在数据库中的值:0.0045747025869787
即使将列更改为十进制 (28,16),我也得到了相同的输出。这很奇怪。
【问题讨论】:
-
>>>"dataType": "float"
-
>>>我尝试将DB表中列的定义更改为十进制(18,16)
-
我从数据库表中删除了数据,更改了定义并再次执行了插入,但我得到了相同的结果。
-
您可能需要更多的日志记录来进行研究。您记录了从 csv 读取的数字。在将值发送到模型之前直接添加记录值,例如使用单独的变量。然后为数据库连接器启用环回内置日志记录,您将看到发送到数据库的内容。数据类型映射在这里是一种魔法。以防万一将列创建为
decimal(28,16)。
标签: javascript sql-server node.js loopback