oracle - numero - decimal(s, p) o número(s, p)?
oracle format number two decimals (2)
En realidad, hay una diferencia entre decimal y número. El decimal truncará el valor que está sobre escala, el número redondeará el valor.
Recientemente, mientras trabajábamos en un proyecto de migración db2 -> oracle, nos topamos con esta situación. los desarrolladores inadvertidamente crearon nuevas estructuras de tabla usando columnas decimales (s, p). No recordaba que Oracle apoyara esto, pero luego algunas excavaciones mostraron que es un tipo de datos ANSI, por lo tanto, es compatible con Oracle.
Sin embargo, la pregunta para mí se mantuvo
- ¿Cómo se maneja esta información internamente?
- ¿Hay un costo de usar tipos ANSI en lugar de los tipos incorporados de Oracle?
- ¿Habrá un impacto durante la migración de datos si el tipo de destino fue el tipo de Oracle incorporado?
En Oracle, son lo mismo :
Las sentencias SQL que crean tablas y clústeres también pueden usar tipos de datos ANSI y tipos de datos de los productos IBM SQL / DS y DB2. Oracle reconoce el nombre de tipo de datos ANSI o IBM que difiere del nombre de tipo de datos de la base de datos Oracle. Convierte el tipo de datos al tipo de datos Oracle equivalente, registra el tipo de datos de Oracle como el nombre del tipo de datos de columna y almacena los datos de columna en el tipo de datos de Oracle en función de las conversiones que se muestran en las tablas siguientes.
La tabla debajo de esta cita muestra que DECIMAL(p,s)
se trata internamente como un NUMBER(p,s)
:
SQL> create table t (a decimal(*,5), b number (*, 5));
Table created
SQL> desc t;
Name Type Nullable Default Comments
---- ----------- -------- ------- --------
A NUMBER(*,5) Y
B NUMBER(*,5) Y
Sin embargo, la escala por defecto es 0 para DECIMAL
, lo que significa que DECIMAL(*)
se trata como NUMBER(*, 0)
, es decir, INTEGER
:
SQL> create table t (a decimal, b number, c decimal (5), d decimal (5));
Table created
SQL> desc t;
Name Type Nullable Default Comments
---- --------- -------- ------- --------
A INTEGER Y
B NUMBER Y
C NUMBER(5) Y
D NUMBER(5) Y