2015-04-01 14 views
7

Trong PostgreSQL, tôi muốn lưu trữ các giá trị đã ký -999.9 - 9999.9. Tôi có thể sử dụng numeric(5.1) cho mục đích này không?Có thể loại dữ liệu Postgres NUMERIC lưu trữ các giá trị đã ký không?

Hoặc tôi nên sử dụng loại nào?

+0

Độ chính xác của một số postgresql là tổng số chữ số có nghĩa, và quy mô là số chữ số thập phân cần thiết. 9999.9 có 5 chữ số và 1 chữ số thập phân, vì vậy có, 'số (5.1)' sẽ là OK. Xem [tài liệu] (http://www.postgresql.org/docs/9.3/static/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL) để biết chi tiết. –

+0

là số (5.1) OK cho -999.9? –

+2

Tại sao bạn không thử và chèn một giá trị âm và xem điều gì sẽ xảy ra? Dù sao, 'số' là một phần của tiêu chuẩn sql, và có, nó đã được ký. –

Trả lời

7

Bạn chắc chắn có thể sử dụng arbitrary precision type numeric với độ chính xác là 5 và tỷ lệ 1, just like @Simon commented nhưng không có lỗi cú pháp. Sử dụng một dấu phẩy (,) thay cho dấu chấm (.) trong modifier loại:

SELECT numeric(5,1) '-999.9' AS nr_lower 
    , numeric(5,1) '9999.9' AS nr_upper; 

nr_lower | nr_upper 
----------+---------- 
    -999.9 | 9999.9 

Các dấu trừ và dấu chấm trong chuỗi chữ không được tính vào tối đa cho phép của chữ số có nghĩa (precision).
Nếu bạn không cần giới hạn độ dài, chỉ cần sử dụng numeric.
Nếu bạn cần để thực thi tối thiểu và tối đa, thêm một check constraint:

CHECK (nr_column BETWEEN -999.9 AND 9999.9) 

numeric cửa hàng số điện thoại chính xác. Nếu bạn không cần độ chính xác tuyệt đối và lỗi làm tròn nhỏ không có vấn đề gì, bạn cũng có thể sử dụng một trong các loại dấu phẩy động double precision (float8) hoặc real (float4). Hoặc, vì bạn chỉ cho phép một chữ số thập phân phân số, bạn có thể nhân với 10 và sử dụng integer, đây sẽ là bộ nhớ hiệu quả nhất: 4 byte, không làm tròn lỗi và xử lý nhanh nhất. Chỉ cần sử dụng và ghi lại số lượng đúng cách.

Details for numeric types in the manual.

+0

Cảm ơn @Erwin, câu trả lời tuyệt vời! –

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