01, 数字类型
名字 | 存储尺寸 | 描述 | 范围 |
| 2字节 | 小范围整数 | -32768 to +32767 |
| 4字节 | 整数的典型选择 | -2147483648 to +2147483647 |
| 8字节 | 大范围整数 | -9223372036854775808 to +9223372036854775807 |
| 可变 | 用户指定精度,精确 | 最高小数点前131072位,以及小数点后16383位 |
| 可变 | 用户指定精度,精确 | 最高小数点前131072位,以及小数点后16383位 |
| 4字节 | 可变精度,不精确 | 6位十进制精度 |
| 8字节 | 可变精度,不精确 | 15位十进制精度 |
| 2字节 | 自动增加的小整数 | 1到32767 |
| 4字节 | 自动增加的整数 | 1到2147483647 |
| 8字节 | 自动增长的大整数 | 1到9223372036854775807 |
02,类型介绍
smallint、integer、bigint都是整数类型,存储一定范围的整数,超出范围将会报错。small int存储2字节整数,字段定义时可写成int2,integer存储4字节整数,支持的数值范围比smallint大,宇段定义时可写成int4,是最常用的整数类型,bigint存储8字节整数,支持的数值范围比integer大,字段定义时可写成int8。对于大多数使用整数类型的场景使用integer就够了,除非integer范围不够用的情况下才使用bigint
例:
kingledb=> CREATE TABLE Kingle_Study_1 (a INTEGER,b int4);
CREATE TABLE
Time: 8.888 ms
kingledb=> \dt Kingle_Study_1
List of relations
Schema | Name | Type | Owner
--------+----------------+-------+--------
kingle | kingle_study_1 | table | kingle
(1 row)
kingledb=> \d kingle_study_1
Table "kingle.kingle_study_1"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | |
b | integer | | |
decimal和numeric是等效的,可以存储指定精度的多位数据,比如带小数位的数据,适用于要求计算准确的数值运算
kingledb=> CREATE TABLE Kingle_Study_2 (a numeric(4,2),b decimal(5,3));
CREATE TABLE
Time: 1.801 ms
kingledb=> \d kingle_study_2
Table "kingle.kingle_study_2"
Column | Type | Collation | Nullable | Default
--------+--------------+-----------+----------+---------
a | numeric(4,2) | | |
b | numeric(5,3) | | |
kingledb=> insert into Kingle_Study_2 values (44.55,22.333);
INSERT 0 1
Time: 0.981 ms
kingledb=> select * from Kingle_Study_2
kingledb-> ;
a | b
-------+--------
44.55 | 22.333
(1 row)
Time: 0.622 ms
但要注意 :NUMERIC(precision, scale) precision是指numeric数字里的全部位数,scale是指小数部分的数字位数,例如18.222的precision为5,而scale为3; precision必须为正整数,scale可以是0或整数,由于numeric类型上的算术运算相比整数类型性能低,因此,如果两种数据类型都能满足业务需求,从性能上考虑不建议使用numeric数据类型
kingledb=> insert into Kingle_Study_2 values (442.55,223.333); --如果整数位比较大是不能插入成功的
ERROR: numeric field overflow
DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2.
Time: 0.645 ms
kingledb=> insert into Kingle_Study_2 values (44.2255,22.22333); --小数位多了 插入的数据也是只保留对应的位数
INSERT 0 1
Time: 0.952 ms
kingledb=> select * from Kingle_Study_2
;
a | b
-------+--------
44.55 | 22.333
44.23 | 22.223
(2 rows)
Time: 0.380 ms
real和doubleprecision是指浮点数据类型,real支持4字节,doubleprecision支持8字节,浮点数据类型在实际生产案例的使用相比整数类型会少些。
smallserial、serial和bigserial类型是指自增serial类型,严格意义上不能称之为一种数据类型
03,数学上的一些数字类型操作
kingledb=> select 1+2 as a,2*3 as b,4/2 as c,8/3 as d; --加减乘除
a | b | c | d
---+---+---+---
3 | 6 | 2 | 2
(1 row)
kingledb=> SELECT "mod"(1116,9); --取模
mod
-----
0
(1 row)
Time: 0.654 ms
-- 返回大于或等于给出参数的最小整数
kingledb=> SELECT "ceil"(3.9999),"ceil"(-4.1111);
ceil | ceil
------+------
4 | -4
(1 row)
Time: 0.470 ms
kingledb=> select round(10.23) as a,round(11.9) as b; --四舍五入
a | b
----+----
10 | 12
(1 row)
Time: 0.800 ms
kingledb=> SELECT floor(3.6), floor(-3.6); --返回小于或等于给出参数的最大整数
floor | floor
-------+-------
3 | -4
(1 row)
Time: 0.480 ms
官网: http://www.postgres.cn/docs/10/datatype-numeric.html#DATATYPE-INT