SQL Server中的DECIMAL和NUMERIC有什么区别吗?

133

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

何时应该使用DECIMAL,何时应该使用NUMERIC?

6个回答

110

5
功能等价并不等同于相等。实际上,在MS6232A课程的讲师幻灯片中添加了一个评论,他们几乎是相同的。同时,微软并没有推荐使用其中的任何一种(然而,DECIMAL更有意义,因为它是一种标准数据类型,而不是来自Sybase的旧数据类型)。仍然想知道实际的差异(在屏幕背后)。 - vstrien
25
我能发现的唯一区别是,在SQL-92标准中,“decimal”精度与声明完全相同,而“numeric”精度至少与声明相同。在SQL Server中,两者的精度都与声明完全相同,即它不使用标准允许的“numeric”的灵活性。 - Guffa
18
需要注意的是,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>'。它们必须都是NUMERIC(x,y),或者都是DECIMAL(x,y)。 - Doug_Ivison
9
@Guffa:您的答案与引用 https://dev59.com/4HRA5IYBdhLWcg3w_C8w#759606 上的 SQL2003 标准相矛盾。具体而言,decimal 至少和声明一样精确,而 numeric 则完全如声明所示精确。 - Gili
5
是的,在查看原始材料后,似乎你是正确的,我确实把它们搞混了。 - Guffa
显示剩余3条评论

42

以下是 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提供标准的草案版本供下载(http://www.wiscorp.com/sql_2003_standard.zip),如果您需要最终版本,则需要购买(http://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是微软更喜欢的,因为在编程语言中更常见。...也许吧;)

关于编辑:不是的 - 请参考@JoakimBackman上面的答案 - 他引用了SQL标准中的NUMERIC和DECIMAL。 - Reversed Engineer

2
Joakim Backman的回答很具体,但这可能会为它带来更多的清晰度。
有一个小差别。根据SQL For Dummies,第8版(2013):
DECIMAL数据类型类似于NUMERIC。...区别在于您的实现可能指定比您指定的精度更高的精度 - 如果是这样,则实现使用更高的精度。如果您没有指定精度或比例,则实现使用默认值,就像使用NUMERIC类型一样。
在某些SQL实现中,DECIMAL与NUMERIC之间的差异在于数据完整性。DECIMAL允许从基于某些系统默认值定义的内容进行溢出,而NUMERIC则不允许。

1
它们是同义词,没有任何区别。Decimal和Numeric数据类型都是具有固定精度和比例的数值数据类型。
-- 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

-2

它们完全相同。在使用时要保持一致。在您的数据库中使用其中之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接