【问题标题】:Is the SQL Server data type called "money" a binary-fixed-point or decimal-fixed-point type?称为“money”的 SQL Server 数据类型是二进制定点类型还是十进制定点类型?
【发布时间】:2020-02-11 10:44:47
【问题描述】:

我正在扩展一个名为Is SQL Server 'MONEY' data type a decimal floating point or binary floating point?的类似问题

接受的答案告诉我们“金钱”数据类型是定点而不是浮点类型,但没有说明它是二进制定点还是十进制定点。

我假设它是十进制定点,但我无法在任何地方找到确认。

documentation 告诉我们范围和大小,但不告诉我们底层实现。

【问题讨论】:

  • 我从未听说过binary-fixed-point。请参考这是什么意思。二进制是以一为底的,而不是以十为底的。不管是同一个号码。
  • Should you choose the MONEY or DECIMAL(x,y) datatypes in SQL Server? (TL;DR: do not use MONEY), user Anon tells us 表示“在幕后,money/smallmoney 只是一个 bigint/int 文本表示中的小数点 money是视觉上的绒毛……”
  • 最小值和最大值与 BIGINT 的值完全对应并插入了小数点并不是巧合,因为这基本上就是它的样子(SMALLMONEY 是一个 INT插入小数点)。由于比例因子是 10 的幂,它有资格作为十进制定点类型。正如链接的答案所说,MONEY 应该谨慎使用,因为它的精度是固定的(DECIMAL 计算会根据需要改变它们的精度)。
  • @samHumeniuk 。 . .有趣的。我假设它存储的值与decimals 相同。但是考虑到值的限制,它似乎是一种不同的内部格式。您可能需要深入了解 SQL Server 内部结构才能回答这个问题。

标签: sql-server sqldatatypes fixed-point


【解决方案1】:

不确定您为什么关心底层实现,但您可以将CAST 一个money 数据类型值转换为binary(8) 以查看该值的位:

DECLARE @money money;;

--same as min 64-bit signed integer (2's compliment) with 4 decimal places assumed
SET @money = -922337203685477.5808;
SELECT CAST(@money AS binary(8)); --0x8000000000000000

--same as max 64-bit signed integer with 4 decimal places assumed
SET @money = 922337203685477.5807
SELECT CAST(@money AS binary(8)); --0x7FFFFFFFFFFFFFFF

所以钱看起来是一个 64 位有符号整数,假设有 4 个小数位。精度/比例不包含在 money 的值中(它是 smallmoney 表亲)。

【讨论】:

  • 对此的旁注——尽管转换为binary 确实告诉您一些有关如何表示值的信息,但这并不是完整的故事。它恰好适用于MONEY,但不适用于DECIMAL——将它们转换为BINARY 类型包括用于精度和缩放的字节,并填充用于对齐的值,当存储在数据上时,这些都不是表示的一部分页。比例和精度是行集元数据的一部分,而不是值。 (DECIMAL 仍因其他原因占用更多空间,最突出的是单独的符号字节和不固定的二进制比例因子)。
  • @JeroenMostert,对,内存和磁盘格式随着字节序的丑陋而变化。更不用说通过导线 TDS 时的结构了。
  • 是的。我的观点是你的最后一句话实际上是错误的——精度/比例包含在值中,这不是money占用更少存储空间的原因。 (我假设您不是在谈论单个值的内存存储,因为这几乎从不相关 - 它仅在引擎解码数据页时才会发挥作用,然后是短暂的。)
  • @JeroenMostert,我不是说精度/比例包含在货币价值中吗?
  • 对不起,我需要更清楚。您说“与decimal 不同,精度/比例不包含在值中”,这意味着对于decimal,精度/比例 包含在值中,这说明了存储不同之处。它不是。包含money (decimal(19, 4)) 的最小decimal 类型占用9 个字节的存储空间,而money 的8 个字节为1,符号字节为1,值为8。精度和规模只是元数据。
猜你喜欢
  • 2012-01-14
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
相关资源
最近更新 更多