我不确定这个理论是否成立,但是可以使用一些 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 我不确定,但作为一种内部存储格式,我会猜测一个假设有 4 个小数位的有符号 8 字节整数。