NUMBER(7, 0)
просто ограничивает область значений.
Их внутренние представления не отличаются:
CREATE TABLE t_pk (col1 NUMBER(7, 0) NOT NULL, col2 NUMBER(38) NOT NULL)
INSERT
INTO t_pk
VALUES (9999999, 9999999)
SELECT DUMP(col1), DUMP(col2)
FROM t_pk
DUMP(col1) DUMP(col2)
--- ---
Typ=2 Len=5: 196,10,100,100,100 Typ=2 Len=5: 196,10,100,100,100
В Oracle
NUMBER
s сохраняются как сотенные цифры числового значения, нормализованного до 0.01 <= N < 1
и с добавлением показателя степени.
В приведенном выше примере:
196
является показателем 192
(4
).
10
является десятичным 9
100
десятичные 99
Целое число читается в десятичном виде как 00.09 99 99 99 * (100 ^ 4) = 9,999,999
Чем больше цифр требуется для удовлетворения запрошенной точности, тем больше их будет сохранено, конечно.
Когда вы вставляете точное значение в менее точный столбец, оно просто округляется до точности столбца и сохраняется округленным.
Следовательно, с точки зрения производительности безопасно объявить столбец NUMBER(38)
, поскольку он не подразумевает накладных расходов на NUMBER(7, 0)
(для чисел, соответствующих обоим типам).
Однако, если ваши PRIMARY KEY
s являются целочисленными по природе, вам лучше указать точность как 0
, чтобы убедиться, что никакое дробное значение не попадет в вашу таблицу.
Обновление:
@ Mac также указал, что клиенты могут полагаться на тип данных столбца для определения домена значений.
Если ваше приложение ожидает INT32
, вы должны сделать свой номер NUMBER(9)
или ниже (или любой тип, который ваш клиент считает конвертируемым в Int32
).