Postgresql支持的浮点类型和区别案例
案例postgresql 类型 支持 区别 浮点
2023-06-13 09:13:01 时间
Postgresql提供四类浮点型,其中两类完全相同decimal、numeric;按功能看可以分成两类:
- 精确型:decimal、numeric
- 不精确型:read、double precision
https://www.postgresql.org/docs/14/datatype-numeric.html
为什么说不精确呢?因为数据类型成功插入后,查询出来值可能和你插入的值不一样,原因是长度截断和四舍五入。 精确类型不会发生截断且如果超长了直接报错,主要插入成功了,查出来的一定等于插入的结果。
看下具体例子:
real:【不精确类型】【定长类型】PG10:六位有效数字,会四舍五入(PG14八位有效数字)
create table f1 (a real);
insert into f1 values (1.23456789);
insert into f1 values (1234.23456789012345);
insert into f1 values (123456.23456789);
insert into f1 values (123456.23456789012345);
select * from f1;
a
---------
1.23457
1234.23
123456
123456
double:【不精确类型】【定长类型】PG10:十五位有效数字,会四舍五入(PG14十七位有效数字)
create table f2 (a double precision);
insert into f2 values (123456789.123456789);
insert into f2 values (1.1234567890123456789);
insert into f2 values (12345678901234567890.1234567890123456789);
select * from f2;
a
----------------------
123456789.123457
1.12345678901235
1.23456789012346e+19
decimal / numeric:【精确类型】【变长类型】不会四舍五入,最高小数点前131072位,以及小数点后16383位,超出报错:ERROR: value overflows numeric format
。
create table f3 (a decimal);
insert into f3 values (123456789.123456789);
insert into f3 values (1.1234567890123456789);
insert into f3 values (12345678901234567890.1234567890123456789);
insert into f3 values (12345678901234567890.12345678901234567890123456789012345678901234567890);
select * from f3;
a
------------------------------------------------------------------------
123456789.123456789
1.1234567890123456789
12345678901234567890.1234567890123456789
12345678901234567890.1234567890123456789012345678901234567890123456789
从存储角度看,real、double是定长类型,decimal / numeric是变长类型。
在构造tuple时,计算数据长度会走不同分支: (《Postgresql源码(58)元组拼接heap_form_tuple剖析》)
real类型长度计算:定长计算方法
heap_compute_data_size
data_length = att_align_datum(data_length, atti->attalign, atti->attlen, val);
data_length = att_addlength_datum(data_length, atti->attlen, val);
decimal类型长度计算:变长计算方法
heap_compute_data_size
if (ATT_IS_PACKABLE(atti) && VARATT_CAN_MAKE_SHORT(DatumGetPointer(val)))
data_length += VARATT_CONVERTED_SHORT_SIZE(DatumGetPointer(val));
相关文章
- shell脚本案例-监控磁盘使用率
- 【愚公系列】2022年11月 .NET CORE工具案例-.NET Core执行JavaScript
- 智能无感验证案例:神州优车
- JavaScript案例:表格隔行变色效果及表单全选取消全选
- 故障分析 | redis cluster 从库无法自动恢复同步案例一则
- 【愚公系列】2023年02月 .NET CORE工具案例-AspNetCoreRateLimit限流的使用
- Wiztalk | 100期 陶阳宇《机器学习平台如何兼顾工业界的高可用性和学术界的创新性-Angel详解及产业应用案例-2》
- Flume配置案例详解大数据
- 使用PostgreSQL管理工具简化数据库维护(postgresql管理工具)
- ?探究PostgreSQL:一款强大的数据库系统(postgresql是什么)
- 快速学会PostgreSQL中导入SQL文件(postgresql导入sql文件)
- PostgreSQL新建数据库:快速搭建实现数据存储 (postgresql新建数据库)
- 使用PostgreSQL精通数据库管理(postgresql教程)
- 创建PostgreSQL数据库序列的实践(postgresql序列)
- SAMBA实战案例:实现不同samba用户访问相同的samba共享,实现不同的配置
- PostgreSQL连接的实践与思考(postgresql链接)
- PostgreSQL论坛:聚焦数据库技术分享与交流!(postgresql论坛)
- 管理Postgresql版本管理:实现更加高效的工作(postgresql版本)
- PostgreSQL 掌握精妙的数据类型(postgresql类型)
- Nginx反向代理+DNS轮询+IIS7.5千万PV百万IP双线网站架构案例
- 服务器安全狗导致ASP.NET网站运行出错的一个案例