PostGreSQL:货币类型

货币类型: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提供了类型转换的实现方式。

其它类型转货币类型

数据类型numericintbigint的值可以被造型成money。从数据类型realdouble precision的转换可以通过先造型成numeric来实现,例如:

SELECT '12.34'::float8::numeric::money;

对应于MyBatis框架,使用方式如下,

XML 复制代码
  <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框架,使用方式如下,

XML 复制代码
<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实体类定义如下,

java 复制代码
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 +
                '}';
    }
}
相关推荐
划过手的泪滴t13 分钟前
【python】字典、列表、集合综合练习
开发语言·python·云计算·每日一练·数据类型
爱可生开源社区1 小时前
3s->30ms!MySQL 生产环境 GROUP BY 优化实践
数据库
飞翔的佩奇1 小时前
Java项目:基于SSM框架实现的游戏攻略网站系统分前后台【ssm+B/S架构+源码+数据库+毕业论文+任务书】
java·数据库·spring·游戏·架构·maven·ssm框架
Tcoder-l3est1 小时前
【论文阅读】XuanYuan: An AI-Native Database
数据库·论文阅读·ai-native
长亭外的少年1 小时前
ClickHouse 介绍:深度解析高性能列式数据库的核心优势
java·数据库·clickhouse
醇氧2 小时前
【postgresql】模式(SCHEMA)
数据库·sql·postgresql
zengson_g2 小时前
如何在 PostgreSQL 中实现数据的去重操作,尤其是对于复杂的数据结构?
数据库·postgresql
zengson_g2 小时前
如何优化 PostgreSQL 中对于树形结构数据的查询?
数据库·postgresql
鞥牧魂人2 小时前
数据库——事务管理
服务器·数据库·oracle
冯宝宝^2 小时前
图书管理系统
服务器·数据库·vue.js·spring boot·后端