Есть ли разница между DECIMAL и NUMERIC в SQL Server?


127

Есть ли разница между типами данных DECIMAL и NUMERIC в SQL Server?

Когда мне следует использовать DECIMAL, а когда NUMERIC?

Ответы:


105

Они одинаковые. Числовое значение функционально эквивалентно десятичному.

MSDN: десятичный и числовой


4
Функциональная эквивалентность - это не то же самое, что равенство. Собственно, на слайдах инструктора курса MS6232A добавлен комментарий, что они ПОЧТИ одинаковы. В то же время Microsoft не дает никаких рекомендаций относительно того или другого (однако DECIMAL имеет больше смысла, поскольку это стандартный тип данных, а не устаревший тип данных от Sybase). Все еще интересно, в чем реальная разница (за экранами) :-).
встретен

22
@vstrien: Единственное различие, которое я могу найти, заключается в том, что в стандарте SQL-92 decimalон точно такой же, как заявлено, но numeric, по крайней мере, так же точен, как заявлено. В SQL Server и то, и другое точно так же точно, как заявлено, т. Е. Не использует гибкость, numericкоторую позволяет стандарт.
Guffa

17
ПРИМЕЧАНИЕ, однако, SQL Server не рассматривает их как взаимозаменяемые: если, например, у вас есть «родительский» столбец в формате «DECIMAL (18,0)», и вы пытаетесь добавить для него внешний ключ, который ссылается на столбец в формате «ЧИСЛО (18,0)», вы получите сообщение об ошибке Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'. Они оба должны быть ЧИСЛАМИ (x, y) или оба должны быть ДЕСЯТИЧНЫМ (x, y).
Doug_Ivison 02

7
@Guffa: ваш ответ противоречит стандарту SQL2003, указанному на stackoverflow.com/a/759606/14731 . В частности, decimalэто по крайней мере , так точно , как заявлено, в то время как numericэто точно так точен , как заявлено.
Gili

3
@Gili: Да, при просмотре оригинального материала кажется, что вы правы, что я поменял их местами.
Guffa

41

Это то, что стандарт SQL2003 (§6.1 Типы данных) говорит о двух:

 <exact numeric type> ::=
    NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DECIMAL [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DEC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | SMALLINT
  | INTEGER
  | INT
  | BIGINT

 ...

21) NUMERIC specifies the data type
    exact numeric, with the decimal
    precision and scale specified by the
    <precision> and <scale>.

22) 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>.

У вас есть ссылка для этого?
gbn 03

2
У Wiscorp есть черновая версия стандарта для загрузки ( wiscorp.com/sql_2003_standard.zip ), если вы хотите получить окончательную версию, вы должны ее купить ( en.wikipedia.org/wiki/SQL2003#Documentation_availability ).
Joakim Backman

6
Обратите внимание, что это стандарт SQL, а не описание того, как SQL Server его реализует.
Guffa

2
Приятно осознавать, что это еще одно правило, которое Microsoft решила игнорировать. :)
one.beat.consumer

11

Насколько мне известно, нет разницы между типами данных NUMERIC и DECIMAL. Они синонимичны друг другу, и можно использовать любой из них. Типы данных DECIMAL и NUMERIC - это числовые типы данных с фиксированной точностью и масштабом.

Редактировать:

В разговоре с несколькими коллегами, возможно, это как-то связано с тем, что DECIMAL является стандартом ANSI SQL, а NUMERIC - тем, что предпочитает Mircosoft, поскольку он чаще встречается в языках программирования. ...Может быть ;)


Повторите редактирование: Нет - см. Ответ @ JoakimBackman выше - он цитирует стандарт SQL как с NUMERIC, так и с DECIMAL.
Reversed Engineer

1

Это синонимы, никакой разницы. Типы данных Decimal и Numeric - это числовые типы данных с фиксированной точностью и масштабом.

-- Initialize a variable, give it a data type and an initial value

declare @myvar as decimal(18,8) or numeric(18,8)----- 9 bytes needed

-- Increse that the vaue by 1

set @myvar = 123456.7

--Retrieve that value

select @myvar as myVariable

1

Ответ Йоакима Бакмана конкретен, но он может внести в него дополнительную ясность.

Есть небольшая разница. Согласно SQL для чайников, 8-е издание (2013 г.):

Тип данных DECIMAL аналогичен NUMERIC. ... Разница в том, что ваша реализация может указывать точность, превышающую указанную вами - в этом случае реализация использует более высокую точность. Если вы не укажете точность или масштаб, реализация будет использовать значения по умолчанию, как это делается с типом NUMERIC.

Кажется, что разница в некоторых реализациях SQL заключается в целостности данных. DECIMAL допускает переполнение из того, что определено на основе некоторых системных значений по умолчанию, тогда как NUMERIC - нет.


-2

Они точно такие же. Когда вы его используете, будьте последовательны. Используйте один из них в своей базе данных

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.