2010-02-22 31 views
14

Tôi không thể tìm thấy bất kỳ nội dung nào từ chối hoặc xác nhận xem kiểu dữ liệu 'TIỀN' của SQL Server có phải là dấu phẩy động thập phân hay dấu phẩy động nhị phân hay không.Kiểu dữ liệu 'TIỀN' của SQL Server có phải là dấu phẩy động thập phân hay dấu phẩy động nhị phân không?

Trong mô tả nó nói rằng phạm vi loại MONEY là từ -2^63 đến 2^63 - 1 do đó loại này ngụ ý rằng nó phải là một điểm nổi nhị phân.

Nhưng trên this page nó liệt kê MONEY là số "chính xác". Loại gợi ý nào cho rằng MONEY có thể là dấu phẩy động thập phân (nếu không chính xác nó là gì? Hoặc định nghĩa chính xác là gì?)

Sau đó, nếu MONEY là dấu phảy động thập phân thì chênh lệch giữa MONEY và DECIMAL là gì (19,4)?

Trả lời

24

Cả. Nếu nó là một thực hiện các điểm nổi nó sẽ phải chịu sự không chính xác giống như FLOAT và các loại REAL. Xem Floating Point trên wikipedia.

TIỀN là loại fixed point.

Đó là một byte nhỏ hơn DECIMAL (19,4), vì nó có phạm vi nhỏ hơn (922,337,203,685,477,5808 đến 922,337,203,685,477,5807) thay vì (-10^15 + 1 đến 10^15-1).

+0

Bạn có chắc chắn rằng DECIMAL cần thêm một byte để lưu trữ tỷ lệ không? Không phải nó được lưu trữ như là một phần của loại cột? –

+0

@Mark: Hmm, tôi thấy quan điểm của bạn, nhưng nó phải được sử dụng để lưu trữ một cái gì đó đúng không? Đó là độ chính xác hoặc tỷ lệ. – hobodave

+0

@Mark: Bạn có biết? – hobodave

3

Tôi nghĩ sự khác biệt chính sẽ là không gian lưu trữ cần thiết.

DECIMAL(19,4) sẽ yêu cầu 9 lưu trữ byte

MONEY sẽ yêu cầu 8 lưu trữ byte

10

Để thấy sự khác biệt chúng ta có thể nhìn vào tài liệu:

Tài liệu cho money:

Data type Range             Storage 
money  -922,337,203,685,477.5808 to 922,337,203,685,477.5807 8 bytes 
smallmoney -214,748.3648 to 214,748.3647       4 bytes 

Số tiền và các loại dữ liệu smallmoney là chính xác đến mười phần nghìn của các đơn vị tiền tệ mà họ đại diện .

So với decimal:

Khi chính xác tối đa được sử dụng, giá trị hợp lệ là từ -10^38 + 1 đến 10^38 - 1.

Precision Storage 
1 - 9  5 bytes 
10 - 19  9 bytes 
20 - 28  13 bytes 
29 - 38  17 bytes 

Vì vậy, họ không chính xác tương đương, chỉ là tương tự. DECIMAL (19,4) có phạm vi lớn hơn một chút so với MONEY (nó có thể lưu trữ từ -10^15 + 0,0001 đến 10^15 - 0,0001), nhưng cũng cần thêm một byte dung lượng lưu trữ.

Nói cách khác, các công trình này:

CREATE TABLE Table1 (test DECIMAL(19,4) NOT NULL); 
INSERT INTO Table1 (test) VALUES 
(999999999999999.9999); 
SELECT * FROM Table1 

999999999999999.9999 

Nhưng điều này không:

CREATE TABLE Table1 (test MONEY NOT NULL); 
INSERT INTO Table1 (test) VALUES 
(999999999999999.9999); 
SELECT * FROM Table1 

Arithmetic overflow error converting numeric to data type money. 

Ngoài ra còn có một sự khác biệt ngữ nghĩa. Nếu bạn muốn lưu trữ các giá trị tiền tệ, bạn nên sử dụng loại tiền.

+0

Bạn đã chiếm đoạt câu trả lời của tôi và khiến nó trở nên huyền ảo hơn. :-P – hobodave

+0

tnx để ghi lên nhưng toàn bộ điểm là MONEY là điểm cố định khiến nó trở thành một con quái vật hoàn toàn khác. – kaptan

+1

@ Farzad: Không, nó không phải là một con thú hoàn toàn khác. DECIMAL cũng là điểm cố định. Việc chia tỷ lệ được cố định trong cả hai loại, nhưng với kiểu DECIMAL bạn có thể chọn những gì nó được cố định, nhưng với MONEY bạn không thể. –

Các vấn đề liên quan