PostgreSQL数值类型--浮点类型和序列

PostgreSQL数值类型--浮点类型和序列,第1张

概述PostgreSQL包括整数类型浮点数类型。 整数类型包括3种,分别是smallint、int和bigint。别名分别是int2、int(int4)和int8.常用数据类型是int(integer)。 浮点类型分为精确浮点数类型numeric和不精确浮点数类型real(单精度浮点数据类型)和 double precision(双精度浮点数据类型)。 精确浮点数类型可以用numeric(preci

Postgresql包括整数类型和浮点数类型。

整数类型包括3种,分别是smallint、int和bigint。别名分别是int2、int(int4)和int8.常用数据类型是int(integer)。

浮点类型分为精确浮点数类型numeric和不精确浮点数类型real(单精度浮点数据类型)和 double precision(双精度浮点数据类型)。

精确浮点数类型可以用numeric(precision,scale)表示。

精度(precision)必须是正值,标度(scale)为零或正值。类型numeric和decimal等价,都符合sql标准。 numeric不带精度和标度,则系统使用任意精度,不会超过数据库系统储存范围。创建表显示声明精度最大值为1000。

numeric(precision,0)等价于numeric(precision)。

---不限定精度和标度postgres=# create table testdecimal(ID int,testvalue decimal);CREATE tablepostgres=# insert into testdecimal values(1,777777777.77777777);INSERT 0 1postgres=# insert into testdecimal values(1,777777777.7777777788888888888888);INSERT 0 1postgres=# select * from testdecimal; ID |            testvalue----+----------------------------------  1 |               777777777.77777777  1 | 777777777.7777777788888888888888(2 行记录)postgres=#---限定精度postgres=# create table testnumeric(ID int,testnumeric numeric(3));CREATE tablepostgres=# insert into testnumeric values(1,2.777);INSERT 0 1postgres=#postgres=#postgres=# insert into testnumeric values(1,2.7777);INSERT 0 1postgres=# insert into testnumeric values(1,2.77777);INSERT 0 1postgres=# select * from testnumeric; ID | testnumeric----+-------------  1 |           3  1 |           3  1 |           3(3 行记录)---限定标度postgres=# create table testnumeric(ID int,testnumeric numeric(2,2));CREATE tablepostgres=# insert into testnumeric values(1,0);INSERT 0 1postgres=# insert into testnumeric values(1,0.1);INSERT 0 1postgres=# insert into testnumeric values(1,1.1);错误:  数字字段溢出描述:  精度为2,范围是2的字段必须四舍五入到小于1的绝对值.postgres=#

根据查询结果可知,不限制精度和标度,数据库系统会“原样储存”,限定精度,将导致四舍五入运算。限定标度,插入超范围数值将导致错误。

numeric类型允许特殊值NaN, 表示"不是一个数字(not a number)"。插入NaN时需要使用单引号,不区分大小写。Postgresql把NaN值视为相等,并且比所有非NaN值都要大。

---练习NaN使用。postgres=# create table testnumeric(ID int,testnumeric numeric);CREATE tablepostgres=# insert into testnumeric values(2,'NaN');INSERT 0 1postgres=# insert into testnumeric values(2,'Nan');INSERT 0 1postgres=# insert into testnumeric values(2,'nan');INSERT 0 1postgres=# select * from testnumeric; ID | testnumeric----+-------------  2 |         NaN  2 |         NaN  2 |         NaN(3 行记录)postgres=# select 'NaN'::decimal >'Nan'::decimal; ?column?---------- f(1 行记录)postgres=# select 'NaN'::decimal <'Nan'::decimal; ?column?---------- f(1 行记录)postgres=# select 'NaN'::decimal ='Nan'::decimal; ?column?---------- t(1 行记录)

浮点数据类型分为real(单精度浮点数据类型)和 double precision(双精度浮点数据类型),都是不准确和变精度数据类型。不准确意味着某些值不能被正确转换或被近似处理,在检索或储存时出现缺失,如何处理本文不再详加讨论。不过我们需要注意以下几点

1、要求精度数据(例如货币)使用numeric数据类型。

2、使用不精确可变精度数据类型需要详细评估。

3、用两个浮点数值进行等值比较不可能总是按照期望地进行。

不精确可变精度浮点数据类型除支持一般浮点数以外,还支持3个特殊值,分别是infinity,-infinity和NaN。

严格意义来讲,序列(serial)不是数据类型,只是为表示序数方便所创造。

---创建序列postgres=# create table testserial (ID serial);CREATE tablepostgres=#---另一种等价创建序列postgres=# create sequence testserial_ID_sequence;CREATE SEQUENCEpostgres=#postgres=# create table testserial(ID int default nextval('testserial_ID_sequence'));CREATE tablepostgres=#postgres=# alter sequence testserial_ID_sequence owned by testserial.ID;ALTER SEQUENCEpostgres=#

数据类型serial和serial4等效。当预期序号系列超过2^31时,使用bigserial(serial8)。

使用序列时应避免以下情况。

postgres=# drop table testserial;DROP tablepostgres=# create table testserial(ID serial4,name text);CREATE tablepostgres=# insert into testserial values(1,'Tom'),(100,'Bill'),(2,'lily');INSERT 0 3postgres=#postgres=# select ID,name from testserial; ID  | name-----+------   1 | Tom 100 | Bill   2 | lily(3 行记录)postgres=#

建议使用

postgres=# insert into testserial(name) values('Tom'),('Bill'),('lily');INSERT 0 3postgres=# select ID,name from testserial; ID  | name-----+------   1 | Tom 100 | Bill   2 | lily   1 | Tom   2 | Bill   3 | lily(6 行记录)postgres=#

更多细节,建议参考Postgresql手册。

总结

以上是内存溢出为你收集整理的PostgreSQL数值类型--浮点类型和序列全部内容,希望文章能够帮你解决PostgreSQL数值类型--浮点类型和序列所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1171913.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存