DECIMAL和NUMERIC之间的区别

时间:2009-12-03 18:30:10

标签: sql types decimal numeric

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

  • SQL Server
  • 甲骨文
  • DB / 2
  • MySQL的
  • 的PostgreSQL

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

4 个答案:

答案 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也是“数字”。