SQL数据类型NUMERIC
和DECIMAL
之间有什么区别?
如果数据库对待这些不同,我想知道至少如何:
此外,数据库驱动程序如何解释这些类型有什么不同吗?
答案 0 :(得分:36)
几乎所有目的都是一样的。
有一次,不同的供应商使用不同的名称(数字/小数)几乎完全相同。 SQL-92使它们变得相同,只有一个小的区别,可以是供应商特定的:
NUMERIC必须与定义的一样精确 - 所以如果你定义4个小数位,那么DB必须总是存储4个小数位。
DECIMAL必须至少,因为它的定义是精确的。这意味着数据库实际上可以存储比指定的更多的数字(由于幕后存储具有额外数字的空间)。这意味着数据库可能会存储1.00005
而不是1.0000
,从而影响未来的计算。
在SQL Server中,Numeric被定义为以各种方式与Decimal相同 - 两者都将始终只存储指定的小数位数。
答案 1 :(得分:8)
他们是同义词,没有任何区别。
ANSI SQL标准中的SQL Server 至少。
这个SO answer shows在ANSI中存在一些差异,但我怀疑在实现中它们是相同的
答案 2 :(得分:4)
Postgres: 没有差异
表8.1中的documentation描述中的看起来相同,但没有解释为什么单独提及,所以 根据汤姆·莱恩post
没有任何区别 Postgres的。有两种类型名称,因为SQL标准要求 我们接受这两个名字。快速查看标准吧 唯一的区别是:
17)NUMERIC specifies the data type exact numeric, with the decimal precision and scale specified by the <precision> and <scale>. 18)DECIMAL specifies the data type exact numeric, with the decimal scale specified by the <scale> and the implementation-defined decimal precision equal to or greater than the value of the specified <precision>.
即,对于DECIMAL,允许实现允许更多数字 比小数点左边的要求。 Postgres没有 行使自由,所以这些类型之间没有区别 我们。
regards, tom lane
还明确表示docs较低的页面
十进制和数字类型是等效的。这两种类型都属于 SQL标准。
以及aliases table decimal [ (p, s) ]
被称为numeric [ (p, s) ]
的别名
答案 3 :(得分:1)
它们实际上是等效的,但是它们是独立的类型,从技术上讲不是ROWVERSION和TIMESTAMP之类的同义词,尽管它们可能在文档中一次被称为同义词。同义词的含义稍有不同(例如,除了名称上,它们是无法区分的,没有一个是另一个的别名)。具有讽刺意味,对吗?
我从MSDN中的措辞解释的实际上是: 这些类型相同,只是名称不同。
除了type_id值之外,这里的所有内容都相同:
SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');
我完全不知道两者之间的行为差异,回到SQL Server 6.5,始终将它们视为100%可互换的。
for DECIMAL(18,2) and NUMERIC(18,2)? Assigning one to the other is technically a "conversion"?
仅当您明确地这样做时。您可以通过创建一个表,然后检查查询计划中执行显式或隐式转换的查询来轻松证明这一点。这是一个简单的表:
CREATE TABLE [dbo].[NumDec]
(
[num] [numeric](18, 0) NULL,
[dec] [decimal](18, 0) NULL
);
现在运行以下查询并捕获计划:
DECLARE @num NUMERIC(18,0);
DECLARE @dec DECIMAL(18,0);
SELECT
CONVERT(DECIMAL(18,0), [num]), -- conversion
CONVERT(NUMERIC(18,0), [dec]) -- conversion
FROM dbo.NumDec
UNION ALL SELECT [num],[dec]
FROM dbo.NumDec WHERE [num] = @dec -- no conversion
UNION ALL SELECT [num],[dec]
FROM dbo.NumDec WHERE [dec] = @num; -- no conversion
我们在要求的地方进行了明确的转化,但在我们可能期望的地方没有明确的转化。似乎优化程序也将它们视为可互换的。
就我个人而言,我更喜欢使用DECIMAL一词,因为它更准确和更具描述性。 BIT也是“数字”。