Postgresql

是否可以在 PostgreSQL 中為貨幣數據類型插入未格式化的數據

  • August 24, 2017

預設情況下,PostgreSQL 的money數據類型插入帶有貨幣程式碼和分組的值。我觀察到它總是用$.

  1. 如何插入特定於語言環境的值?
  2. 如何使用自己的數字分組和十進制分組格式插入值?
  3. 如何讀取未格式化的數據?
  4. 為什麼 PostgreSQL 的貨幣數據類型與 MS SQL 的貨幣數據類型不同?
  1. 如何插入特定於語言環境的值?

相應地設置**LC_MONETARY**。(僅影響money格式化輸出中的類型和一些貨幣細節!)您可以將其作為整個數據庫集群的永久預設設置postgresql.conf,僅用於目前會話SET或僅用於事務SET LOCAL。(或以其他幾種方式。

在 Windows 機器上展示:

BEGIN;
CREATE TEMP TABLE mdemo(id serial, m money);

SET LOCAL lc_monetary = 'German_Austria.1252';
INSERT INTO mdemo(m) VALUES ('123.45');

SET LOCAL lc_monetary = 'English_US.1252';
INSERT INTO mdemo(m) VALUES ('123.45');
TABLE mdemo;

id |     m
----+------------
 1 | $12,345.00
 2 |    $123.45


ROLLBACK;  -- to clean up

如您所見,字元串文字 ‘123.45’ 是根據LC_MONETARY. 在奧地利,點 ( .) 用作組分隔符並且,是小數點。而在美國則相反。

找到正確的語言環境名稱很重要。手冊:

您的系統上可用的語言環境的名稱取決於作業系統供應商提供的內容和安裝的內容。在大多數 Unix 系統上,該命令locale -a將提供可用語言環境的列表。Windows 使用更詳細的語言環境名稱,例如German_Germanyor Swedish_Sweden.1252,但原理相同。


  1. 如何使用自己的數字分組和十進制分組格式插入值?

用於從字元串文字to_number()生成一個numeric值,該值又可以轉換為money.

說,你有這個文字:'12,454.8-': 2 位,,作為組分隔符,3 位,.作為小數點,1 位,掛號。這不起作用:

SELECT money '12,454.8-';

作品:

SELECT to_number('12,454.8-', '99,999.9S')::money

由於我們閱讀的是通用數字,因此更通用的設置LC_NUMERIC適用於導入,而設置LC_MONETARY仍然決定了結果的顯示方式!從numerictomoney的轉換與語言環境無關(不可變)。不要混淆。

第二個參數中的模式也很棘手。,和之類的符號.按字面意思理解並根據 C 語言環境(無語言環境)進行解釋,而模式(您也可以使用'99G999D9S')根據目前語言環境進行解釋。

我建議對 pgsql-docs 手冊進行澄清。


  1. 如何讀取未格式化的數據?

您可以閱讀它,但如果沒有關於其格式的最少資訊,您幾乎無法將其轉換為任何數字類型。


我還是寧願不使用數據類型money。狹窄,古怪的規格。用於numeric覆蓋所有基地。或者只是integer表示美分,表現更好。看:

引用自:https://dba.stackexchange.com/questions/183964