database - tamaño - ¿Cuál es la precisión y escala por defecto para un número en Oracle?
tamaño number oracle (5)
Creo que la precisión predeterminada es 38, la escala predeterminada es cero. Sin embargo, el tamaño real de una instancia de esta columna es dinámico. Se necesitará tanto espacio como sea necesario para almacenar el valor, o un máximo de 21 bytes.
Al crear una columna de tipo NUMBER en Oracle, tiene la opción de no especificar una precisión o escala. ¿Qué hacen estos valores predeterminados si no los especifica?
El tipo NUMBER
se puede especificar en diferentes estilos :
Resulting Resulting Precision Specification Precision Scale Check Comment ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― NUMBER NULL NULL NO ''maximum range and precision'', values are stored ''as given'' NUMBER(P, S) P S YES Error code: ORA-01438 NUMBER(P) P 0 YES Error code: ORA-01438 NUMBER(*, S) 38 S NO
Donde la precisión es el número total de dígitos y la escala es el número de dígitos a la derecha o izquierda (escala negativa) del punto decimal.
Oracle especifica ORA-01438 como
valor mayor que la precisión especificada permitida para esta columna
Como se observa en la tabla, esta verificación de integridad solo está activa si la precisión se especifica explícitamente. De lo contrario, Oracle redondea silenciosamente el valor insertado o actualizado utilizando algún método no especificado.
En realidad, siempre puedes probarlo tú mismo.
CREATE TABLE CUSTOMERS ( CUSTOMER_ID NUMBER NOT NULL, JOIN_DATE DATE NOT NULL, CUSTOMER_STATUS VARCHAR2(8) NOT NULL, CUSTOMER_NAME VARCHAR2(20) NOT NULL, CREDITRATING VARCHAR2(10) ) ;
seleccione column_name, data_type, nullable, data_length, data_precision, data_scale de user_tab_columns donde table_name = ''CLIENTES'';
NUMBER (precisión, escala)
Si no se especifica una precisión, la columna almacena los valores como dados. Si no se especifica ninguna escala, la escala es cero.
Mucha más información en:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832
Oracle
almacena números de la siguiente manera: 1 byte
de potencia, 1 byte
para el primer dígito significativo (es decir, uno antes del separador), el resto para los otros dígitos.
Por digits
aquí Oracle
significa centesimal digits
(es decir, base 100
)
SQL> INSERT INTO t_numtest VALUES (LPAD(''9'', 125, ''9''))
2 /
1 row inserted
SQL> INSERT INTO t_numtest VALUES (LPAD(''7'', 125, ''7''))
2 /
1 row inserted
SQL> INSERT INTO t_numtest VALUES (LPAD(''9'', 126, ''9''))
2 /
INSERT INTO t_numtest VALUES (LPAD(''9'', 126, ''9''))
ORA-01426: numeric overflow
SQL> SELECT DUMP(num) FROM t_numtest;
DUMP(NUM)
--------------------------------------------------------------------------------
Typ=2 Len=2: 255,11
Typ=2 Len=21: 255,8,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79
Como podemos ver, el número máximo aquí es 7.(7) * 10^124
, y tiene 19
dígitos centesimales para precisión, o 38
dígitos decimales.