Подтвердить что ты не робот

Decimal (s, p) или число (s, p)?

недавно, работая над проектом миграции db2 → oracle, мы столкнулись с этой ситуацией. разработчики непреднамеренно создавали новые структуры таблиц, используя десятичные (s, p) столбцы. Я не помнил, что Oracle поддерживал это, но затем некоторое копание показало, что его тип данных ANSI поэтому поддерживается oracle.

Однако вопрос для меня остался -

  • Как эти данные обрабатываются внутри?
  • существует ли стоимость использования типов ANSI вместо встроенных в Oracle типов?
  • Будет ли влияние во время переноса данных, если целевой тип был встроенным в Oracle?
4b9b3361

Ответ 1

В Oracle они одинаковы:

Операторы SQL, которые создают таблицы и кластеры, также могут использовать данные ANSI типы и типы данных из продуктов IBM SQL/DS и DB2. оракул распознает имя типа данных ANSI или IBM, которое отличается от Oracle Имя типа данных базы данных. Он преобразует тип данных в эквивалентный Тип данных Oracle, записывает тип данных Oracle как имя тип данных столбца и сохраняет данные столбца в типе данных Oracle на основе преобразований, показанных в следующих таблицах.

В приведенной ниже таблице показано, что DECIMAL(p,s) обрабатывается внутри NUMBER(p,s):

SQL> create table t (a decimal(*,5), b number (*, 5));

Table created

SQL> desc t;
Name Type        Nullable Default Comments 
---- ----------- -------- ------- -------- 
A    NUMBER(*,5) Y                         
B    NUMBER(*,5) Y  

Тем не менее, значение по умолчанию для 0 для DECIMAL равно 0, что означает, что DECIMAL(*) рассматривается как NUMBER(*, 0), т.е. INTEGER:

SQL> create table t (a decimal, b number, c decimal (5), d decimal (5));

Table created

SQL> desc t;
Name Type      Nullable Default Comments 
---- --------- -------- ------- -------- 
A    INTEGER   Y                         
B    NUMBER    Y                         
C    NUMBER(5) Y                         
D    NUMBER(5) Y   

Ответ 2

На самом деле, существует разница между десятичным числом и числом. Decimal будет усекать значение, которое является чрезмерно масштабным, число будет округлено от значения.