decimal是整数数据类型postgres数据类型--数字类型
01,数字类型
名字存储尺⼨描述范围
smallint2字节⼩范围整数-32768 to +32767
integer4字节整数的典型选择-2147483648 to +2147483647
bigint8字节⼤范围整数-9223372036854775808 to +9223372036854775807
decimal可变⽤户指定精度,精确最⾼⼩数点前131072位,以及⼩数点后16383位
numeric可变⽤户指定精度,精确最⾼⼩数点前131072位,以及⼩数点后16383位
real4字节可变精度,不精确6位⼗进制精度
double precision8字节可变精度,不精确15位⼗进制精度
smallserial2字节⾃动增加的⼩整数1到32767
serial4字节⾃动增加的整数1到2147483647
bigserial8字节⾃动增长的⼤整数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);
INSERT01
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 precision4, 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); --⼩数位多了插⼊的数据也是只保留对应的位数
INSERT01
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=>select1+2as a,2*3as b,4/2as c,8/3as d;  --加减乘除
a |
b |
c | d
---+---+---+---
3|6|2|2
(1 row)
kingledb=> SELECT "mod"(1116,9);  --取模
mod
-----
(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
官⽹: www.postgres/docs/10/datatype-numeric.html#DATATYPE-INT
书籍学习来⾃:postgres 实战