Какова точность и масштаб числа по умолчанию в Oracle?

StackOverflow https://stackoverflow.com/questions/593197

Вопрос

При создании столбца типа 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    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top