PostgreSQL支持的数字类型有整数类型、用户指定精度类型、浮点类型、serial类型。
PostgreSQL支持的数字类型如表所示
smallint、integer、bigint都是整数类型,存储一定范围的整数,超出范围将会报错。smallint存储2字节整数,字段定义时可写成int2, integer存储4字节整数,支持的数值范围比smallint大,字段定义时可写成int4,是最常用的整数类型,bigint存储8字节整数,支持的数值范围比integer大,字段定义时可写成int8。对于大多数使用整数类型的场景使用integer就够了,除非integer范围不够用的情况下才使用bigint。定义一张使用integer类型的表如下所示:
mydb=> CREATE TABLE test_integer (id1 integer, id2 int4) ;
CREATE TABLE
decimal和numeric是等效的,可以存储指定精度的多位数据,比如带小数位的数据,适用于要求计算准确的数值运算,声明numeric的语法如下所示:
NUMERIC(precision, scale)
precision是指numeric数字里的全部位数,scale是指小数部分的数字位数,例如18.222的precision为5,而scale为3; precision必须为正整数,scale可以是0或整数,由于numeric类型上的算术运算相比整数类型性能低,因此,如果两种数据类型都能满足业务需求,从性能上考虑不建议使用numeric数据类型。real和double precision是指浮点数据类型,real支持4字节,double precision支持8字节,浮点数据类型在实际生产案例的使用相比整数类型会少些。smallserial、serial和bigserial类型是指自增serial类型,严格意义上不能称之为一种数据类型,如下代码创建一张测试表,定义test_serial表的id字段为serial类型:
mydb=> CREATE TABLE test_serial (id serial, flag text);
CREATE TABLE
查看表test_serial的表结构,如下所示:
mydb=> \d test_serial
Table "pguser.test_serial"
Column | Type | Collation | Nullable | Default
-----------+---------+-----------+----------+-------------------------------------
id | integer | | not null | nextval('test_serial_id_seq'::regclass)
flag | text | | |
以上显示id字段使用了序列test_serial_id_seq,插入表数据时可以不指定serial字段名称,将自动使用序列值填充,如下所示:
mydb=> INSERT INTO test_serial(flag) VALUES ('a');
INSERT 0 1
mydb=> INSERT INTO test_serial(flag) VALUES ('b');
INSERT 0 1
mydb=> INSERT INTO test_serial(flag) VALUES ('c');
INSERT 0 1
mydb=> SELECT * FROM test_serial;
id | flag
-------+------
1 | a
2 | b
3 | c
(3 rows)
PostgreSQL支持数字类型操作符和丰富的数学函数,例如支持加、减、乘、除、模取余操作符,如下所示:
mydb=> SELECT 1+2,2*3,4/2,8%3;
?column? | ? column? | ? column? | ? column?
-------------+----------+----------+----------
3 | 6 | 2 | 2
按模取余如下所示:
mydb=> SELECT mod(8,3);
mod
-----
2
(1 row)
四舍五入函数如下所示:
mydb=> SELECT round(10.2), round(10.9);
round | round
----------+-------
10 | 11
(1 row)
返回大于或等于给出参数的最小整数,如下所示:
mydb=> SELECT ceil(3.6), ceil(-3.6);
ceil | ceil
---------+------
4 | -3
(1 row)
返回小于或等于给出参数的最大整数,如下所示:
mydb=> SELECT floor(3.6), floor(-3.6);
floor | floor
----------+-------
3 | -4
(1 row)
参考手册https://www.postgresql.org/docs/10/static/datatype.html