Ich habe einige Beispiele gesehen, in denen decimal
in NHibernate-Projekten für die Zuordnung zu ganzzahligen Spalten in Oracle verwendet wird. Im Moment verwende ich int
und long
in meinem Programm.
Was sind die Vorteile von decimal
gegenüber int
/long
? Funktioniert es besser?
Ich habe in verschiedenen Beispielen Dezimalstellen anstelle von int/long gesehen. Ich versuche nur zu verstehen, warum
Das liegt wahrscheinlich daran, dass .NET decimal
und Oracle NUMBER
ordnet etwas besser z als long
und NUMBER
und es bietet Ihnen auch mehr Flexibilität. Wenn Sie zu einem späteren Zeitpunkt ein scale in die Oracle-Spalte einfügen, müssen Sie den Datentyp nicht ändern, wenn Sie bereits decimal
verwendet haben.
decimal
ist sicherlich langsamer als int
und long
, da die beiden letzteren in der Hardware unterstützt werden. Das heißt, Sie müssen einige ernsthafte Datenmengen brechen, um einen Unterschied zu machen. Ich denke immer noch, dass Sie long
verwenden sollten, wenn Sie es damit zu tun haben, und dann sollten Sie auch zulassen, dass die Tabellenspaltendefinitionen dies darstellen. NUMBER(18,0)
für long
und so weiter.
Der Grund, warum decimal
etwas besser abgebildet wird, ist, dass long
64 Bit und decimal
(eine Art) 128 Bit beträgt.
. NET
Typ: dezimal
Ungefährer Bereich: ± 1,0 × 10 ^ −28 bis ± 7,9 × 10 ^ 28
Präzision: 28-29 signifikante StellenTyp: lang
Bereich: –9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807
Genauigkeit: 18 (19 für lange) signifikante Ziffern
Oracle
NUMBER
Standard bis 38 signifikante Stellen und Skala 0 (Ganzzahl).
Typ: [~ # ~] Nummer [~ # ~]
Bereich: + - 1 x 10 ^ -130 bis 9,99 ... 9 x 10 ^ 125
Präzision: 38 signifikante Stellen
Microsoft ist sich des Problems bewusst und Notizen
Dieser Datentyp ist ein Alias für den Datentyp NUMBER (38) und ist so konzipiert, dass OracleDataReader anstelle eines Ganzzahlwerts eine System.Decimal oder OracleNumber zurückgibt. Die Verwendung des .NET Framework-Datentyps kann einen Überlauf verursachen.
Wenn Sie sich das überlegen, brauchen Sie tatsächlich BigInteger
, um die gleiche Anzahl von signifikanten Ziffern darstellen zu können, wie für NUMBER
die Standardeinstellung ist. Ich habe noch nie jemanden gesehen, der das getan hat, und ich nehme an, es ist eine sehr seltene Notwendigkeit. Auch BigInteger
würde es immer noch nicht schneiden, da NUMBER
von positiver und negativer Unendlichkeit sein kann.
[.NET: Int32] = [Oracle:NUMBER(2)..NUMBER(9)*]
[.NET: Int64] = [Oracle:NUMBER(10)..NUMBER(18)*]
[.NET: Double] = [Oracle:NUMBER(x, 0)..NUMBER(x, 15)*]
[.NET: Double] = [Oracle: FLOAT]
[.NET: Decimal] = [Oracle:NUMBER]
NUMBER(1,0) => Boolean
NUMBER(5,0) => Int16/short.MaxValue == 32767
NUMBER(10,0) => Int32/int.MaxValue == 2,147,483,647
NUMBER(19,0) => Int64/long.MaxValue == 9,223,372,036,854,775,807