正如 MSDN description of decimal 所证明的那样某些精度范围分配给它们的存储字节数相同。
我不明白的是范围的大小存在差异。如何从 1 到 9 的 5 个存储字节的宽度为 9,而从 10 到 19 的 9 个存储字节的范围宽度为 10。然后下一个 13 个存储字节的范围再次具有 9 的宽度,而下一个的宽度又是 10。
由于存储字节每次都增加 4,所以我希望所有的范围都具有相同的宽度。或者也许是第一个更小的为标志或其他东西保留空间但从那时起宽度相等。但它又从 9 到 10 到 9 到 10。
这是怎么回事?如果它存在,21 个存储字节的精度范围是否为 39-47,即模式 9-10-9-10-9-10...?
最佳答案
would 21 storage bytes have a precision range of 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
关于sql-server - 为什么十进制的精度范围宽度不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55198082/