Каковы Точность и Масштаб по умолчанию для Числа в Oracle?

57

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

Теги:
database
number-formatting

6 ответов

38
Лучший ответ

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

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

Более подробная информация:

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

  • 4
    «Как дано» означает с плавающей точкой.
  • 0
    Float сильно отличается от числового типа, который является дискретным. Итак, я думаю, что он не будет использовать поплавок
Показать ещё 2 комментария
19

Тип 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 молча округляет вставленное или обновленное значение, используя неуказанный метод.

  • 0
    Я голосую за этот ответ. Если вы определите столбец только как NUMBER, у вас будет максимальная точность и максимальный масштаб. Если вы определили столбец как NUMBER (5), точность равна 5, масштаб равен 0.
  • 0
    Что означает * точность в NUMBER ? Что, если я определю a NUMBER(*,0) и попытаюсь вставить 123456789123456789123456789123456789123456789 (т.е. 45 цифр)? Что будет храниться? и почему? Что такое математика?
Показать ещё 5 комментариев
15

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

  • 8
    Этот ответ не правильный. Вы можете легко привести встречный пример: create table ex(n number); insert into ex(n) values(1.5); select * from ex; Вы вернетесь 1.5 . С scale=0 вы вернетесь 1 . Это также задокументировано, например, в документах Oracle 11.2, которые просто NUMBER (без точности и без масштаба) приводит к «максимальному диапазону и точности».
9

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

4

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

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';

  • 1
    К сожалению, это не показывает точность и масштаб NUMBER по умолчанию, а просто возвращает NULL CUSTOMER_ID DATA_TYPE: NUMBER NULLABLE: N DATA_LENGTH: 22 DATA_PRECISION: (ноль) DATA_SCALE: (ноль)
  • 1
    Однако, если вы тестируете, вставляя очень большие числа, все будет обнаружено: CREATE TABLE TEST_NUMBER (N1 NUMBER); INSERT INTO TEST_NUMBER (N1) VALUES (98765432109876543210987654321098765432109876543210.01234567890123456789); ВЫБЕРИТЕ N1 ОТ TEST_NUMBER; выходы: 98765432109876543210987654321098765432110000000000
0

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

Это было сделано в 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    

Ещё вопросы

Сообщество Overcoder
Наверх
Меню