Risposte:
Loro sono la stessa cosa. Numerico è funzionalmente equivalente al decimale.
MSDN: decimale e numerico
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à numeric
consentita dallo standard.
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).
decimal
è preciso almeno quanto dichiarato, mentre numeric
è esattamente preciso come dichiarato.
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>.
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 ;)
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
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.