货币数据类型用于在PostgreSQL数据库表中存储货币数据。PostgreSQL的货币数据类型用于存储具有固定小数精度的货币数据。ic_monetary设置是用来决定小数精度的。货币数据类型的大小是8字节,这个数据类型的范围是-92233720368547758.08到+92233720368547758.07。整数和浮动数据类型也可以用来在PostgreSQL数据库的表中存储货币值。这种数据类型的输出取决于地区设置值。本教程中已经展示了在PostgreSQL数据库中定义和使用货币数据类型的不同方法。
前提条件
在执行本教程中所示的SQL语句之前,你必须在Linux操作系统上安装最新版本的PostgreSQL软件包。运行下面的命令来安装和启动PostgreSQL。
$sudo apt-get \-y installpostgresql postgresql-contrib
$sudosystemctl start postgresql.service
运行下面的命令,以root权限登录到PostgreSQL。
$ sudo\-upostgres psql
使用MONEY数据类型
在创建任何具有布尔数据类型的表之前,你必须先创建一个PostgreSQL数据库。因此,运行下面的命令来创建一个名为 "testdb"的数据库。
#CREATE DATABASEtestdb;
创建数据库后会出现以下输出。

在当前数据库中创建一个名为'products_1'的表,有三个字段。第一个字段名是Id,它是表的主键。当有新的记录插入时,这个字段的值将会自动增加。第二个字段名是Name,数据类型是VARCHAR(30)。第三个字段名是Price,数据类型是MONEY。
#CREATE TABLEproducts\_1(
Id SERIALPRIMARY KEY,
NameVARCHAR (30),
Price MONEY);
如果表被成功创建,将出现以下输出。

运行以下三个INSERT查询,将三个不同的值插入到MONEY数据类型的字段中。
#INSERT INTOproducts\_1(Name,Price) VALUES ('Bag', 55);
#INSERT INTOproducts\_1(Name,Price) VALUES ('Pen', 2.50);
#INSERT INTOproducts\_1(Name,Price) VALUES ('Water Color', 15.895634) ;
执行上述查询后会出现以下输出。

运行下面的SELECT查询来读取products_1表中的所有记录。
#SELECT \* FROMproducts\_1;
执行上述查询后,将出现以下输出结果。输出显示了MONEY数据类型字段中的默认货币符号。

使用NUMERIC数据类型。
NUMERIC数据类型是另一种在PostgreSQL表中存储货币值的数据类型。在当前数据库中创建一个名为'products_2'的表,有三个字段。第一个字段名是Id,它是表的主键。当有新的记录插入时,这个字段的值将会自动增加。第二个字段名是Name,数据类型是VARCHAR(30)。第三个字段名是Price,数据类型是NUMERIC (5, 3)。
#CREATE TABLEproducts\_2(
Id SERIALPRIMARY KEY,
NameVARCHAR (30),
PriceNUMERIC (5, 3)) ;
如果表被成功创建,将出现以下输出。

运行下面的INSERT查询,将两条记录插入到products_2表中。
#INSERT INTOproducts\_2(Name,Price) VALUES ('Pencil', 2.999);
#INSERT INTOproducts\_2(Name,Price) VALUES ('Color Pencil ', 10.999999);
在执行上述查询后会出现以下输出。

如果数值超过了数据类型的精度值,NUMERIC数据类型会产生一个错误。下面的INSERT查询将产生一个错误。
#INSERT INTOproducts\_2(Name,Price) VALUES ('Scanner', 1000.999999);
下面的输出显示了由NUMERIC字段产生的错误。

在SELECT查询中,可以在NUMERIC字段的值之前添加任何货币符号。所以,使用NUMERIC数据类型比使用MONEY数据类型来存储货币数据更好。运行下面的SELECT查询,通过在 Price字段 前添加 '$'来读取products_2表中的所有值。
#SELECTId,Name, '$' ||PriceASPriceFROMproducts\_2;
执行上述查询后,将出现以下输出。

使用FLOAT数据类型。
float数据类型是存储货币数据的另一种选择。但是不推荐使用float数据类型,因为在这种数据类型中,数值是作为近似值存储的。这里显示了这种数据类型在存储货币价值方面的用途。
在当前数据库中创建一个名为'products_3'的表,有三个字段。第一个字段名是Id,它是表的主键。当插入一条新的记录时,这个字段的值将会自动增加。第二个字段名是Name,数据类型是VARCHAR(30)。第三个字段名是Price,数据类型是FLOAT。
#CREATE TABLEproducts\_3(
Id SERIALPRIMARY KEY,
NameVARCHAR (30),
PriceFLOAT);
如果表被成功创建,将出现以下输出。

运行下面的INSERT查询,将两个值插入到FLOAT数据类型的字段中。
#INSERT INTOproducts\_3(Name,Price) VALUES ('HP Printer', 150.99);
#INSERT INTOproducts\_3(Name,Price) VALUES ('Samsung Printer', 180.4578);
#INSERT INTOproducts\_3(Name,Price) VALUES ('Dell Printer', 320.56);
执行上述查询后会出现以下输出。

运行下面的SELECT查询来读取products_3表中的所有记录。
#SELECTId,Name, '$' ||PriceASPriceFROMproducts\_3;
执行上述查询后,将出现以下输出。

结论
在本教程中,通过使用多个表,展示了不同数据类型在PostgreSQL表中存储货币数据的用途。MONEY、NUMERIC和FLOAT数据类型被用来存储货币数据,这里已经解释了每种数据类型的优点和缺点。