decimal 和 numeric (Transact-SQL)
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库
十进制 和 数字 是具有固定精度和小数位数的数字数据类型。 十进制 和 数字 是同义词,可以互换使用。
参数
decimal [ ( p [ , s ] ] ] 和 numeric [ ( p [, s ] ] ] ]
固定精度和小数位数。 使用最大精度时,有效值通过 -10^38 + 1
10^38 - 1
。 十进制的 ISO 同义词是 dec 和 dec(p,s)。 numeric 在功能上完全等同于 decimal 。
p (精度)
要存储的十进制数字的总数上限。 此数目包括小数点的左右两侧。 该精度必须是从 1 到最大精度 38 之间的值。 默认精度为 18。
注意
Informatica 仅支持 16 位有效位数,无论指定精度和小数位数如何。
s(小数位数)
小数点右侧存储的十进制数字位数。 从 p 中减去此数字可确定小数点左边的最大位数 。 确定位数值必须介于 0 和 p 之间,只能在指定了精度的情况下指定此值。 默认缩放是 0
,因此 0 <= s <= p
。 最大存储大小基于精度而变化。
Precision | 存储字节数 |
---|---|
1 - 9 | 5 |
10-19 | 9 |
20-28 | 13 |
29-38 | 17 |
注意
Informatica(通过 SQL Server PDW Informatica 连接器连接)仅支持 16 位有效位数,无论指定精度和小数位数如何。
转换十进制数据和数值数据
对于 decimal 和 numeric 数据类型,SQL Server 会将精度和确定位数的每个组合视为不同的数据类型。 例如,将 decimal(5,5) 和 decimal(5,0) 视为不同的数据类型 。
在 Transact-SQL 语句中,带有小数点的常量将自动转换为 numeric 数据值,而且使用必需的最小精度和小数位数。 例如,常量转换为数值,精度为5
和小数位数3
。 12.345
从 | 转换为 | 转换风险 |
---|---|---|
decimal 和 numeric | float 或 real | 精度可能丢失 |
int、smallint、tinyint、float、real、money 或 smallmoney | decimal 和 numeric | 可能的溢出 |
默认情况下,将数字转换为精度和小数位数较低的 decimal 或 numeric 值时,SQL Server 会进行舍入。 相反,如果 SET ARITHABORT
选项为 ON
,则 SQL Server 在发生溢出时引发错误。 如果仅降低精度和确定位数,不足以抛出错误。
在 SQL Server 2016(13.x)之前, 浮点 值转换为 十进制 值或 数值 仅限于精度为 17 位的值。 任何小于 5E-18
(使用科学表示法5E-18
或小数表示法0.000000000000000005
设置) 的浮点值向下舍入为 0
。 此限制不会出现在 SQL Server 2016(13.x)及更高版本中。
示例
下面的示例使用 decimal 和 numeric 数据类型创建一个表 。 值插入每个列中。 使用语句返回 SELECT
结果。
CREATE TABLE dbo.MyTable (
MyDecimalColumn DECIMAL(5, 2),
MyNumericColumn NUMERIC(10, 5)
);
GO
INSERT INTO dbo.MyTable
VALUES (123, 12345.12);
GO
SELECT MyDecimalColumn, MyNumericColumn
FROM dbo.MyTable;
结果集如下。
MyDecimalColumn MyNumericColumn
---------------- ----------------
123.00 12345.12000