【问题标题】:SQL Server decimal scale length - can be or has to be?SQL Server 十进制长度 - 可以还是必须?
【发布时间】:2013-03-28 08:49:57
【问题描述】:

我对 SQL Server 2008 R2 中的 DECIMAL(可能还有 NUMERIC)类型有一个非常简单的疑问。

MSDN 说:

(比例) 小数点右侧可以存储的最大小数位数。 Scale 必须是从 0 到 p 的值。

我是这样理解的:

  • 如果我有 DECIMAL(10, 5) - 我可以存储 12345.12345 或 12345678.91。
  • 如果我有 DECIMAL(5, 5) - 我可以有 12345 或 1234.5 或 1.2345 等...

清楚吗?

但我收到此错误消息:

SELECT CAST(2.8514 AS DECIMAL(5,5))

将数值转换为数值数据类型时出现算术溢出错误。

我认为 5,5 意味着我最多可以有 5 位数字,并且最多可以有 5 个小数点。

我试过了:

SELECT CAST(12.851 AS DECIMAL(6,5)) - overflows too

然而

SELECT CAST(1.23456 AS DECIMAL(6,5)) - is OK.

那么真相是什么?

DECIMAL(a,b) 说我最多可以有 a 位数,其中只有 b 位在小数点的右边(小数点的左边还有 a-b)?

我对到处复制的文档中的声明感到非常困惑。请花点时间给我解释一下这个简单的事情。

非常感谢!

【问题讨论】:

  • DECIMAL(5,5) 表示:总共 5 位数字,其中 5 位在 小数点之后 - 所以基本上这不是一个有效数字...DECIMAL(10,5) 表示:总共 10 位数字,其中 5 位 在小数点之后(因此在小数点之前也有 5 位)。这不是小数点后的 CAN BE - 它是 ARE AFTER 小数点规范
  • @marc_s 我相信这正是 OP 感到困惑的原因:documentation 只使用“can”这个词,所以还不清楚十进制(5,5)在后面“保留”5 位数字小数点,无论您是否“使用”它们。当然,对于更倾向于数学的人来说,这可能是显而易见的(我不是其中之一)。
  • @Pondlife 关于文档令人困惑,您实际上是对的。早在 2013 年,我向 MSDN 提交了一份错误报告,他们将其更改为我在 stackoverflow.com/questions/12207222/… 中建议的措辞。

标签: sql-server decimal scale precision


【解决方案1】:

(对我而言)最容易想到的方法是精度是总位数,其中比例是小数点右侧的位数。所以DECIMAL(p,s) 表示点左侧的p-s 数字,以及点右侧的s 数字。

这解释了您看到的所有转换错误:2.8514 不能是 decimal(5,5),因为 p-s = 0; 12.851 不能是 decimal(6,5),因为 p-s = 1 等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 2018-02-04
    • 2012-05-11
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多