Какова точность и масштаб По умолчанию для числа в 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 = 'клиенты';