Разница между DECIMAL и NUMERIC
Какая разница между типом данных SQL NUMERIC и DECIMAL?
Если базы данных относятся к ним по-другому, я хотел бы знать, как минимум:
- SQL Server
- Oracle
- Db/2
- MySQL
- PostgreSQL
Кроме того, существуют ли различия в том, как интерпретаторы баз данных интерпретируют эти типы?
Ответы
Ответ 1
Они одинаковы для почти всех целей.
В свое время разные производители использовали разные имена (числовые/десятичные) для почти одного и того же. SQL-92 сделала их одинаковыми с одной незначительной разницей, которая может быть специфичной для поставщика:
NUMERIC должен быть точно таким же точным, как и определено - поэтому, если вы определяете 4 десятичных разряда, БД всегда должна хранить 4 десятичных разряда.
DECIMAL должен быть не менее точным, чем он определен. Это означает, что база данных может хранить больше цифр, чем указано (из-за закулисного хранилища, имеющего место для дополнительных цифр). Это означает, что база данных может хранить 1.00005
вместо 1.0000
, влияя на будущие вычисления.
В SQL Server Numeric определяется как идентичный Decimal во всех отношениях - оба всегда будут хранить только указанное количество знаков после запятой.
Ответ 2
Они синонимы, никакой разницы вообще.
По меньшей мере на SQL Server в стандартах ANSI SQL.
Этот SO ответ показывает некоторую разницу в ANSI, но я подозреваю, что в реализации они одинаковы
Ответ 3
Postgres: Без разницы
в документация описание в таблице 8.1 выглядит одинаково, но не объяснено, почему это упоминается отдельно, поэтому
по словам Тома Лейна post
Нет никакой разницы, в Postgres. Существует два типа имен, поскольку стандарт SQL требует мы принимаем оба имени. В быстром просмотре в стандарте появляется что это единственное отличие:
17)NUMERIC specifies the data type exact numeric, with the decimal
precision and scale specified by the <precision> and <scale>.
18)DECIMAL specifies the data type exact numeric, with the decimal
scale specified by the <scale> and the implementation-defined
decimal precision equal to or greater than the value of the
specified <precision>.
т.е. для DECIMAL реализация допускает больше цифр чем запрос слева от десятичной точки. Postgres не осуществлять эту свободу, чтобы между этими типами нас.
regards, tom lane
также на странице ниже docs ясно, что
Типы десятичные и числовые эквивалентны. Оба типа являются частью стандарт SQL.
а также в таблица псевдонимов decimal [ (p, s) ]
упоминается как псевдоним для numeric [ (p, s) ]