pg中money類型以固定的分數精度存儲貨幣金額;如下表:
| 名稱 | 存儲大小 | 描述 | 范圍 |
| money | 8bytes | 貨幣金額 | -92233720368547758.08 to +92233720368547758.07 |
表中顯示的范圍假設有兩位小數。
分數精度由數據庫的lc_monetary設置決定。
postgres=# show lc_monetary; lc_monetary ------------- en_US.UTF-8 (1 row) postgres=#
輸入可以采用多種格式,包括整數和浮點數值,以及典型的貨幣格式,如'$1,000.00'。輸出結果通常是后一種形式,但取決於語言環境。
由於該數據類型的輸出結果是位置敏感的,因此將貨幣數據加載到具有不同的lc_monetary設置的數據庫中可能無法工作。為了避免出現問題,在將轉儲恢復到新數據庫之前,請確保lc_monetary的值與轉儲的數據庫中的值相同或相等。
numeric, int, 和bigint型數據類型的值可以轉換為money類型。從real和double precision類型轉換可以通過先轉換為numeric類型來完成,例如:
postgres=# SELECT '12.34'::float8::numeric::money; money -------- $12.34 (1 row) postgres=#
但是,不建議這樣做。不應該使用浮點數來處理money類型,因為可能會出現舍入錯誤。
money類型可以轉換為numeric,而不損失精度。轉換成其他類型可能會失去精度,還必須分兩個階段完成:
postgres=# SELECT '52093.89'::money::numeric::float8; float8 ---------- 52093.89 (1 row) postgres=#
money類型除以整數值時,小數部分截斷為零。要得到四舍五入的結果,可以用浮點值除,或者在除之前將money值轉換為numeric值,然后再轉換回money值。(后者更可取,以避免喪失精度的風險。)當一個money值除以另一個money值時,結果是雙倍精度(即,一個純粹的數字,而不是money);貨幣單位在除法中相互抵消。
postgres=# create table money_test(m money);
CREATE TABLE
postgres=# insert into money_test values(123.456);
INSERT 0 1
postgres=# insert into money_test values(123.454);
INSERT 0 1
postgres=# show lc_monetary;
lc_monetary
-------------
zh_CN.UTF-8
(1 row)
postgres=# select * from money_test;
m
----------
¥123.46
¥123.45
(2 rows)
postgres=# set lc_monetary='en_US.UTF-8';
SET
postgres=# select * from money_test;
m
---------
$123.46
$123.45
(2 rows)
postgres=# select sum(m) from money_test;
sum
---------
$246.91
(1 row)
postgres=#
