Каковы Точность и Масштаб по умолчанию для Числа в Oracle? - PullRequest
60 голосов
/ 27 февраля 2009

При создании столбца типа NUMBER в Oracle вы можете не указывать точность или масштаб. Что делают эти настройки по умолчанию, если вы их не указали?

Ответы [ 6 ]

38 голосов
/ 27 февраля 2009

НОМЕР (точность, масштаб)

Если точность не указана, в столбце хранятся значения, как указано. Если масштаб не указан, масштаб равен нулю.

Гораздо больше информации на:

http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832

22 голосов
/ 24 апреля 2015

Тип NUMBER может быть указан в различных стилях :

                Resulting  Resulting  Precision
Specification   Precision  Scale      Check      Comment
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
NUMBER          NULL       NULL       NO         <a href="http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#sthref119" rel="noreferrer">'maximum range</a> and <a href="http://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF30020" rel="noreferrer">precision'</a>,
                                                 values are stored <a href="http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832" rel="noreferrer">'as given'</a>
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 молча округляет вставленный или обновленный значение с использованием некоторого неуказанного метода.

14 голосов
/ 27 февраля 2009

Я считаю, что точность по умолчанию равна 38, масштаб по умолчанию равен нулю. Однако фактический размер экземпляра этого столбца является динамическим. Для хранения значения потребуется столько места, сколько нужно, или максимум 21 байт.

9 голосов
/ 02 марта 2009

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 десятичные цифры.

4 голосов
/ 07 декабря 2012

На самом деле, вы всегда можете проверить это самостоятельно.

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) ) ;</p> <p>select column_name, data_type, nullable, data_length, data_precision, data_scale from user_tab_columns where table_name ='CUSTOMERS';

1 голос
/ 18 декабря 2018

Я расширяю спектр ответов, чтобы людям не приходилось пробовать это для себя.

Это было сделано в Oracle Database 11g Express Edition, выпуск 11.2.0.2.0 - Производство.

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    
...