Có sự khác biệt nào giữa DECIMAL và NUMERIC trong SQL Server không?


127

Có sự khác biệt nào giữa các kiểu dữ liệu DECIMAL và NUMERIC trong SQL Server không?

Khi nào tôi nên sử dụng DECIMAL và khi nào thì SỐ?

Câu trả lời:


105

Họ giống nhau. Số là chức năng tương đương với số thập phân.

MSDN: số thập phân và số


4
Tương đương chức năng không giống như bình đẳng. Trên thực tế, trong các slide của người hướng dẫn về khóa học MS6232A, có một bình luận thêm rằng họ CÒN giống nhau. Đồng thời, Microsoft không đưa ra khuyến nghị nào liên quan đến cái này hay cái khác (tuy nhiên, DECIMAL có ý nghĩa hơn, vì đó là kiểu dữ liệu tiêu chuẩn thay vì kiểu dữ liệu kế thừa từ Sybase). Vẫn đang tự hỏi sự khác biệt thực sự (đằng sau màn hình) là gì :-).
vstrien

22
@vstrien: Sự khác biệt duy nhất mà tôi có thể tìm thấy là trong tiêu chuẩn SQL-92 decimalchính xác như chính xác khi được công bố, trong khi numericít nhất chính xác như công bố. Trong SQL Server cả hai đều chính xác như được khai báo, tức là nó không sử dụng tính linh hoạt cho numerictiêu chuẩn cho phép.
Guffa

17
Tuy nhiên, LƯU Ý rằng SQL Server không coi chúng là có thể hoán đổi cho nhau: ví dụ: nếu bạn có cột "cha mẹ" ở định dạng "DECIMAL (18,0)" và bạn cố gắng thêm khóa ngoại cho nó tham chiếu cột ở định dạng "NUMERIC (18,0)", bạn sẽ gặp lỗi Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'. Cả hai phải là NUMERIC (x, y) hoặc cả hai đều là DECIMAL (x, y).
Doug_Ivison

7
@Guffa: câu trả lời của bạn mâu thuẫn với tiêu chuẩn SQL2003 như được trích dẫn tại stackoverflow.com/a/759606/14731 . Cụ thể, decimalít nhất chính xác như tuyên bố, trong khi đó numericchính xác chính xác như công bố.
Gili

3
@Gili: Vâng, khi xem xét các tài liệu ban đầu, có vẻ như bạn đã đúng khi tôi trao đổi chúng xung quanh.
Guffa

41

Đây là những gì sau đó tiêu chuẩn SQL2003 (§6.1 Kiểu dữ liệu) nói về hai:

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

Bạn có liên kết cho điều này xin vui lòng?
gbn

2
Wiscorp có phiên bản nháp của tiêu chuẩn để tải xuống ( wiscorp.com/sql_2003_stiteria.zip ), nếu bạn muốn phiên bản cuối cùng, bạn phải mua nó ( en.wikipedia.org/wiki/Query2003#Documentation_avcellence ).
Joakim Backman

6
Lưu ý rằng đây là tiêu chuẩn SQL, không phải là mô tả về cách SQL Server thực hiện nó.
Guffa

2
Rất vui được biết đây là một quy tắc khác Microsoft quyết định bỏ qua. :)
one.beat.consumer

11

Theo hiểu biết của tôi, không có sự khác biệt giữa các loại dữ liệu NUMERIC và DECIMAL. Chúng đồng nghĩa với nhau và một trong hai có thể được sử dụng. Các kiểu dữ liệu DECIMAL và NUMERIC là các kiểu dữ liệu số với độ chính xác và tỷ lệ cố định.

Biên tập:

Nói chuyện với một vài trường đại học có lẽ nó có liên quan gì đó với DECIMAL là tiêu chuẩn ANSI SQL và NUMERIC là một Mircosoft thích vì nó thường được tìm thấy trong các ngôn ngữ lập trình. ...Có lẽ ;)


Chỉnh sửa lại: Không - xem câu trả lời của @ JoakimBackman ở trên - anh ta trích dẫn tiêu chuẩn SQL bằng cả NUMERIC và DECIMAL.
Kỹ sư đảo ngược

1

Chúng là các từ đồng nghĩa, không có sự khác biệt nào cả. Các loại dữ liệu Số và Số là các loại dữ liệu số với độ chính xác và tỷ lệ cố định.

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

Câu trả lời của Joakim Backman là cụ thể, nhưng điều này có thể mang lại sự rõ ràng hơn cho nó.

Có một sự khác biệt nhỏ. Theo SQL cho người giả, phiên bản thứ 8 (2013):

Kiểu dữ liệu DECIMAL tương tự như NUMERIC. ... Sự khác biệt là việc triển khai của bạn có thể chỉ định độ chính xác lớn hơn mức bạn chỉ định - nếu vậy, việc triển khai sử dụng độ chính xác cao hơn. Nếu bạn không chỉ định độ chính xác hoặc tỷ lệ, việc triển khai sẽ sử dụng các giá trị mặc định, giống như với kiểu SỐ.

Có vẻ như sự khác biệt về một số triển khai của SQL nằm ở tính toàn vẹn dữ liệu. DECIMAL cho phép tràn từ những gì được xác định dựa trên một số giá trị mặc định của hệ thống, trong đó như NUMERIC thì không.


-2

Họ đều giống hệt nhau. Khi bạn sử dụng nó phải nhất quán. Sử dụng một trong số chúng trong cơ sở dữ liệu của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.