PostgreSQL数据类型之money和int64

注意使用的PostgreSQL版本为11

货币用什么类型存储:

numeric
decimal
bigint
money

还有选择困难症吗?

现在可以明确的告诉大家选择bigint或money,因为它们在数据库内部是一模一样的.区别只是money在输出时根据区域自动格式化为所在区域的货币字符串

1 可变精度类型

可变精度类型,性能较差,如果没有特殊需求,建议不要再使用.**
可变精度类型显示的时候实际上是转换成字符串显示(如在psql等工具中看到的输出内容).
输出函数为Datum numeric_out(PG_FUNCTION_ARGS)(src/backend/utils/adt/numeric.c:651行定义)
在numeric_out返回前(671行)之前调用get_str_from_var将numeric和decimal转换为字符串,然后返回.
转换函数为:get_str_from_var(src/backend/utils/adt/numeric.c:5585行定义)

select '3.1415926'::numeric;
/*
这句sql一共调用了二个函数,顺序为
1.Datum numeric_in(PG_FUNCTION_ARGS)(src/backend/utils/adt/numeric.c:569行定义)
2.Datum numeric_out(PG_FUNCTION_ARGS)(src/backend/utils/adt/numeric.c:651行定义)
numeric_in将尝试扫描字符串是否可以转换为numeric,不能则失败.
如成功numeric_out将numeric重新转换为字符串输出,也就是我们看到的.
*/

2 定长类型

以899元为例.

select (89900::float8 / 100.0), 899::money;
--money存储的也是89900,(src/backend/utils/adt/cash.c:96行和309行分别定义money的输入输出)
--bigint存储的也是89900

区别只是money在输出时根据区域自动格式化为所在区域的货币字符串.
关于这一点可以在libpq客户端使用PQexecParams以二进制方式输出时看到.

--PQexecParams以二进制方式执行的下面的sql
select 899::money;
--成功后PQgetvalue获取网络字节
--将网络字节转换为本地字节并转换为int64,此时int64值为89900
--再将int64/100即可得899
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kmblack1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值