будет 21 байт хранения иметь диапазон точности 39-47
Нет.2 ^ 160 = 1,461,501,637,330,902,918,203,684,832,716,283,019,655,932,542,976
- который имеет 49 десятичных цифр.Таким образом, этот гипотетический сценарий будет обслуживать диапазон точности 39-48
(так как 20-байтовое целое число не будет достаточно большим, чтобы содержать любые 49-значные числа больше этого)
Первый байт зарезервирован длязнак.
01
используется для положительных чисел;00
для отрицательного значения.
Остальное хранит значение в виде целого числа.т. е. 1.234
будет храниться в виде целого числа 1234
(или кратного 10 от этого, в зависимости от объявленной шкалы)
Длина целого числа равна либо 4
, 8
, 12
или 16
байта в зависимости от заявленной точности.Некоторые целые числа 10
могут быть сохранены в байтах 4
, однако, чтобы получить весь диапазон, это может быть переполнено, поэтому необходимо перейти к следующему шагу вверх.
и т. Д.
2^32 = 4,294,967,295
(10 цифр) 2^64 = 18,446,744,073,709,551,616
(20 цифр) 2^96 = 79,228,162,514,264,337,593,543,950,336
(29цифры) 2^128 = 340,282,366,920,938,463,463,374,607,431,768,211,456
(39 цифр)
Вам нужно использовать DBCC PAGE
, чтобы увидеть это, приведение столбца к binary
не дает представление о хранилище.Или используйте такую утилиту, как просмотрщик внутренних объектов SQL Server.
CREATE TABLE T(
A DECIMAL( 9,0),
B DECIMAL(19,0),
C DECIMAL(28,0) ,
D DECIMAL(38,0)
);
INSERT INTO T VALUES
(999999999, 9999999999999999999, 9999999999999999999999999999, 99999999999999999999999999999999999999),
(-999999999, -9999999999999999999, -9999999999999999999999999999, -99999999999999999999999999999999999999);
Показывает первую строку, сохраненную как

И вторую как

Обратите внимание, что значения после знакового бита инвертированы в байтах.0x3B9AC9FF
= 999999999