Gibt es einen Unterschied zwischen DECIMAL und NUMERIC in SQL Server?

127

Gibt es einen Unterschied zwischen den Datentypen DECIMAL und NUMERIC in SQL Server?

Wann sollte ich DECIMAL und wann NUMERIC verwenden?

Dhanapal
quelle

Antworten:

104

Sie sind gleich. Numerisch entspricht funktional der Dezimalzahl.

MSDN: dezimal und numerisch

Guffa
quelle
4
Funktionale Äquivalenz ist nicht dasselbe wie Gleichheit. Tatsächlich wurde auf den Folien des Lehrers des MS6232A-Kurses ein Kommentar hinzugefügt, dass sie fast gleich sind. Gleichzeitig gibt Microsoft keine Empfehlung zu dem einen oder anderen (jedoch ist DECIMAL sinnvoller, da es sich um einen Standarddatentyp anstelle eines älteren Datentyps von Sybase handelt). Ich frage mich immer noch, was der wirkliche Unterschied (hinter den Bildschirmen) ist :-).
Vstrien
22
@vstrien: Der einzige Unterschied ist, dass ich finden kann , ist , dass in dem SQL-92 - Standard decimalist genau so präzise wie deklarierte, während numericist mindestens so präzise wie erklärt. In SQL Server sind beide genau so präzise wie deklariert, dh es wird nicht die Flexibilität verwendet numeric, die der Standard zulässt.
Guffa
17
Beachten Sie jedoch, dass SQL Server sie nicht als austauschbar behandelt: Wenn Sie beispielsweise eine "übergeordnete" Spalte im Format "DECIMAL (18,0)" haben und versuchen, einen Fremdschlüssel hinzuzufügen, der auf a verweist In der Spalte "NUMERIC (18,0)" wird der Fehler Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'angezeigt. Beide müssen NUMERIC (x, y) oder DECIMAL (x, y) sein.
Doug_Ivison
7
@Guffa: Ihre Antwort widerspricht dem SQL2003-Standard, der unter stackoverflow.com/a/759606/14731 angegeben ist . Insbesondere decimalist mindestens so präzise wie erklärt, wohingegen numericist genau so präzise wie erklärt.
Gili
3
@Gili: Ja, bei der Überprüfung des Originalmaterials scheint es, dass Sie Recht haben, dass ich sie ausgetauscht habe.
Guffa
41

Dies sagt der SQL2003-Standard (§6.1 Datentypen) über die beiden:

 <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
quelle
Sie haben bitte einen Link dazu?
Gbn
2
Wiscorp hat eine Entwurfsversion des Standards zum Download ( wiscorp.com/sql_2003_standard.zip ). Wenn Sie die endgültige Version möchten, müssen Sie diese kaufen ( en.wikipedia.org/wiki/SQL2003#Documentation_availability ).
Joakim Backman
6
Beachten Sie, dass dies der SQL-Standard ist und keine Beschreibung der Implementierung durch SQL Server.
Guffa
2
Gut zu wissen, dass dies eine weitere Regel ist, die Microsoft ignoriert hat. :)
one.beat.consumer
11

Meines Wissens gibt es keinen Unterschied zwischen den Datentypen NUMERIC und DECIMAL. Sie sind synonym zueinander und beide können verwendet werden. DECIMAL- und NUMERIC-Datentypen sind numerische Datentypen mit fester Genauigkeit und Skalierung.

Bearbeiten:

Wenn Sie mit einigen Kollegen sprechen, hat dies möglicherweise etwas damit zu tun, dass DECIMAL der ANSI-SQL-Standard und NUMERIC einer ist, den Mircosoft bevorzugt, da er in Programmiersprachen häufiger vorkommt. ...Vielleicht ;)

Kevchadders
quelle
Bezüglich der Bearbeitung: Nein - siehe die Antwort von @ JoakimBackman oben - er zitiert den SQL-Standard sowohl mit NUMERIC als auch mit DECIMAL.
Umgekehrter Ingenieur
1

Die Antwort von Joakim Backman ist spezifisch, aber dies kann zusätzliche Klarheit bringen.

Es gibt einen kleinen Unterschied. Gemäß SQL For Dummies, 8. Ausgabe (2013):

Der Datentyp DECIMAL ähnelt NUMERIC. ... Der Unterschied besteht darin, dass Ihre Implementierung möglicherweise eine höhere Genauigkeit als die von Ihnen angegebene angibt. In diesem Fall verwendet die Implementierung die höhere Genauigkeit. Wenn Sie keine Genauigkeit oder Skalierung angeben, verwendet die Implementierung Standardwerte, wie dies beim Typ NUMERIC der Fall ist.

Es scheint, dass der Unterschied bei einigen Implementierungen von SQL in der Datenintegrität liegt. DECIMAL ermöglicht einen Überlauf von dem, was basierend auf einigen Systemstandards definiert ist, wo dies bei NUMERIC nicht der Fall ist.

Alex Firsov
quelle
0

Sie sind Synonyme, überhaupt kein Unterschied. Dezimale und numerische Datentypen sind numerische Datentypen mit fester Genauigkeit und Skalierung.

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

Sie sind genau das gleiche. Wenn Sie es verwenden, seien Sie konsistent. Verwenden Sie eine davon in Ihrer Datenbank

Faruk
quelle