数值类型
-
整数类型
名称 描述 存储空间 范围 TINYINT 微整数,别名为INT1。 1字节 0 ~ 255 SMALLINT 小范围整数,别名为INT2。 2字节 -32,768 ~ +32,767 INTEGER 常用的整数,别名为INT4。 4字节 -2,147,483,648 ~ +2,147,483,647 BINARY_INTEGER 常用的整数INTEGER的别名,为兼容Oracle类型。 4字节 -2,147,483,648 ~ +2,147,483,647 BIGINT 大范围的整数,别名为INT8。 8字节 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 -- 创建具有TINYINT,INTEGER,BIGINT类型数据的表。 CREATE TABLE myschema.int_type_t2 ( a TINYINT, b TINYINT, c INTEGER, d BIGINT ); -- 插入数据。 INSERT INTO myschema.int_type_t2 VALUES(100, 10, 1000, 10000); -- 查看数据。 SELECT * FROM myschema.int_type_t2; -- 删除表。 DROP TABLE myschema.int_type_t2;
-
任意精度类型
名称 描述 存储空间 范围 NUMERIC[(p[,s])],DECIMAL[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。说明: p为总位数,s为小数位数。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 NUMBER[(p[,s])] NUMERIC类型的别名,为兼容Oracle数据类型。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 -- 创建表。 CREATE TABLE myschema.numeric_type_t1 ( NT_COL1 NUMERIC(10,4) ); -- 插入数据。 INSERT INTO myschema.numeric_type_t1 VALUES(123456.12354); -- 查询表中的数据。 SELECT * FROM myschema.numeric_type_t1; nt_col1 ------------- 123456.1235 (1 row) -- 因为小数位精度限制了4位,所以只结果为123456.1235 -- 删除表。 DROP TABLE myschema.numeric_type_t1;
-
序列整型
名称 描述 存储空间 范围 SMALLSERIAL 二字节序列整型。 2字节 1 ~ 32,767 SERIAL 四字节序列整型。 4字节 1 ~ 2,147,483,647 BIGSERIAL 八字节序列整型。 8字节 1 ~ 9,223,372,036,854,775,807 -- 创建表。 CREATE TABLE myschema.smallserial_type_tab(a SMALLSERIAL); -- 插入数据。 INSERT INTO myschema.smallserial_type_tab VALUES(default); -- 再次插入数据。 INSERT INTO myschema.smallserial_type_tab VALUES(default); -- 查看数据。 SELECT * FROM myschema.smallserial_type_tab; a --- 1 2 (2 rows) -- 创建表。 CREATE TABLE myschema.serial_type_tab(b SERIAL); -- 插入数据。 INSERT INTO myschema.serial_type_tab VALUES(default); -- 再次插入数据。 INSERT INTO myschema.serial_type_tab VALUES(default); -- 查看数据。 SELECT * FROM myschema.serial_type_tab; b --- 1 2 (2 rows) -- 创建表。 CREATE TABLE myschema.bigserial_type_tab(c BIGSERIAL); -- 插入数据。 INSERT INTO myschema.bigserial_type_tab VALUES(default); -- 插入数据。 INSERT INTO myschema.bigserial_type_tab VALUES(default); -- 查看数据。 SELECT * FROM myschema.bigserial_type_tab; c --- 1 2 (2 rows) -- 删除表。 DROP TABLE myschema.smallserial_type_tab; DROP TABLE myschema.serial_type_tab; DROP TABLE myschema.bigserial_type_tab;
-
浮点类型
名称 描述 存储空间 范围 REAL,FLOAT4 单精度浮点数,不精准。 4字节 6位十进制数字精度。 DOUBLE PRECISION,FLOAT8 双精度浮点数,不精准。 8字节 1E-307~1E+308,15位十进制数字精度。 FLOAT[(p)] 浮点数,不精准。精度p取值范围为[1,53]。说明: p为精度,表示总位数。 4字节或8字节 根据精度p不同选择REAL或DOUBLE PRECISION作为内部表示。如不指定精度,内部用DOUBLE PRECISION表示。 BINARY_DOUBLE 是DOUBLE PRECISION的别名,为兼容Oracle类型。 8字节 1E-307~1E+308,15位十进制数字精度。 DEC[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。说明: p为总位数,s为小数位位数。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 INTEGER[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 -- 创建表。 CREATE TABLE myschema.float_type_t2 ( FT_COL1 INTEGER, FT_COL2 FLOAT4, FT_COL3 FLOAT8, FT_COL4 FLOAT(16), FT_COL5 BINARY_DOUBLE, FT_COL6 DECIMAL(10,4), FT_COL7 INTEGER(6,3) ) DISTRIBUTE BY HASH ( ft_col1); -- 插入数据。 INSERT INTO myschema.float_type_t2 VALUES(10,10.365456,123456.1234,10.3214, 321.321, 123.123654, 123.123654); INSERT INTO myschema.float_type_t2 VALUES(10,10.365456,123456.1234,10.12654, 321.321, 123.123654, 123.123654); -- 查看数据。 SELECT * FROM myschema.float_type_t2 ; ft_col1 | ft_col2 | ft_col3 | ft_col4 | ft_col5 | ft_col6 | ft_col7 ---------+---------+-------------+---------+---------+----------+--------- 10 | 10.3655 | 123456.1234 | 10.3214 | 321.321 | 123.1237 | 123.124 (1 row) -- 删除表。 DROP TABLE myschema.float_type_t2;
货币类型
名字 | 存储容量 | 描述 | 范围 |
---|---|---|---|
money | 8 字节 | 货币金额 | -92233720368547758.08 到 +92233720368547758.07 |
货币类型存储带有固定小数精度的货币金额,numeric,int和bigint类型的值可以转化为money类型,如果从real和double precision类型转换到money类型,可以先转化为numeric类型,再转化为money类型,例如:
SELECT '12.34'::float8::numeric::money;
如上方式不推荐,转float会存在精度丢失问题
布尔类型
名称 | 描述 | 存储空间 | 取值 |
---|---|---|---|
BOOLEAN | 布尔类型 | 1字节。 | true:真false:假null:未知(unknown) |
“真”值的有效文本值:TRUE、't'、'true'、'y'、'yes'、'1'。
“假”值的有效文本值:FALSE、'f'、'false'、'n'、'no'、'0'。
输出时使用't'或者'f'标识真假
-- 创建表。
CREATE TABLE myschema.bool_type_t1
(
BT_COL1 BOOLEAN,
BT_COL2 TEXT
) DISTRIBUTE BY HASH(BT_COL2);
-- 插入数据。
INSERT INTO myschema.bool_type_t1 VALUES (TRUE, 'sic est');
INSERT INTO myschema.bool_type_t1 VALUES (FALSE, 'non est');
-- 查看数据。
SELECT * FROM myschema.bool_type_t1;
bt_col1 | bt_col2
---------+---------
t | sic est
f | non est
(2 rows)
SELECT * FROM myschema.bool_type_t1 WHERE bt_col1 = 't';
bt_col1 | bt_col2
---------+---------
t | sic est
(1 row)
-- 删除表。
DROP TABLE myschema.bool_type_t1;
字符类型
常规字符类型
名称 | 描述 | 存储空间 |
---|---|---|
CHAR(n),CHARACTER(n),NCHAR(n) | 定长字符串,不足补空格。n是指字节长度,如不带精度n,默认精度为1。 | 最大为10MB。 |
VARCHAR(n),CHARACTER VARYING(n) | 变长字符串。n是指字节长度。 | 最大为10MB。 |
VARCHAR2(n) | 变长字符串。是VARCHAR(n)类型的别名,为兼容Oracle类型。n是指字节长度。 | 最大为10MB。 |
NVARCHAR2(n) | 变长字符串。n是指字符长度。 | 最大为10MB。 |
CLOB | 文本大对象。是TEXT类型的别名,为兼容Oracle类型。 | 最大为1G-8023B(即1073733621B)。 |
TEXT | 变长字符串。 | 最大为1G-8023B(即1073733621B)。 |
特殊字符类型
名称 | 描述 | 存储空间 |
---|---|---|
name | 用于对象名的内部类型。 | 64字节。 |
"char" | 单字节内部类型。 | 1字节。 |
name类型只用在内部系统表中,作为存储标识符,不建议普通用户使用,该类型长度当前定为64字节(63可用字符加结束符)
类型"char"只用了一个字节的存储空间,他在系统内部主要用于系统表,主要作为简单化的枚举类型使用。
-- 创建表。
CREATE TABLE myschema.char_type_t2
(
CT_COL1 VARCHAR(5)
) DISTRIBUTE BY HASH (CT_COL1);
-- 插入数据。
INSERT INTO myschema.char_type_t2 VALUES ('ok');
INSERT INTO myschema.char_type_t2 VALUES ('good');
-- 插入的数据长度超过类型规定的长度报错。
INSERT INTO myschema.char_type_t2 VALUES ('too long');
-- ERROR: value too long for type character varying(4)
-- CONTEXT: referenced column: ct_col1
-- 明确类型的长度,超过数据类型长度后会自动截断。
INSERT INTO myschema.char_type_t2 VALUES ('too long'::varchar(5));
-- 查询数据。
SELECT ct_col1, char_length(ct_col1) FROM myschema.char_type_t2;
ct_col1 | char_length
---------+-------------
ok | 2
good | 5
too l | 5
(3 rows)
-- too long已经被截断为5位(too l)
-- 删除数据。
DROP TABLE myschema.char_type_t2;
日期时间类型
名称 | 描述 | 存储空间 |
---|---|---|
DATE | 日期和时间。 | 4字节(实际存储空间大小为8字节) |
TIME [(p)] [WITHOUT TIME ZONE] | 只用于一日内时间,p表示小数点后的精度,取值范围为0~6。 | 8字节 |
TIME [(p)] [WITH TIME ZONE] | 只用于一日内时间,带时区,p表示小数点后的精度,取值范围为0~6。 | 12字节 |
TIMESTAMP[(p)] [WITHOUT TIME ZONE] | 日期和时间,p表示小数点后的精度,取值范围为0~6。 | 8字节 |
TIMESTAMP[(p)][WITH TIME ZONE] | 日期和时间,带时区,TIMESTAMP的别名为TIMESTAMPTZ,p表示小数点后的精度,取值范围为0~6。 | 8字节 |
SMALLDATETIME | 日期和时间,不带时区,精确到分钟,秒位大于等于30秒进一位。 | 8字节 |
INTERVAL DAY (l) TO SECOND (p) | 时间间隔,X天X小时X分X秒,l:天数的精度,取值范围为0~6,为适配Oracle语法,未实现具体功能,p:秒数的精度,取值范围为0~6,小数末尾的零不显示。 | 16字节 |
INTERVAL [FIELDS] [ (p) ] | 时间间隔,fields:可以是YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,DAY TO HOUR,DAY TO MINUTE,DAY TO SECOND,HOUR TO MINUTE,HOUR TO SECOND,MINUTE TO SECOND,p:秒数的精度,取值范围为0~6,且fields为SECOND,DAY TO SECOND,HOUR TO SECOND或MINUTE TO SECOND时,参数p才有效,小数末尾的零不显示。 | 12字节 |
reltime | 相对时间间隔,格式为:X years X mons X days XX:XX:XX,采用儒略历计时,规定一年为365.25天,一个月为30天,计算输入值对应的相对时间间隔,输出采用POSTGRES格式。 | 4字节 |
-- 创建表。
CREATE TABLE myschema.date_type_tab(coll date);
-- 插入数据。
INSERT INTO myschema.date_type_tab VALUES (date '01-01-2021');
INSERT INTO myschema.date_type_tab VALUES (date '2021-01-01');
-- 查看数据。
SELECT * FROM myschema.date_type_tab;
coll
---------------------
2021-01-01 00:00:00
2021-01-01 00:00:00
(2 rows)
-- 删除表。
DROP TABLE myschema.date_type_tab;
-- 创建表。
CREATE TABLE myschema.time_type_tab (da time without time zone ,dai time with time zone,dfgh timestamp without time zone,dfga timestamp with time zone, vbg smalldatetime);
/*
Column | Type | Modifiers | Storage | Stats target | Description
--------+-----------------------------+-----------+---------+--------------+-------------
da | time without time zone | | plain | |
dai | time with time zone | | plain | |
dfgh | timestamp without time zone | | plain | |
dfga | timestamp with time zone | | plain | |
vbg | smalldatetime | | plain | |
Has OIDs: no
Distribute By: HASH(da)
Location Nodes: ALL DATANODES
Options: orientation=row, compression=no
*/
-- 插入数据。
INSERT INTO myschema.time_type_tab VALUES ('21:21:21','21:21:21 gmt','2010-12-12','2013-12-11 gmt','2003-04-12 04:05:06');
-- 查看数据。
SELECT * FROM myschema.time_type_tab;
/*
da | dai | dfgh | dfga | vbg
----------+-------------+---------------------+------------------------+---------------------
21:21:21 | 21:21:21-08 | 2010-12-12 00:00:00 | 2013-12-11 16:00:00+08 | 2003-04-12 04:05:00
(1 row)
*/
-- 删除表。
DROP TABLE myschema.time_type_tab;
-- 创建表。
-- select interval '5' day + interval '10' second;结果就为5天10秒,在Oracle中较为常用。
-- 如下创建了一个interval day to second类型 天的位数为3 秒的位数为4
CREATE TABLE myschema.day_type_tab (a int,b INTERVAL DAY(3) TO SECOND (4));
-- 插入数据。
INSERT INTO myschema.day_type_tab VALUES (1, INTERVAL '3' DAY);
-- 插入333天2小时10分10秒
INSERT INTO myschema.day_type_tab VALUES (2, INTERVAL '333 2:10:10' DAY to second);
-- 查看数据。
SELECT * FROM myschema.day_type_tab;
/*
a | b
---+-------------------
1 | 3 days
2 | 333 days 02:10:10
(2 rows)
*/
-- 删除表。
DROP TABLE myschema.day_type_tab;
-- 创建表。
CREATE TABLE myschema.year_type_tab(a int, b interval year (6));
-- 插入数据。
INSERT INTO myschema.year_type_tab VALUES(1,interval '2' year);
-- 查看数据。
SELECT * FROM myschema.year_type_tab;
a | b
---+---------
1 | 2 years
(1 row)
-- 删除表。
DROP TABLE myschema.year_type_tab;
列存支持类型表
类别 | 数据类型 | 长度 | 是否支持 |
---|---|---|---|
Numeric Types | smallint | 2 | 支持 |
integer | 4 | 支持 | |
bigint | 8 | 支持 | |
decimal | 可变长度 | 支持 | |
numeric | 可变长度 | 支持 | |
real | 4 | 支持 | |
double precision | 8 | 支持 | |
smallserial | 2 | 支持 | |
serial | 4 | 支持 | |
bigserial | 8 | 支持 | |
Monetary Types | money | 8 | 支持 |
Character Types | character varying(n), varchar(n) | 可变长度 | 支持 |
character(n), char(n) | n | 支持 | |
character、char | 1 | 支持 | |
text | 可变长度 | 支持 | |
nvarchar2 | 可变长度 | 支持 | |
name | 64 | 不支持 | |
Date/Time Types | timestamp with time zone | 8 | 支持 |
timestamp without time zone | 8 | 支持 | |
date | 4 | 支持 | |
time without time zone | 8 | 支持 | |
time with time zone | 12 | 支持 | |
interval | 16 | 支持 | |
big object | clob | 可变长度 | 支持 |
blob | 可变长度 | 不支持 | |
other types | … | … | 不支持 |