2015-04-01 20 views
7

W PostgreSQL, chciałbym przechowywać podpisane wartości -999.9 - 9999.9. Czy mogę użyć do tego celu numeric(5.1)?Czy typ danych Postgres NUMERIC może przechowywać wartości podpisane?

Albo jakiego typu powinienem użyć?

+0

precyzją postgresql numeryczna jest całkowita liczba cyfr znaczących, a skala jest liczba miejsc po przecinku wymagane. 9999.9 ma 5 cyfr i 1 miejsce dziesiętne, więc tak, "numeryczne (5.1)" będzie w porządku. Aby uzyskać szczegółowe informacje, patrz [dokumentacja] (http://www.postgresql.org/docs/9.3/static/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL). –

+0

jest numeryczne (5.1) OK dla -999,9? –

+2

Dlaczego nie spróbować wstawić wartości ujemnej i zobaczyć, co się dzieje? W każdym razie, 'numeric' jest częścią standardu sql i tak, jest podpisany. –

Odpowiedz

7

Z pewnością można użyć wartości arbitrary precision type numeric z dokładnością do 5 i skalą 1, just like @Simon commented, ale bez błędu składni. Użyj przecinka (,) zamiast kropki (.) w modyfikatora typu:

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 

znak minus i kropka w łańcuchu dosłowny nie wliczają dozwolonego maksimum znaczących cyfr (precision).
Jeśli nie musisz ograniczać długości, po prostu użyj numeric.
Jeśli trzeba wymusić minimalną i maksymalną, dodać check constraint:

CHECK (nr_column BETWEEN -999.9 AND 9999.9) 

numeric przechowuje numer dokładnie. Jeśli nie potrzebujesz absolutnej precyzji, a małe błędy zaokrąglania nie stanowią problemu, możesz również użyć jednego z typów zmiennoprzecinkowych: double precision (float8) lub (float4).

Albo, ponieważ dopuszcza się tylko jedną ułamkową cyfrę dziesiętną, można pomnożyć przez 10 i użyć integer, która byłaby najbardziej wydajną pamięcią: 4 bajty, brak błędów zaokrąglania i najszybsze przetwarzanie. Wystarczy użyć i udokumentować numer poprawnie.

Details for numeric types in the manual.

+0

Dzięki @Erwin, świetna odpowiedź! –