2009-12-15 6 views
5

¿Cuál es el motivo por el que algunas personas de origen Oracle están utilizando DECIMAL (31,0) para enteros? En MySQL no es eficiente.Motivo de uso DECIMAL (31,0)

Respuesta

4

Oracle implementa el "INTEGER" tipo de datos ANSI como sinónimo de NÚMERO (38)

Para más detalles ver "Learn Oracle: Datatypes for SQL and PL/SQL, Numbers"

Sin embargo, la siguiente tabla se debe utilizar como un mapeo entre tipo de datos en Oracle y MySQL:

"Oracle® Database SQL Developer Supplementary Information for MySQL Migrations"

Oracle y MySQL comparación> Tipos de datos> comparación de tipos de datos

La principal diferencia, como se explica here y here es que el número Oracle tipo de datos es el formato de longitud variable, mientras que MySQL DECIMAL (n) de tipo de datos que solía ser represented as strings that require one byte per digit or sign character (antes de la versión 5.0.3)

(Oracle NUMBER tipo de datos) Formato numérico interno

Oracle Database almacena datos numéricos en formato de longitud variable. Cada valor es almacenado en notación científica, con 1 bytes usados ​​para almacenar el exponente y hasta a 20 bytes para almacenar la mantisa. El valor resultante está limitado a 38 dígitos de precisión. Oracle Database no almacena los ceros iniciales y finales. Por ejemplo, el número 412 es almacenado en un formato similar a 4.12 x 102, con 1 byte utilizado para almacenar el exponente (2) y 2 bytes utilizados para almacenar los tres dígitos significativos de la mantisa (4,1 , 2). Los números negativos incluyen el signo en su longitud.

Teniendo esto en cuenta, el tamaño de columna en bytes para un número particular numérico valor de datos (p), donde p es la precisión de un valor dado, puede ser calculado utilizando el fórmula siguiente:

ROUND((length(p)+s)/2))+1

donde s es igual a cero si el número es positivo , y s es igual a 1 si el número es negativo .

Zero y positivo y negativo infinito (sólo generada en la importación de base de datos Oracle, Versión 5) son almacenado utilizando representaciones únicas. Cero y negativo infinito cada requieren 1 byte; infinito positivo requiere 2 bytes.

y

(MySQL) DECIMAL Tipo de datos Cambios requisitos

El almacenamiento para el número entero y partes fraccionarias de cada valor se determinan por separado. Cada múltiplo de nueve dígitos requiere cuatro bytes, y los dígitos restantes que quedan requieren una fracción de cuatro bytes. [...]

Por ejemplo, un DECIMAL (18,9) columna tiene nueve dígitos en cada lado del punto decimal , por lo que la parte entera y la parte fraccionaria cada requieren cuatro bytes. Una columna DECIMAL (20,6) tiene catorce dígitos enteros y seis dígitos fraccionarios. Los dígitos enteros requieren cuatro bytes para nueve de los dígitos y tres bytes para los restantes cinco dígitos. Los seis dígitos fraccionarios requieren tres bytes.