货币类型:money
money
类型存储固定小数精度的货币数字,小数的精度由数据库的lc_monetary设置决定。windows系统下,该配置项位于/data/postgresql.conf文件中,默认配置如下,
lc_monetary = 'Chinese (Simplified)_China.936' # locale for monetary formatting
货币类型输入输出格式
可接受的输入格式很多,包括整数和浮点数文字,以及常用的货币格式,如'$1,000.00'
。 输出通常是最后一种形式,但和区域相关。也就是说:money这种数据类型的输出格式是和区域相关的。例如:上述配置对应于中国区域,那么货币的输出格式就为:
SELECT id,name,money FROM "tb_account"
ORDER BY id
查询结果如下,
因此将money
数据装入到一个具有不同lc_monetary
设置的数据库是不起作用的。为了避免这种问题,在恢复一个转储到一个新数据库中之前,应确保新数据库的lc_monetary
设置和被转储数据库的相同或者具有等效值。
货币类型与其它数据类型相互转换
在实际开发中,我们经常接触到的金额数值一般为小数类型,但是,PostGreSQL货币类型由于输出格式带有前缀$或者¥,显然是无法直接映射到Double/Float/Int等数值类型的,尤其是在使用MyBatis框架时。
为了解决这类问题,PostGreSQL提供了类型转换的实现方式。
其它类型转货币类型
数据类型numeric
、int
和bigint
的值可以被造型成money
。从数据类型real
和double precision
的转换可以通过先造型成numeric
来实现,例如:
SELECT '12.34'::float8::numeric::money;
对应于MyBatis框架,使用方式如下,
<update id="update" parameterType="com.example.demo.demos.pojo.Account">
UPDATE tb_account
<trim prefix="SET" suffixOverrides=",">
<if test="account.name != null and account.name != ''">
name = #{account.name},
</if>
<if test="account.money != null">
money = #{account.money}::float8::numeric::money,
</if>
</trim>
WHERE id = #{account.id}
</update>
货币类型转其它类型
一个money
值可以在不损失精度的情况下被造型成numeric
。转换到其他类型可能会丢失精度,并且必须采用两个阶段完成:
SELECT '52093.89'::money::numeric::float8;
对应于MyBatis框架,使用方式如下,
<select id="selectList" resultType="com.example.demo.demos.pojo.Account">
SELECT id,name,money::money::numeric::float8 as money
FROM tb_account
</select>
tb_account表对应的pojo实体类定义如下,
package com.example.demo.demos.pojo;
import java.io.Serializable;
public class Account implements Serializable {
private static final long serialVersionUID = 3327456920493219212L;
/**
* id-主键
*/
private Integer id;
/**
* name-账户名
*/
private String name;
/**
* money-金额
*/
private Double money;
//setter
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setMoney(Double money) {
this.money = money;
}
//getter
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public Double getMoney() {
return money;
}
//constructor
public Account() {
}
public Account(Integer id, String name, Double money) {
this.id = id;
this.name = name;
this.money = money;
}
//methods
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}