Какова точность и масштаб По умолчанию для числа в Oracle?
при создании столбца типа NUMBER в Oracle у вас есть возможность не указывать точность или масштаб. Что делают эти значения по умолчанию, если их не указать?
5 ответов
число (точность, масштаб)
Если точность не указана, столбец хранит значения, как указано. Если масштаб не указан, масштаб равен нулю.
намного больше информации по адресу:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832
на NUMBER
тип может быть определен в различные стили:
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
где точность-это общее количество цифр, а масштаб-количество цифры справа или слева (отрицательная шкала) десятичной точки.
Oracle указывает ORA-01438 как
значение больше заданной точности, разрешенной для этого столбца
Как отмечено в таблице, эта проверка целостности активна, только если точность есть явно указать. В противном случае Oracle молча округляет вставленный или обновленный значение с использованием некоторого неопределенного метода.
Я считаю, что точность по умолчанию составляет 38, шкала по умолчанию равна нулю. Однако фактический размер экземпляра этого столбца является динамическим. Это займет столько места, сколько необходимо для хранения значения, или максимум 21 байт.
Oracle
сохраняет номера следующим образом:1 byte
власти, 1 byte
для первой значащей цифры (то есть одной перед разделителем), остальные для других цифр.
By digits
здесь Oracle
означает centesimal digits
(i. e. 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
как видим, максимальное число здесь -7.(7) * 10^124
, и он 19
сотенный цифр для точности, или 38
десятичных цифр.
на самом деле, вы всегда можете проверить это самостоятельно.
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)
)
;
выберите column_name, data_type, nullable, data_length, data_precision, data_scale из user_tab_columns, где table_name = 'клиенты';