Чи є різниця між DECIMAL і NUMERIC у SQL Server?


127

Чи є різниця між типами даних DECIMAL та NUMERIC у SQL Server?

Коли я повинен використовувати DECIMAL і коли NUMERIC?

Відповіді:


105

Вони однакові. Числовий функціонально еквівалент десятковому.

MSDN: десятковий і числовий


4
Функціональна еквівалентність не те саме, що рівність. Насправді, в слайдах інструктора курсу MS6232A є коментар, який додається, що вони НАЙКОШЕ однакові. У той же час, Microsoft не дає жодних рекомендацій щодо того чи іншого (однак DECIMAL має більше сенсу, оскільки це стандарт даних типу замість застарілого типу даних від Sybase). Досі цікаво, яка реальна різниця (за екранами) :-).
vstrien

22
@vstrien: Єдина відмінність , яке можна знайти в тому , що в стандарті SQL-92 decimalє в точності так точний , як заявлено, в той час як numericце по крайней мере , так точно , як заявлено. У SQL Server обидва настільки ж точні, як і декларовані, тобто він не використовує гнучкість, numericяку дозволяє стандарт.
Guffa

17
Зауважте, що SQL Server не сприймає їх як взаємозамінні: якщо, наприклад, у вас є "батьківський" стовпець у форматі "ДЕКІМАЛЬНИЙ (18,0)" ", і ви намагаєтесь додати для нього зовнішній ключ, на який посилається стовпця у форматі "NUMERIC (18,0)" ", ви отримаєте помилку Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'. Вони повинні бути як NUMERIC (x, y), так і обидві - DECIMAL (x, y).
Doug_Ivison

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

3
@Gili: Так, переглядаючи оригінальний матеріал, здається, ти маєш рацію, що я їх обміняв.
Гуффа

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

2
Wiscorp має проект версії стандарту для завантаження ( wiscorp.com/sql_2003_standard.zip ), якщо ви хочете остаточну версію, ви повинні її придбати ( en.wikipedia.org/wiki/SQL2003#Documentation_available ).
Йоаким Бекман

6
Зауважте, що це стандарт SQL, а не опис того, як SQL Server реалізує його.
Гуффа

2
Приємно знати, що це ще одне правило, яке Microsoft вирішила ігнорувати. :)
one.beat.consumer

11

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

Редагувати:

Звертаючись до кількох колег, можливо, це має щось спільне з тим, що DECIMAL є стандартом ANSI SQL, а NUMERIC є одним, який Mircosoft вважає за краще, як його частіше зустрічається в мовах програмування. ...Може бути ;)


Повторіть редагування: Ні - див. Відповідь @ JoakimBackman вище - він цитує стандарт SQL як NUMERIC, так і DECIMAL.
Інженер, що

1

Вони є синонімами, різниці взагалі немає. Декальні та числові типи даних - це числові типи даних із фіксованою точністю та масштабом.

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