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

你可能感兴趣的:(PostgreSQL二次开发,postgresql)