Какова точность и масштаб числа по умолчанию в Oracle?
-
09-09-2019 - |
Вопрос
При создании столбца типа NUMBER в Oracle у вас есть возможность не указывать точность или масштаб.Что делают эти значения по умолчанию, если вы их не укажете?
Решение
НОМЕР (точность, масштаб)
Если точность не указана, в столбце сохраняются заданные значения.Если масштаб не указан, масштаб равен нулю.
Еще больше информации по адресу:
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 'максимальная дальность and точность', values are stored 'как дано' 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
для первой значащей цифры (то есть единицы перед разделителем), остальные для остальных цифр.
К digits
здесь Oracle
означает centesimal digits
(я.е. 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)
)
;
select column_name, data_type, nullable, data_length, data_precision, data_scale
from user_tab_columns where table_name ='CUSTOMERS';
Я расширяю ответ спектра, чтобы людям не приходилось пробовать его самостоятельно.
Это было сделано в Oracle Database 11g Express Edition Release 11.2.0.2.0 — Production.
CREATE TABLE CUSTOMERS
(
CUSTOMER_ID NUMBER NOT NULL,
FOO FLOAT NOT NULL,
JOIN_DATE DATE NOT NULL,
CUSTOMER_STATUS VARCHAR2(8) NOT NULL,
CUSTOMER_NAME VARCHAR2(20) NOT NULL,
CREDITRATING VARCHAR2(10)
);
select column_name, data_type, nullable, data_length, data_precision, data_scale
from user_tab_columns where table_name ='CUSTOMERS';
Который дает
COLUMN_NAME DATA_TYPE NULLABLE DATA_LENGTH DATA_PRECISION DATA_SCALE
CUSTOMER_ID NUMBER N 22
FOO FLOAT N 22 126
JOIN_DATE DATE N 7
CUSTOMER_STATUS VARCHAR2 N 8
CUSTOMER_NAME VARCHAR2 N 20
CREDITRATING VARCHAR2 Y 10