为什么小数位数的精度范围宽度有所不同?

时间:2019-03-16 14:53:41

标签: sql-server tsql

MSDN description of decimal显而易见,某些精度范围具有分配给它们的相同数量的存储字节。

Precision ranges with their respective storage size

我不明白的是,范围的大小存在差异。从5个存储字节的1到9的范围的宽度为9,而从9个存储字节的10到19的范围如何为10的宽度。那么下一个13个存储字节的范围又为9的宽度,而下一个的宽度再次为10。

由于每次存储字节增加4,所以我希望所有范围都具有相同的宽度。或者,第一个较小的可以为标牌或其他东西保留空间,但此后宽度相等。但是它又从9降到10,再到9到10。

这是怎么回事?如果存在的话,21个存储字节的精度范围是否为39-47,即模式9-10-9-10-9-10 ...?

1 个答案:

答案 0 :(得分:3)

  

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的倍数,具体取决于声明的标度)

根据声明的精度,整数的长度为481216个字节。某些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);

显示存储为

的第一行

enter image description here

第二个是

enter image description here

请注意,符号位之后的值将字节反转。 0x3B9AC9FF = 999999999