Apakah ada perbedaan antara DECIMAL dan NUMERIC dalam SQL Server?

127

Apakah ada perbedaan antara tipe data DECIMAL dan NUMERIC dalam SQL Server?

Kapan saya harus menggunakan DECIMAL dan kapan NUMERIC?

Dhanapal
sumber

Jawaban:

105

Mereka sama. Numerik secara fungsional setara dengan desimal.

MSDN: desimal dan numerik

Guffa
sumber
4
Kesetaraan fungsional tidak sama dengan kesetaraan. Sebenarnya, dalam slide instruktur dari kursus MS6232A ada komentar yang menambahkan bahwa mereka HAMPIR sama. Pada saat yang sama, tidak ada rekomendasi yang dibuat oleh Microsoft mengenai satu atau yang lain (namun DECIMAL lebih masuk akal, karena ini merupakan tipe data standar daripada tipe data lama dari Sybase). Masih bertanya-tanya apa perbedaan nyata (di balik layar) :-).
vstrien
22
@vstrien: Satu-satunya perbedaan yang saya dapat menemukan adalah bahwa dalam SQL-92 standar decimaladalah persis setepat menyatakan, sementara numericini setidaknya setepat dinyatakan. Dalam SQL Server keduanya sama persis dengan yang dinyatakan, yaitu tidak menggunakan fleksibilitas untuk numericstandar yang memungkinkan.
Guffa
17
Perhatikan, bagaimanapun, bahwa SQL Server tidak memperlakukan mereka sebagai dipertukarkan: jika, misalnya, Anda memiliki kolom "induk" dalam format "DECIMAL (18,0)", dan Anda mencoba menambahkan kunci asing untuk itu yang mereferensikan kolom dalam format "NUMERIC (18,0)", Anda akan mendapatkan kesalahan Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'. Keduanya harus NUMERIC (x, y), atau keduanya DECIMAL (x, y).
Doug_Ivison
7
@Guffa: jawaban Anda bertentangan dengan standar SQL2003 seperti dikutip di stackoverflow.com/a/759606/14731 . Secara khusus, decimaladalah setidaknya setepat menyatakan, sedangkan numericadalah persis setepat dinyatakan.
Gili
3
@ Geili: Ya, saat mengulas materi asli, sepertinya Anda benar bahwa saya memang menukarnya.
Guffa
41

Inilah yang kemudian dikatakan standar SQL2003 (§6.1 Tipe Data) tentang keduanya:

 <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
sumber
Anda punya tautan untuk ini?
gbn
2
Wiscorp memiliki versi konsep standar untuk diunduh ( wiscorp.com/sql_2003_standard.zip ), jika Anda menginginkan versi finalnya Anda harus membelinya ( en.wikipedia.org/wiki/SQL2003#Documentation_avilities ).
Joakim Backman
6
Perhatikan bahwa ini adalah standar SQL, bukan deskripsi tentang bagaimana SQL Server mengimplementasikannya.
Guffa
2
Senang mengetahui ini adalah aturan lain yang diputuskan Microsoft untuk diabaikan. :)
one.beat.consumer
11

Sepengetahuan saya tidak ada perbedaan antara tipe data NUMERIC dan DECIMAL. Mereka identik satu sama lain dan salah satunya dapat digunakan. Tipe data DECIMAL dan NUMERIC adalah tipe data numerik dengan presisi dan skala tetap.

Edit:

Berbicara dengan beberapa kolega mungkin ada hubungannya dengan DECIMAL sebagai standar SQL ANSI dan NUMERIC menjadi salah satu yang disukai Mircosoft karena lebih umum ditemukan dalam bahasa pemrograman. ...Mungkin ;)

kevchadders
sumber
Sunting: Tidak - lihat @ JoakimBackman jawaban di atas - ia mengutip standar SQL dengan NUMERIC dan DECIMAL.
Insinyur Terbalik
1

Mereka adalah sinonim, tidak ada perbedaan sama sekali. Tipe data numerik dan numerik adalah tipe data numerik dengan presisi dan skala tetap.

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

Jawaban Joakim Backman spesifik, tetapi ini dapat memberikan kejelasan tambahan untuknya.

Ada perbedaan kecil. Sesuai SQL Untuk Dummies, Edisi ke-8 (2013):

Tipe data DECIMAL mirip dengan NUMERIC. ... Perbedaannya adalah bahwa implementasi Anda dapat menentukan presisi lebih besar dari apa yang Anda tentukan - jika demikian, implementasi menggunakan presisi yang lebih besar. Jika Anda tidak menentukan presisi atau skala, implementasi menggunakan nilai default, seperti halnya dengan tipe NUMERIC.

Tampaknya perbedaan pada beberapa implementasi SQL adalah dalam integritas data. DECIMAL memungkinkan overflow dari apa yang didefinisikan berdasarkan pada beberapa sistem default, sedangkan NUMERIC tidak.

Alex Firsov
sumber
-2

Mereka persis sama. Ketika Anda menggunakannya konsisten. Gunakan salah satunya di basis data Anda

Faruk
sumber