在SQL Server中,DECIMAL和NUMERIC之间有什么区别吗?


127

SQL Server中的DECIMAL和NUMERIC数据类型之间有什么区别吗?

什么时候应该使用DECIMAL?什么时候应使用NUMERIC?

Answers:


105

他们是一样的。数值在功能上等同于十进制。

MSDN:十进制和数字


4
功能对等与平等不同。实际上,在MS6232A课程的讲师幻灯片中,有一条评论补充说它们几乎是相同的。同时,Microsoft没有建议任何一个或另一个(但是DECIMAL更有意义,因为它是标准的数据类型,而不是Sybase的旧数据类型)。仍然想知道(在屏幕后面)的真正区别是:-)。
vstrien 2011年

22
@vstrien:唯一不同的是我能找到的是,在SQL-92标准decimal准确的精确的定义,而numeric至少一样精确的声明。在SQL Server中,两者的精确度均与声明的精确度相同,即,它没有使用numeric标准所允许的灵活性。
Guffa

17
但是,请注意,SQL Server不会将它们视为可互换的:例如,如果您具有“ DECIMAL(18,0)”格式的“父”列,并尝试为其添加引用一个外键外键在列“NUMERIC(18,0)”的格式,你会得到错误Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>',他们必须都为数字(X,Y),或两者是十进制(X,Y)。
Doug_Ivison

7
@Guffa:您的答案与stackoverflow.com/a/759606/14731引用的SQL2003标准相矛盾。具体而言,decimal至少作为精确如声明的,而numeric恰好一样精确如声明。
吉利2014年

3
@吉利:是的,在回顾原始资料时,我确实将它们交换了一下似乎是正确的。
Guffa

41

然后,这就是SQL2003标准(第6.1节数据类型)对这两种说法的含义:

 <exact numeric type> ::=
    NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DECIMAL [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DEC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | SMALLINT
  | INTEGER
  | INT
  | BIGINT

 ...

21) NUMERIC specifies the data type
    exact numeric, with the decimal
    precision and scale specified by the
    <precision> and <scale>.

22) 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>.

你有这个链接吗?
gbn

2
Wiscorp拥有可供下载的标准草案版本(wiscorp.com/sql_2003_standard.zip),如果您想要最终版本,则必须购买它(en.wikipedia.org/wiki/SQL2003#Documentation_availability)。
Joakim Backman

6
请注意,这是SQL标准,而不是SQL Server实现方式的描述。
Guffa

2
很高兴知道这是微软决定忽略的另一条规则。:)
one.beat.consumer

11

据我所知,NUMERIC和DECIMAL数据类型之间没有区别。它们彼此同义,可以使用任何一个。DECIMAL和NUMERIC数据类型是具有固定精度和小数位数的数字数据类型。

编辑:

对一些同事来说,它可能与DECIMAL是ANSI SQL标准有关,而NUMERIC是Mircosoft更喜欢的一种语言,因为它在编程语言中更为常见。...也许 ;)


重新编辑:不-请参阅上面的@JoakimBackman的答案-他引用了NUMERIC和DECIMAL的SQL标准。
逆向工程师

1

它们是同义词,一点也没有区别。十进制和数值数据类型是具有固定精度和小数位数的数值数据类型。

-- Initialize a variable, give it a data type and an initial value

declare @myvar as decimal(18,8) or numeric(18,8)----- 9 bytes needed

-- Increse that the vaue by 1

set @myvar = 123456.7

--Retrieve that value

select @myvar as myVariable

1

Joakim Backman的回答很具体,但这可能会使其更加清晰。

有细微的差别。根据《 SQL For Dummies,第8版(2013)》:

DECIMAL数据类型类似于NUMERIC。...区别在于您的实现所指定的精度可能比您指定的精度高-如果是这样,则实现会使用更高的精度。如果未指定精度或小数位数,则实现将使用默认值,就像NUMERIC类型一样。

看来区别在 某些 SQL实现在于数据完整性。DECIMAL允许根据一些系统默认值定义的内容溢出,而NUMERIC则不允许。


-2

他们是完全一样的。使用时要保持一致。在数据库中使用其中之一

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.