Czy istnieje różnica między DECIMAL i NUMERIC w programie SQL Server?

127

Czy istnieje różnica między typami danych DECIMAL i NUMERIC w programie SQL Server?

Kiedy należy używać DECIMAL, a kiedy NUMERIC?

Dhanapal
źródło

Odpowiedzi:

105

Oni są tacy sami. Liczba jest funkcjonalnie równoważna z dziesiętną.

MSDN: dziesiętne i numeryczne

Guffa
źródło
4
Równoważność funkcjonalna to nie to samo, co równość. Właściwie na slajdach instruktora kursu MS6232A jest komentarz, że są one PRAWIE takie same. Jednocześnie Microsoft nie wydaje żadnych rekomendacji dotyczących jednego lub drugiego (jednak DECIMAL ma większy sens, ponieważ jest to standardowy typ danych zamiast starszego typu z Sybase). Wciąż zastanawiam się, jaka jest prawdziwa różnica (za ekranami) :-).
vstrien,
22
@vstrien: Jedyna różnica, że znajdę to, że w standardzie SQL-92 decimaljest dokładnie tak precyzyjny, jak oświadczył, gdy numericjest co najmniej tak dokładna jak oświadczył. W SQL Server oba są dokładnie tak precyzyjne, jak zadeklarowano, tj. Nie wykorzystują elastyczności, na numericjaką pozwala standard.
Guffa,
17
UWAGA jednak, że SQL Server nie traktuje ich jako wymiennych: jeśli na przykład masz kolumnę „nadrzędną” w formacie „DECIMAL (18,0)” i próbujesz dodać do niej klucz obcy , który odwołuje się do w kolumnie w formacie „NUMERIC (18,0)” pojawi się błąd Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'. Obie wartości muszą mieć wartość NUMERIC (x, y) lub obie wartości DECIMAL (x, y).
Doug_Ivison,
7
@Guffa: Twoja odpowiedź jest sprzeczna ze standardem SQL2003 cytowanym na stackoverflow.com/a/759606/14731 . W szczególności, decimaljest co najmniej tak precyzyjny, jak oświadczył, podczas gdy numericjest dokładnie tak precyzyjny, jak oświadczył.
Gili
3
@Gili: Tak, po recenzji oryginalnego materiału wydaje się, że masz rację, że zamieniłem je między sobą.
Guffa,
41

Oto co mówi wówczas standard SQL2003 (§6.1 Typy danych):

 <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
źródło
Masz do tego link?
gbn
2
Wiscorp ma wersję roboczą standardu do pobrania ( wiscorp.com/sql_2003_standard.zip ), jeśli chcesz wersję ostateczną, musisz ją kupić ( en.wikipedia.org/wiki/SQL2003#Documentation_availability ).
Joakim Backman
6
Zauważ, że jest to standard SQL, a nie opis tego, jak SQL Server go implementuje.
Guffa,
2
Miło wiedzieć, że jest to kolejna zasada, którą Microsoft postanowił zignorować. :)
one.beat.consumer
11

O ile mi wiadomo, nie ma różnicy między typami danych NUMERIC i DECIMAL. Są dla siebie synonimami i można użyć dowolnego z nich. Typy danych DECIMAL i NUMERIC to numeryczne typy danych o stałej precyzji i skali.

Edytować:

Rozmowa z kilkoma kolegami może mieć coś wspólnego z tym, że DECIMAL jest standardem ANSI SQL, a NUMERIC jest tym, który preferuje Mircosoft, ponieważ jest częściej spotykany w językach programowania. ...Może ;)

kevchadders
źródło
Do edycji: Nie - patrz odpowiedź @ JoakimBackman powyżej - cytuje standard SQL zarówno w postaci NUMERYCZNEJ, jak i DZIESIĘTNEJ.
Reversed Engineer
1

Są synonimami, nie ma żadnej różnicy. Typy danych dziesiętnych i liczbowych to numeryczne typy danych o stałej precyzji i skali.

-- 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
źródło
1

Odpowiedź Joakima Backmana jest konkretna, ale może to nadać jej dodatkową jasność.

Jest niewielka różnica. Zgodnie z SQL For Dummies, wydanie 8 (2013):

Typ danych DECIMAL jest podobny do typu NUMERIC. ... Różnica polega na tym, że Twoja implementacja może określić precyzję większą niż określona przez Ciebie - jeśli tak, implementacja używa większej precyzji. Jeśli nie określisz dokładności ani skali, implementacja użyje wartości domyślnych, tak jak ma to miejsce w przypadku typu NUMERIC.

Wydaje się, że różnica między niektórymi implementacjami SQL polega na integralności danych. DECIMAL umożliwia przepełnienie tego, co jest zdefiniowane na podstawie niektórych domyślnych ustawień systemowych, podczas gdy NUMERIC nie.

Alex Firsov
źródło
-2

Są dokładnie takie same. Kiedy go używasz, bądź konsekwentny. Użyj jednego z nich w swojej bazie danych

Faruk
źródło