【发布时间】: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