sql-server — Есть ли разница между DECIMAL и NUMERIC в SQL Server?" />

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

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

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

121 голос | спросил Dhana 17 AMpFri, 17 Apr 2009 11:38:19 +040038Friday 2009, 11:38:19

7 ответов


0

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

MSDN: десятичный и цифровой

ответил Guffa 17 AMpFri, 17 Apr 2009 11:43:37 +040043Friday 2009, 11:43:37
0

Вот что говорит стандарт 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>.
ответил Joakim Backman 17 PMpFri, 17 Apr 2009 12:49:08 +040049Friday 2009, 12:49:08
0

Насколько мне известно, нет никакой разницы между ЦИФРОВЫМ и ДЕСЯТИЧНЫМ типами данных. Они являются синонимами друг другу, и любой из них может быть использован. Типы данных DECIMAL и NUMERIC - это числовые типы данных с фиксированной точностью и масштабом.

Edit:

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

ответил kevchadders 17 AMpFri, 17 Apr 2009 11:46:31 +040046Friday 2009, 11:46:31
0

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

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

  

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

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

ответил Alex Firsov 26 PM000000110000000231 2017, 23:52:02
0

Они являются синонимами, без разницы. Типы данных «Десятичные» и «Числовые» - это числовые типы данных с фиксированной точностью и масштабом.

-- 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
ответил Raman Grewal 26 J000000Tuesday16 2016, 19:52:35
0

Они на самом деле эквивалентны, но они являются независимыми типами, а не технически синонимами, такими как ROWVERSION и TIMESTAMP - хотя их, возможно, упоминали как синонимы в документации когда-то. Это немного другое значение синонима (например, они неразличимы, за исключением имени, ни один не является псевдонимом для другого). Иронично, правда?

На самом деле я интерпретирую формулировку в MSDN: Эти типы идентичны, они просто имеют разные имена.

Кроме значений type_id, все здесь идентично:

SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');

Я абсолютно не знаю каких-либо поведенческих различий между ними, и, возвращаясь к SQL Server 6.5, я всегда считал их взаимозаменяемыми на 100%.

for DECIMAL(18,2) and NUMERIC(18,2)? Assigning one to the other is technically a "conversion"?

Только если вы делаете это явно. Вы можете легко это доказать, создав таблицу, а затем проверив план запросов на наличие запросов, которые выполняют явные или - вы можете ожидать - неявные преобразования. Вот простая таблица:

    CREATE TABLE [dbo].[NumDec]
(
    [num] [numeric](18, 0) NULL,
    [dec] [decimal](18, 0) NULL
);

Теперь выполните эти запросы и запишите план:

DECLARE @num NUMERIC(18,0);
DECLARE @dec DECIMAL(18,0);

    SELECT 
      CONVERT(DECIMAL(18,0), [num]), -- conversion
      CONVERT(NUMERIC(18,0), [dec])  -- conversion
    FROM dbo.NumDec
    UNION ALL SELECT [num],[dec] 
      FROM dbo.NumDec WHERE [num] = @dec  -- no conversion
    UNION ALL SELECT [num],[dec] 
      FROM dbo.NumDec WHERE [dec] = @num; -- no conversion

у нас есть явные преобразования там, где мы их просили, но нет явных преобразований там, где мы могли бы их ожидать. Кажется, оптимизатор рассматривает их как взаимозаменяемые. Для получения более подробной информации перейдите по ссылке Десятичные и числовые

Лично я предпочитаю использовать термин DECIMAL только потому, что он гораздо более точный и описательный. БИТ тоже "числовой".

ответил Coder Girl 19 12018vEurope/Moscow11bEurope/MoscowMon, 19 Nov 2018 13:51:47 +0300 2018, 13:51:47
0

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

ответил Faruk 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 05 Sep 2018 18:28:43 +0300 2018, 18:28:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132