При создании столбца типа NUMBER в Oracle у вас есть возможность не указывать точность или масштаб. Что делать по умолчанию, если вы не указали их?
Какова точность и масштаб по умолчанию для числа в Oracle?
Ответ 1
НОМЕР (точность, масштаб)
Если точность не указана, в столбце хранятся значения. Если масштаб не указан, масштаб равен нулю.
Более подробная информация:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832
Ответ 2
Тип 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 молча округляет вставленное или обновленное значение, используя неуказанный метод.
Ответ 3
Я считаю, что точность по умолчанию - 38, по умолчанию - ноль. Однако фактический размер экземпляра этого столбца является динамическим. Это займет столько места, сколько необходимо для хранения значения, или макс. 21 байт.
Ответ 4
Oracle
хранит числа следующим образом: 1 byte
для мощности, 1 byte
для первой значащей цифры (то есть до разделителя), остальные для остальных цифр.
В 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
десятичные цифры.
Ответ 5
Собственно, вы всегда можете проверить его самостоятельно.
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';
Ответ 6
Я расширяю спектр ответов, чтобы людям не приходилось самим пробовать это.
Это было сделано в Oracle Database 11g Express Edition Release 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