Я не уверен, верна ли теория, но выяснить внутреннее хранилище типов можно, используя некоторый 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 десятичных знака.