Oracle
 sql >> Database >  >> RDS >> Oracle

Quale tipo di dati .NET è il migliore per mappare il tipo di dati NUMBER Oracle in NHibernate?

Ho visto decimale usato invece di int/long in vari esempi. Sto solo cercando di capire perché

Probabilmente è perché .NET decimal e Oracle NUMBER mappe un po' meglio di long e NUMBER e ti dà anche più flessibilità. Se in una fase successiva aggiungi una scala nella colonna Oracle non dovresti cambiare il tipo di dati se hai già utilizzato decimal .

decimal è sicuramente più lento di int e long poiché gli ultimi due sono supportati nell'hardware. Detto questo, devi sgranocchiare una seria quantità di dati affinché faccia la differenza. Continuo a pensare che dovresti usare long se questo è ciò con cui hai a che fare e quindi dovresti anche lasciare che le definizioni delle colonne della tabella lo rappresentino. NUMBER(18,0) per long e così via.

Il motivo decimal mappe un po' meglio è che long è 64 bit e decimal è (più o meno) 128 bit.

.NET

Digita:decimale
Intervallo approssimativo:da ±1,0 × 10^−28 a ±7,9 × 10^28
Precisione:28-29 cifre significative

Digita:lungo
Intervallo:da –9.223.372.036.854.775.808 a 9.223.372.036.854.775.807
Precisione:18 (19 per ulong) cifre significative

Oracolo

NUMBER il valore predefinito è 38 cifre significative e scala 0 (intero).

Digita:NUMERO
Intervallo:+- 1 x 10^-130 a 9,99...9 x 10^125
Precisione:38 cifre significative

Microsoft è a conoscenza del problema e delle note

Questo tipo di dati è un alias per il tipo di dati NUMBER(38) ed è progettato in modo che OracleDataReader restituisca un System.Decimal o OracleNumber invece di un valore intero. L'utilizzo del tipo di dati .NETFramework può causare un overflow.

A pensarci bene, in realtà hai bisogno di BigInteger per poter rappresentare lo stesso numero di cifre significative di quale NUMBER predefinito a. Non ho mai visto nessuno farlo e suppongo che sia un'esigenza molto rara. Anche BigInteger ancora non lo taglierei da NUMBER può essere di infinito positivo e negativo.