01, 數字類型
名字 | 存儲尺寸 | 描述 | 范圍 |
---|---|---|---|
smallint |
2字節 | 小范圍整數 | -32768 to +32767 |
integer |
4字節 | 整數的典型選擇 | -2147483648 to +2147483647 |
bigint |
8字節 | 大范圍整數 | -9223372036854775808 to +9223372036854775807 |
decimal |
可變 | 用戶指定精度,精確 | 最高小數點前131072位,以及小數點后16383位 |
numeric |
可變 | 用戶指定精度,精確 | 最高小數點前131072位,以及小數點后16383位 |
real |
4字節 | 可變精度,不精確 | 6位十進制精度 |
double precision |
8字節 | 可變精度,不精確 | 15位十進制精度 |
smallserial |
2字節 | 自動增加的小整數 | 1到32767 |
serial |
4字節 | 自動增加的整數 | 1到2147483647 |
bigserial |
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
書籍學習來自:postgres 實戰