sqflt8、sqlmoney 和其他本机 SQL 数据类型的二进制存储格式是什么?

2024-01-07

根据文档,可以使用以本机 SQL Server 数据格式格式化的 bcp 导入或导出本机(二进制)数据。例如 SQLFLT8、SQLFLT4、SQLMONEY 或 SQLNUMERIC。

有谁知道各种类型的数据格式是什么,或者在哪里可以找到指定这些格式的文档。例如,SQLFLT8 是存储为 IEEE 双精度数还是其他格式?

Edit:从答案来看凯夫查德斯 https://stackoverflow.com/questions/2099919/what-are-the-binary-storage-formats-for-sqflt8-sqlmoney-and-other-native-sql-dat/2100108#2100108 and Andrew https://stackoverflow.com/questions/2099919/what-are-the-binary-storage-formats-for-sqflt8-sqlmoney-and-other-native-sql-dat/2100270#2100270我顿悟了一点,在谷歌上搜索了 #define 和 typedef,看看是否能找到带有定义的 C 头文件。这产生了一个文件odbcdss.h; the answer https://stackoverflow.com/questions/2099919/what-are-the-binary-storage-formats-for-sqflt8-sqlmoney-and-other-native-sql-dat/2100642#2100642我在下面发布了该文件的一些内容,看起来很有希望。


我不确定这个理论是否成立,但是可以使用一些 SQL 和一些计算来找出类型的内部存储。我为博客上的新 datetime2 / datetimeoffset 执行此操作是为了专门获取内部二进制格式,因为我有兴趣了解它们如何获得额外的准确性。

以金钱为例

declare @test money
set @test = 12.34
select @test -- shows 12.34 as expected

declare @binaryValue binary(8)
set @binaryvalue = convert(binary(8),@test)
select @binaryvalue 

输出:0x000000000001E208

当考虑为十进制数时,即 123400,金钱存储到小数点后 4 位,因此该值将表示为 12.3400,理论上反转,十六进制中的 1 值应该是 0.0001

declare @test money
declare @binaryValue binary(8)
set @binaryvalue = 0x0000000000000001
set @test = convert(money,@binaryvalue)
select @test

输出 0.0001

接下来我要检查的是负数,

declare @test money
set @test = -12.34
select @test -- shows -12.34 as expected

declare @binaryValue binary(8)
set @binaryvalue = convert(binary(8),@test)
select @binaryvalue 

输出:0xFFFFFFFFFFFE1DF8

所以看起来它是一个有符号的 8 字节数字,因为它刚刚从 FF 中取出了数字......等等。使用 -0.0001 进行快速检查会按预期给出所有 0xFFF....FFF,而 -0.0002 按预期给出 0xFF....FFE。

我不确定这是否适用于 BCP,但作为内部存储格式,我会猜测一个有符号的 8 字节整数,假设有 4 位小数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqflt8、sqlmoney 和其他本机 SQL 数据类型的二进制存储格式是什么? 的相关文章

随机推荐