DECIMAL和NUMERIC之间的区别

问题描述 投票:43回答:4

SQL数据类型qazxsw poi和qazxsw poi之间有什么区别?如果数据库对待这些不同,我想知道至少如何:

  • SQL Server
  • 神谕
  • DB / 2
  • MySQL的
  • PostgreSQL的

此外,数据库驱动程序如何解释这些类型有什么不同吗?

sql types decimal numeric
4个回答
35
投票

几乎所有目的都是一样的。

有一段时间,不同的供应商使用不同的名称(数字/十进制)几乎相同的东西。 SQL-92使它们相同,只有一个小的区别,可以是特定于供应商的:

NUMERIC必须与定义的一样精确 - 因此,如果定义4个小数位,则DB必须始终存储4个小数位。

DECIMAL必须至少与定义的一样精确。这意味着数据库实际上可以存储比指定的更多的数字(由于幕后存储具有额外数​​字的空间)。这意味着数据库可能存储NUMERIC而不是DECIMAL,从而影响未来的计算。

在SQL Server中,Numeric被定义为以各种方式与Decimal相同 - 两者都将始终仅存储指定的小数位数。


8
投票

它们是同义词,完全没有区别。

至少 在SQL Server上 在ANSI SQL标准中。这个1.00005在ANSI方面有些不同,但我怀疑在实现中它们是相同的


4
投票

Postgres:没有区别

1.0000表8.1中的描述看起来相同,但它没有解释为什么它被单独提及,所以根据Tom Lane SO answer shows

Postgres没有任何区别。有两种类型名称,因为SQL标准要求我们接受这两个名称。快速查看标准,看来唯一的区别是:

documentation

即,对于DECIMAL,允许实现允许比小数点左边所请求的更多数字。 Postgres没有行使这种自由,所以这些类型对我们来说没有区别。

post

还有一个页面低于 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>. 状态,那个

十进制和数字类型是等效的。这两种类型都是SQL标准的一部分。

并且在 regards, tom lane docs被提及为aliases table的别名


1
投票

它们实际上是等价的,但它们是独立的类型,而不是技术上的同义词,如ROWVERSION和TIMESTAMP - 尽管它们可能在文档中同时被称为同义词。这是同义词的略微不同的含义(例如,除了名称之外,它们是无法区分的,而不是另一个是别名的别名)。讽刺吧?

我从MSDN中的措辞中解释的实际上是:这些类型是相同的,它们只是有不同的名称。

除了type_id值,这里的所有内容都是相同的:

decimal [ (p, s) ]

我完全不知道两者之间的任何行为差异,并且回到SQL Server 6.5,总是将它们视为100%可互换。

numeric [ (p, s) ]

只有你明确这样做。您可以通过创建表然后检查查询计划以查找执行显式或 - 您可能期望 - 隐式转换的查询来轻松证明这一点。这是一个简单的表格:

SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');

现在运行这些查询并捕获计划:

for DECIMAL(18,2) and NUMERIC(18,2)? Assigning one to the other is technically a "conversion"?

我们有明确的转化,我们要求他们,但没有明确的转换我们可能期望他们。似乎优化器也将它们视为可互换的。

就个人而言,我更喜欢使用术语DECIMAL,因为它更加准确和具有描述性。 BIT也是“数字”。

© www.soinside.com 2019 - 2024. All rights reserved.