sql-server - 为什么十进制的精度范围宽度不同?

标签 sql-server tsql

正如 MSDN description of decimal 所证明的那样某些精度范围分配给它们的存储字节数相同。

Precision ranges with their respective storage size

我不明白的是范围的大小存在差异。如何从 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 的某个倍数,具体取决于声明的比例)

整数的长度是 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

关于sql-server - 为什么十进制的精度范围宽度不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55198082/

相关文章:

sql - OPTION(OPTIMIZE FOR UNKNOWN) 和 OPTION(RECOMPILE) 之间的主要区别是什么?

sql - 使用 TSQL SQL Server (2008 R2) 有条件地选择行

sql - 如何使用返回多个结果的子查询

由于权限问题,SQL Server 无法在数据库中创建表

tsql - SQL中获取两个值中的最小值

sql - 在该范围内每天将 "From"和 "To"日期列扩展到 1 行

sql - varchar 列上的标识键 - T-SQL

sql - 如何制作一个以用户定义的表类型为参数并在sql中返回相同的函数?

c# - SQL Server CLR 集成未按预期调用系统时间

sql-server - 如何使 FileStream 文件可供 Web 应用程序使用