¿Hay alguna diferencia entre DECIMAL y NUMERIC en SQL Server?

127

¿Hay alguna diferencia entre los tipos de datos DECIMAL y NUMERIC en SQL Server?

¿Cuándo debo usar DECIMAL y cuándo NUMERIC?

Dhanapal
fuente

Respuestas:

105

Ellos son iguales. Numérico es funcionalmente equivalente a decimal.

MSDN: decimal y numérico

Guffa
fuente
44
La equivalencia funcional no es lo mismo que la igualdad. En realidad, en las diapositivas del instructor del curso MS6232A hay un comentario agregado de que casi son lo mismo. Al mismo tiempo, Microsoft no hace ninguna recomendación con respecto a uno u otro (sin embargo, DECIMAL tiene más sentido, ya que es un tipo de datos estándar en lugar de un tipo de datos heredado de Sybase). Todavía me pregunto cuál es la verdadera diferencia (detrás de las pantallas) :-).
vstrien
22
@vstrien: La única diferencia que puedo encontrar es que en el estándar SQL-92 decimales exactamente tan preciso como se declara, mientras que numerices al menos tan preciso como se declara. En SQL Server, ambos son exactamente tan precisos como declarados, es decir, no utiliza la flexibilidad numericque permite el estándar.
Guffa
17
Tenga en cuenta, sin embargo, que SQL Server no los trata como intercambiables: si, por ejemplo, tiene una columna "principal" en formato "DECIMAL (18,0)" e intenta agregarle una clave foránea que haga referencia a un , en el formato "NUMÉRICO (18,0)", obtendrá el error Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'. Ambos deben ser NÚMEROS (x, y), o ambos deben ser DECIMALES (x, y).
Doug_Ivison
77
@Guffa: su respuesta contradice el estándar SQL2003 como se cita en stackoverflow.com/a/759606/14731 . Específicamente, decimales al menos tan preciso como se declara, mientras que numerices exactamente tan preciso como se declara.
Gili
3
@Gili: Sí, en la revisión del material original parece que tienes razón en que los cambié.
Guffa
41

Esto es lo que dice el estándar SQL2003 (§6.1 Tipos de datos) sobre los dos:

 <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>.
Joakim Backman
fuente
Tienes enlace para esto por favor?
gbn
2
Wiscorp tiene una versión borrador del estándar para descargar ( wiscorp.com/sql_2003_standard.zip ), si desea la versión final debe comprarla ( en.wikipedia.org/wiki/SQL2003#Documentation_availability ).
Joakim Backman el
66
Tenga en cuenta que este es el estándar SQL, no una descripción de cómo SQL Server lo implementa.
Guffa
2
Es bueno saber que esta es otra regla que Microsoft decidió ignorar. :)
one.beat.consumer
11

Que yo sepa, no hay diferencia entre los tipos de datos NUMÉRICOS y DECIMALES. Son sinónimos entre sí y cualquiera de los dos puede ser utilizado. Los tipos de datos DECIMAL y NUMERIC son tipos de datos numéricos con precisión y escala fijas.

Editar:

Hablar con algunos colegas tal vez tenga algo que ver con DECIMAL como el estándar ANSI SQL y NUMERIC como uno que Mircosoft prefiere, ya que se encuentra más comúnmente en los lenguajes de programación. ...Tal vez ;)

kevchadders
fuente
Vuelva a editar: No, vea la respuesta de @ JoakimBackman arriba, cita el estándar SQL con NUMERIC y DECIMAL.
Ingeniero invertido
1

Son sinónimos, no hay ninguna diferencia. Los tipos de datos decimal y numérico son tipos de datos numéricos con precisión y escala fijas.

-- 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
Raman Grewal
fuente
1

La respuesta de Joakim Backman es específica, pero esto puede aportarle una claridad adicional.

Hay una pequeña diferencia. Según SQL For Dummies, 8a edición (2013):

El tipo de datos DECIMAL es similar a NUMERIC. ... La diferencia es que su implementación puede especificar una precisión mayor que la que usted especifica; de ser así, la implementación usa la mayor precisión. Si no especifica precisión o escala, la implementación usa valores predeterminados, como lo hace con el tipo NUMERIC.

Parece que la diferencia en algunas implementaciones de SQL está en la integridad de los datos. DECIMAL permite el desbordamiento de lo que se define en función de algunos valores predeterminados del sistema, mientras que NUMERIC no lo hace.

Alex Firsov
fuente
-2

Son exactamente lo mismo. Cuando lo uses, sé consistente. Use uno de ellos en su base de datos

Faruk
fuente