Existe alguma diferença entre DECIMAL e NUMERIC no SQL Server?


127

Existe alguma diferença entre os tipos de dados DECIMAL e NUMERIC no SQL Server?

Quando devo usar DECIMAL e quando NUMERIC?

Respostas:


105

Eles são os mesmos. Numérico é funcionalmente equivalente a decimal.

MSDN: decimal e numérico


4
Equivalência funcional não é o mesmo que igualdade. Na verdade, nos slides do instrutor do curso MS6232A, há um comentário adicionado de que eles são quase os mesmos. Ao mesmo tempo, a Microsoft não recomenda nenhuma recomendação sobre um ou outro (no entanto, DECIMAL faz mais sentido, pois é um tipo de dados padrão em vez de um tipo de dados herdado da Sybase). Ainda me pergunto qual é a diferença real (atrás das telas) :-).
22411 vstrien

22
@ vstrien: A única diferença que posso encontrar é que no padrão SQL-92 decimalé exatamente tão preciso quanto declarado, enquanto numericé pelo menos tão preciso quanto declarado. No SQL Server, ambos são exatamente tão precisos quanto declarados, ou seja, não usam a flexibilidade numericpermitida pelo padrão.
Guffa 13/07/11

17
NOTA, no entanto, que o SQL Server não os trata como intercambiáveis: se, por exemplo, você tiver uma coluna "pai" no formato "DECIMAL (18,0)" e tentar adicionar uma chave estrangeira que faça referência a um coluna no formato "NUMERIC (18,0)", você receberá o erro Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'. Eles devem ser NUMERIC (x, y) ou DECIMAIS (x, y).
Doug_Ivison

7
@ Guffa: sua resposta contradiz o padrão SQL2003, conforme citado em stackoverflow.com/a/759606/14731 . Especificamente, decimalé pelo menos tão preciso quanto declarado, enquanto numericé exatamente tão preciso quanto declarado.
Gili

3
@ Gili: Sim, na revisão do material original, parece que você está certo que eu os troquei.
Guffa

41

Isto é o que o padrão SQL2003 (§6.1 Tipos de Dados) diz sobre os dois:

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

Você tem um link para isso, por favor?
gbn 3/12/09

2
O Wiscorp possui uma versão preliminar do padrão para download ( wiscorp.com/sql_2003_standard.zip ), se você quiser a versão final, precisará comprá-la ( en.wikipedia.org/wiki/SQL2003#Documentation_availability ).
Joakim Backman

6
Observe que esse é o padrão SQL, não uma descrição de como o SQL Server o implementa.
Guffa

2
É bom saber que essa é outra regra que a Microsoft decidiu ignorar. :)
one.beat.consumer

11

Que eu saiba, não há diferença entre os tipos de dados NUMERIC e DECIMAL. Eles são sinônimos um do outro e qualquer um deles pode ser usado. Os tipos de dados DECIMAL e NUMÉRICO são tipos de dados numéricos com precisão e escala fixas.

Editar:

Falando com alguns colegas, talvez isso tenha algo a ver com DECIMAL sendo o padrão ANSI SQL e NUMERIC sendo o que a Mircosoft prefere, pois é mais comum em linguagens de programação. ...Talvez ;)


Sobre a edição: Não - veja a resposta de @ JoakimBackman acima - ele cita o padrão SQL com NUMERIC e DECIMAL.
Engenheiro reverso

1

Eles são sinônimos, nenhuma diferença.Tipos de dados decimais e numéricos são tipos de dados numéricos com precisão e escala fixas.

-- 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

A resposta de Joakim Backman é específica, mas isso pode trazer mais clareza.

Há uma pequena diferença. Conforme SQL For Dummies, 8ª edição (2013):

O tipo de dados DECIMAL é semelhante a NUMERIC. ... A diferença é que sua implementação pode especificar uma precisão maior do que a que você especifica - nesse caso, a implementação usa a maior precisão. Se você não especificar precisão ou escala, a implementação utilizará valores padrão, como ocorre com o tipo NUMERIC.

Parece que a diferença em algumas implementações do SQL está na integridade dos dados. DECIMAL permite o estouro do que é definido com base em alguns padrões do sistema, enquanto NUMERIC não.


-2

Eles são exatamente os mesmos. Quando você usar, seja consistente. Use um deles no seu banco de dados

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.