C'è qualche differenza tra DECIMAL e NUMERIC in SQL Server?


127

C'è qualche differenza tra i tipi di dati DECIMAL e NUMERIC in SQL Server?

Quando dovrei usare DECIMAL e quando NUMERIC?

Risposte:


105

Loro sono la stessa cosa. Numerico è funzionalmente equivalente al decimale.

MSDN: decimale e numerico


4
L'equivalenza funzionale non è la stessa dell'uguaglianza. In realtà, nelle diapositive dell'istruttore del corso MS6232A è stato aggiunto un commento che sono quasi uguali. Allo stesso tempo, Microsoft non ha formulato alcuna raccomandazione in merito all'una o all'altra (tuttavia DECIMAL ha più senso, in quanto si tratta del tipo di dati standard anziché di un tipo di dati legacy di Sybase). Mi chiedo ancora quale sia la vera differenza (dietro gli schermi) :-).
vstrien,

22
@vstrien: L'unica differenza che posso trovare è che nello standard SQL-92 decimalè esattamente preciso quanto dichiarato, mentre numericè di almeno preciso quanto dichiarato. In SQL Server entrambi sono esattamente precisi come dichiarato, ovvero non utilizza la flessibilità numericconsentita dallo standard.
Guffa,

17
NOTA, tuttavia, che SQL Server non li considera intercambiabili: se, ad esempio, si dispone di una colonna "padre" nel formato "DECIMALE (18,0)" e si tenta di aggiungere una chiave esterna per fare riferimento a un colonna nel formato "NUMERIC (18,0)", otterrai l'errore Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'. Devono essere entrambi NUMERIC (x, y) o entrambi DECIMAL (x, y).
Doug_Ivison

7
@Guffa: la tua risposta è in contraddizione con lo standard SQL2003 citato su stackoverflow.com/a/759606/14731 . In particolare, decimalè preciso almeno quanto dichiarato, mentre numericè esattamente preciso come dichiarato.
Gili,

3
@Gili: Sì, dopo aver esaminato il materiale originale, sembra che tu abbia ragione nel fatto che li ho scambiati.
Guffa,

41

Questo è ciò che dice quindi lo standard SQL2003 (§6.1 Tipi di dati) sui due:

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

Hai un link per questo, per favore?
gbn

2
Wiscorp ha una versione bozza dello standard per il download ( wiscorp.com/sql_2003_standard.zip ), se desideri la versione finale devi acquistarla ( en.wikipedia.org/wiki/SQL2003#Documentation_availability ).
Joakim Backman,

6
Si noti che questo è lo standard SQL, non una descrizione di come SQL Server lo implementa.
Guffa,

2
Bello sapere che questa è un'altra regola che Microsoft ha deciso di ignorare. :)
one.beat.consumer l'

11

Per quanto ne sappia, non vi è alcuna differenza tra i tipi di dati NUMERIC e DECIMAL. Sono sinonimi l'uno dell'altro e si può usare uno dei due. I tipi di dati DECIMAL e NUMERIC sono tipi di dati numerici con precisione e scala fisse.

Modificare:

Parlare con alcuni colleghi forse ha qualcosa a che fare con DECIMAL essendo lo standard ANSI SQL e NUMERIC essendo uno che Mircosoft preferisce come si trova più comunemente nei linguaggi di programmazione. ...Può essere ;)


Per quanto riguarda la modifica: No - vedi la risposta di @ JoakimBackman sopra - cita lo standard SQL con NUMERIC e DECIMAL.
Ingegnere invertito,

1

Sono sinonimi, nessuna differenza. I tipi di dati decimali e numerici sono tipi di dati numerici con precisione e scala fisse.

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

La risposta di Joakim Backman è specifica, ma ciò può portare ulteriore chiarezza.

C'è una differenza minore. Secondo SQL For Dummies, 8th Edition (2013):

Il tipo di dati DECIMAL è simile a NUMERIC. ... La differenza è che l'implementazione può specificare una precisione maggiore di quella specificata; in tal caso, l'implementazione utilizza una precisione maggiore. Se non si specifica la precisione o la scala, l'implementazione utilizza valori predefiniti, come nel caso del tipo NUMERICO.

Sembra che la differenza su alcune implementazioni di SQL risieda nell'integrità dei dati. DECIMAL consente l'overflow da ciò che è definito sulla base di alcune impostazioni predefinite del sistema, mentre NUMERIC no.


-2

Sono esattamente gli stessi. Quando lo usi è coerente. Usane uno nel tuo database

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.