SQL Server'da DECIMAL ve NUMERIC arasında herhangi bir fark var mı?


127

SQL Server'da DECIMAL ve NUMERIC veri türleri arasında herhangi bir fark var mı?

DECIMAL'i ne zaman ve ne zaman NUMERIC kullanmalıyım?

Yanıtlar:


105

Onlar aynı. Sayısal, işlevsel olarak ondalık sayıya eşittir.

MSDN: ondalık ve sayısal


4
Fonksiyonel eşdeğerlik, eşitlikle aynı şey değildir. Aslında, eğitmenin MS6232A kursunun slaytlarında NEREDEYSE aynı olduklarına dair bir yorum var. Aynı zamanda, Microsoft tarafından bu veya diğeriyle ilgili herhangi bir öneri yapılmaz (ancak DECIMAL, Sybase'den eski bir veri türü yerine bir standardın veri türü olduğu için daha mantıklıdır). Hala gerçek farkın (ekranların arkasındaki) ne olduğunu merak ediyorum :-).
vstrien

22
@vstrien: Ben bulabilmesi tek fark, SQL-92 standardında olmasıdır decimalolduğunu tam olarak ise, beyan kadar hassas numericolduğunu , en azından ilan olarak kesin olarak. SQL Server'da her ikisi de tam olarak belirtildiği kadar kesindir, yani numericstandardın izin verdiği esnekliği kullanmaz .
Guffa

17
Bununla birlikte, SQL Server'ın bunları birbirinin yerine geçebilir olarak değerlendirmediğine DİKKAT EDİN: örneğin, "DECIMAL (18,0)" biçiminde bir "ana" sütununuz varsa ve bunun için bir yabancı anahtar eklemeye çalışırsanız, sütun "NUMERIC (18,0)" biçimindeyse, hatayı alırsınız Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'. İkisinin de NUMERIC (x, y) veya DECIMAL (x, y) olması gerekir.
Doug_Ivison

7
@Guffa: Cevabınız, stackoverflow.com/a/759606/14731 adresinde belirtilen SQL2003 standardıyla çelişiyor . Spesifik olarak, decimalbir en az ise, beyan edilen kesin olarak numericbir tam olarak ilan kesin olarak.
Gili

3
@Gili: Evet, orijinal materyali gözden geçirdiğimde haklısın, onları değiştirdim.
Guffa

41

SQL2003 standardının (§6.1 Veri Türleri) ikisi hakkında söylediği şey budur:

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

Bunun için bağlantınız var mı lütfen?
gbn

2
Wiscorp, indirme için standardın taslak bir sürümüne sahiptir ( wiscorp.com/sql_2003_standard.zip ), eğer son sürümü istiyorsanız onu satın almanız gerekir ( en.wikipedia.org/wiki/SQL2003#Documentation_availability ).
Joakim Backman

6
Bunun SQL standardı olduğunu, SQL Server'ın onu nasıl uyguladığının bir açıklaması olmadığını unutmayın.
Guffa

2
Bunun Microsoft'un görmezden gelmeye karar verdiği başka bir kural olduğunu bilmek güzel. :)
one.beat.consumer

11

Bildiğim kadarıyla NUMERIC ve DECIMAL veri türleri arasında fark yok. Birbirleriyle eş anlamlıdırlar ve her ikisi de kullanılabilir. DECIMAL ve NUMERIC veri türleri, sabit hassasiyet ve ölçekle sayısal veri türleridir.

Düzenle:

Birkaç meslektaşımla konuşmak belki de DECIMAL'in ANSI SQL standardı olması ve NUMERIC'in Mircosoft'un programlama dillerinde daha yaygın olarak bulunduğu için tercih ettiği bir şey olmasıyla bir ilgisi olabilir. ...Olabilir ;)


Düzenleme: Hayır - JoakimBackman'ın yukarıdaki cevabına bakın - SQL standardını hem NUMERIC hem de DECIMAL ile alıntılar.
Geriye döndürülmüş Mühendisi

1

Eşanlamlıdırlar, hiçbir farkları yoktur. Ondalık ve Sayısal veri türleri, sabit hassasiyet ve ölçekle sayısal veri türleridir.

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

Joakim Backman'ın cevabı spesifiktir, ancak bu ona daha fazla netlik getirebilir.

Küçük bir fark var. SQL For Dummies, 8. Baskı (2013) uyarınca:

DECIMAL veri türü NUMERIC'e benzer. ... Aradaki fark, uygulamanızın belirttiğinizden daha büyük bir kesinlik belirtebilmesidir - eğer öyleyse, uygulama daha yüksek kesinliği kullanır. Kesinlik veya ölçek belirtmezseniz, uygulama, NUMERIC türünde olduğu gibi varsayılan değerleri kullanır.

Görünüşe göre SQL'in bazı uygulamalarındaki fark veri bütünlüğünde. DECIMAL, NUMERIC'in yapmadığı bazı sistem varsayılanlarına göre tanımlanandan taşmaya izin verir.


-2

Onlar tamamen aynı. Kullandığınızda tutarlı olun. Veritabanınızda bunlardan birini kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.