
点击“蓝字”关注我们
数据类型是编程语言中,在其数据结构上定义的相同值类型的集合以及对该相同值集合的一组操作。而数据类型的值存储离不开变量,因此变量的一个作用就是使用它来存储相同值集的数据类型。数据类型决定了如何将代表这些值的集合存储在计算机的内存中。变量一般遵循先声明后使用的原则。而在数据库中,变量就是字段,用字段来表示一组相同值类型的集合,其实也是先声明后使用的原则。
PostgreSQL支持丰富的数据类型,包括一般的数据类型和非常规的数据类型。一般数据类型包括数值型,货币类型,字符类型,日期类型,布尔类型,枚举类型等,非常规数据类型包括二进制数据类型,几何类型,网络地址类型,位串类型,文本搜索类型,UUID类型,XML类型,JSON类型,数组类型,复合类型,范围类型,Domain类型,OID类型,pg_lsn类型和pseudo-Types类型。
数值类型
1.1
整型
PostgreSQL中的整型类型有小整型,整型,大整型,用 smallint,integer,和bigint表示,虽然三个都可以存储相同的数据类型,但是它们各自的存储大小和存储范围却不相同。见下表:
| 名称 | 描述 | 存储空间 | 范围 |
SMALLINT | 小范围整数,别名为INT2。 | 2字节 | -32,768 - +32,767 |
| INTEGER | 常用的整数,别名为INT4。 | 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 |
示例:
hrdb=# --创建整型数据类型的表hrdb=# CREATE TABLE IF NOT EXISTS tab_num(v1 smallint,v2 smallint,v3 int,v4 int,v5 bigint,v6 bigint);CREATE TABLEhrdb=# --表字段注释hrdb=# COMMENT ON COLUMN tab_num.v1 IS '小整型最小范围';COMMENThrdb=# COMMENT ON COLUMN tab_num.v2 IS '小整型最大范围';COMMENThrdb=# COMMENT ON COLUMN tab_num.v3 IS '整型最小范围';COMMENThrdb=# COMMENT ON COLUMN tab_num.v4 IS '整型最大范围';COMMENThrdb=# COMMENT ON COLUMN tab_num.v5 IS '大整型最小范围';COMMENThrdb=# COMMENT ON COLUMN tab_num.v6 IS '大整型最大范围';COMMENThrdb=# --描述数据类型hrdb=# \d+ tab_numTable "public.tab_num"Column | Type | Collation | Nullable | Default | Storage | Stats target | Description--------+----------+-----------+----------+---------+---------+--------------+----------------v1 | smallint | | | | plain | | 小整型最小范围v2 | smallint | | | | plain | | 小整型最大范围v3 | integer | | | | plain | | 整型最小范围v4 | integer | | | | plain | | 整型最大范围v5 | bigint | | | | plain | | 大整型最小范围v6 | bigint | | | | plain | | 大整型最大范围hrdb=# --插入不同整型的范围数值hrdb=# INSERT INTO tab_numhrdb-# VALUES (-32768,hrdb(# 32767,hrdb(# -2147483648,hrdb(# 2147483647,hrdb(# -9223372036854775808,hrdb(# 9223372036854775807);INSERT 0 1hrdb=# --查询结果hrdb=# SELECT * FROM tab_num;v1 | v2 | v3 | v4 | v5 | v6--------+-------+-------------+------------+----------------------+----------------------32768 | 32767 | -2147483648 | 2147483647 | -9223372036854775808 | 9223372036854775807(1 row)
hrdb=# *hrdb*# smallint,integer,biginthrdb*# 数据类型分别使用hrdb*# int2,int4,int8代替hrdb*# */hrdb-# CREATE TABLE IF NOT EXISTS tab_numint(v1 int2,v2 int2,v3 int4,v4 int4,v5 int8,v6 int8);CREATE TABLEhrdb=# --描述表定义及数据类型hrdb=# \d+ tab_numintTable "public.tab_numint"Column | Type | Collation | Nullable | Default | Storage | Stats target | Description--------+----------+-----------+----------+---------+---------+--------------+-------------v1 | smallint | | | | plain | |v2 | smallint | | | | plain | |v3 | integer | | | | plain | |v4 | integer | | | | plain | |v5 | bigint | | | | plain | |v6 | bigint | | | | plain | |
1.2
任意精度类型和浮点类型
任意精度类型 numeric、decimal可以存储范围大的数字,存储大小为可变大小,小数点前最多131072位数字,小数点后最多16383位。它可以使用类似浮点类型,将小数精确到保留几位,也可以参与计算可以得到准确的值,但是相比于浮点类型,它的计算比较慢。通常 numeric被推荐使用于存储货币金额或其它要求计算准确的值。详细见下表:
| 名称 | 描述 | 存储空间 | 范围 |
NUMERIC[(p[,s])], DECIMAL[(p[,s])] | 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 说明: p为总位数,s为小数位数 | 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 | 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
| real | 可变精度 | 4个字节 | 6位小数精度 |
| double precision | 可变精度 | 8个字节 | 15位小数精度 |
示例:任意精度类型
hrdb=# --任意精度类型示例hrdb=# CREATE TABLE IF NOT EXISTS tab_any_precision(col1 numeric(10,4),col2 decimal(6,4),col3 real,col4 double precision,col5 float4,col6 float8);CREATE TABLEhrdb=# --字段注释hrdb=# COMMENT ON COLUMN tab_any_precision.col1 IS '表示整数最大位数为6,小数仅保留4位';COMMENThrdb=# COMMENT ON COLUMN tab_any_precision.col2 IS '表示整数最大位数为2,小数保留4位';COMMENThrdb=# COMMENT ON COLUMN tab_any_precision.col3 IS '表示可变的6位精度的数值类型';COMMENThrdb=# COMMENT ON COLUMN tab_any_precision.col4 IS '表示可变的15位精度的数值类型';COMMENThrdb=# COMMENT ON COLUMN tab_any_precision.col5 IS '同real';COMMENThrdb=# COMMENT ON COLUMN tab_any_precision.col6 IS '同double precision';COMMENThrdb=# --查看表定义hrdb=# \d+ tab_any_precisionTable "public.tab_any_precision"Column | Type | Collation | Nullable | Default | Storage | Stats target | Description--------+------------------+-----------+----------+---------+---------+--------------+-----------------------------------col1 | numeric(10,4) | | | | main | | 表示整数最大位数为6,小数仅保留4位col2 | numeric(6,4) | | | | main | | 表示整数最大位数为2,小数保留4位col3 | real | | | | plain | | 表示可变的6位精度的数值类型col4 | double precision | | | | plain | | 表示可变的15位精度的数值类型col5 | real | | | | plain | | 同realcol6 | double precision | | | | plain | | 同double precisionhrdb=# --插入任意精度测试hrdb=# INSERT INTO tab_any_precisionhrdb-# VALUES(202004.26,20.2004,20.200426,20.203415341535157,20.200426,20.203415341535157);INSERT 0 1hrdb=# INSERT INTO tab_any_precisionhrdb-# VALUES(202004.26105,20.20045,20.2004267,20.2034153415351573,20.2004264,20.2034153415351575);INSERT 0 1hrdb=# --可以发现col1和col2小数部分可以超过4位,但是读取仅仅保留4位,并遵循四舍五入的原则,如下结果hrdb=# SELECT * FROM tab_any_precision;col1 | col2 | col3 | col4 | col5 | col6-------------+---------+---------+------------------+---------+------------------202004.2600 | 20.2004 | 20.2004 | 20.2034153415352 | 20.2004 | 20.2034153415352202004.2611 | 20.2005 | 20.2004 | 20.2034153415352 | 20.2004 | 20.2034153415352(2 rows)hrdb=# *hrdb*# 如果 col1 插入的整数最大位数超过6,将会报错。hrdb*# 如果 col2 插入的整数最大位数超过2,将会报错。hrdb*# real 和 double precision 没有限制。hrdb*# */hrdb-# INSERT INTO tab_any_precisionhrdb-# VALUES(2020042.610,20.2004,20.2004267,20.2034153415351573,20.2004264,20.2034153415351575);ERROR: numeric field overflowDETAIL: A field with precision 10, scale 4 must round to an absolute value less than 10^6.hrdb=# INSERT INTO tab_any_precisionhrdb-# VALUES(202004.26105,202.200,20.2004267,20.2034153415351573,20.2004264,20.2034153415351575);ERROR: numeric field overflowDETAIL: A field with precision 6, scale 4 must round to an absolute value less than 10^2.hrdb=#
1.3
序列类型
SMALLSERIAL,SERIAL和BIGSERIAL类型不是真正的数据类型,只是为在表中设置唯一标识做的概念上的便利。因此,创建一个整数字段,并且把它的缺省数值安排为从一个序列发生器读取。应用了一个NOT NULL约束以确保NULL不会被插入。在大多数情况下用户可能还希望附加一个UNIQUE或PRIMARY KEY约束避免意外地插入重复的数值,但这个不是自动的。最后,将序列发生器从属于那个字段,这样当该字段或表被删除的时候也一并删除它。
| 名称 | 描述 | 存储空间 | 范围 |
| SMALLSERIAL | 二字节序列整型 | 2字节 | 1 - 32,767 |
| SERIAL | 四字节序列整型 | 4字节 | 1 - 2,147,483,647 |
| BIGSERIAL | 八字节序列整型 | 8字节 | 1 - 9,223,372,036,854,775,807 |
示例:
hrdb=# --创建序列类型表hrdb=# CREATE TABLE tab_serial(col1 smallserial,col2 serial,col3 bigserial);CREATE TABLEhrdb=# --字段注释hrdb=# COMMENT ON COLUMN tab_serial.col1 IS '小整型序列,从1开始,最大值为32767';COMMENThrdb=# COMMENT ON COLUMN tab_serial.col2 IS '小整型序列,从1开始,最大值为2147483647';COMMENThrdb=# COMMENT ON COLUMN tab_serial.col3 IS '小整型序列,从1开始,最大值为9223372036854775807';COMMENThrdb=# --查看表定义hrdb=# \d+ tab_serialTable "public.tab_serial"Column | Type | Collation | Nullable | Default | Storage | Stats target | Description--------+----------+-----------+----------+------------------------------------------+---------+--------------+--------------------------------------------------col1 | smallint | | not null | nextval('tab_serial_col1_seq'::regclass) | plain | | 小整型序列,从1开始,最大值为32767col2 | integer | | not null | nextval('tab_serial_col2_seq'::regclass) | plain | | 小整型序列,从1开始,最大值为2147483647col3 | bigint | | not null | nextval('tab_serial_col3_seq'::regclass) | plain | | 小整型序列,从1开始,最大值为9223372036854775807hrdb=# --插入数据hrdb=# INSERT INTO tab_serial VALUES(1,1,1);INSERT 0 1hrdb=# INSERT INTO tab_serial VALUES(32767,2147483647,9223372036854775807);INSERT 0 1hrdb=# --如果插入的值大于序列整型值的范围,将会整型类型越界的ERRORhrdb=# INSERT INTO tab_serial VALUES(32767,2147483647,9223372036854775808);ERROR: bigint out of rangehrdb=# INSERT INTO tab_serial VALUES(32767,2147483648,9223372036854775807);ERROR: integer out of rangehrdb=# INSERT INTO tab_serial VALUES(32768,2147483647,9223372036854775807);ERROR: smallint out of rangehrdb=# --当然,既然是序列类型,那可以插入默认值hrdb=# INSERT INTO tab_serialhrdb-# VALUES(default,default,default);INSERT 0 1
hrdb=# --先创建序列hrdb=# CREATE SEQUENCE IF NOT EXISTS serial_smallhrdb-# INCREMENT BY 1hrdb-# START WITH 1hrdb-# NO CYCLE;CREATE SEQUENCEhrdb=# --再创建表hrdb=# CREATE TABLE IF NOT EXISTS tab_test_serial(hrdb(# col1 smallint default nextval('serial_small'),hrdb(# col2 integer default nextval('serial_small'),hrdb(# col3 bigint default nextval('serial_small')hrdb(# );CREATE TABLEhrdb=# --插入数据hrdb=# INSERT INTO tab_test_serial VALUES(default);INSERT 0 1hrdb=# --查询数据hrdb=# SELECT * FROM tab_test_serial ;col1 | col2 | col3------+------+------1 | 2 | 3(1 row)
货币数据类型
货币类型存储带有固定小数精度的货币金额。
关于货币数据类型的详细信息如下表:
| 名称 | 存储容量 | 描述 | 范围 |
| money | 8 字节 | 货币金额 | -92233720368547758.08 到 +92233720368547758.07 |
示例:
hrdb=# --创建货币数据类型表hrdb=# CREATE TABLE IF NOT EXISTS tab_money(amounts money);CREATE TABLEhrdb=# --字段注释hrdb=# COMMENT ON COLUMN tab_money.amounts IS '金额';COMMENThrdb=# --插入数值hrdb=# INSERT INTO tab_money VALUES('20.00');INSERT 0 1hrdb=# --查询数据hrdb=# SELECT * FROM tab_money;amounts---------$20.00(1 row)
hrdb=# --方法一:直接使用translate函数将 $ 符号转换为 ¥ 符号hrdb=# SELECT translate(amounts::varchar,'$','¥') FROM tab_money;translate-----------¥20.00(1 row)hrdb=# --方法二:修改区域货币符号显示参数hrdb=# --查看本地区域货币符号显示参数hrdb=# show lc_monetary ;lc_monetary-------------en_US.UTF-8(1 row)hrdb=# --修改区域货币符号显示参数hrdb=# ALTER SYSTEM SET lc_monetary = 'zh_CN.UTF-8';ALTER SYSTEMhrdb=# --重新加载动态参数hrdb=# SELECT pg_reload_conf();pg_reload_conf----------------t(1 row)hrdb=# --重新查看本地区域货币符号显示参数hrdb=# show lc_monetary;lc_monetary-------------zh_CN.UTF-8(1 row)hrdb=# --重新查询数据hrdb=# SELECT * FROM tab_money;amounts---------¥20.00(1 row)
hrdb=# INSERT INTO tab_money VALUES('20.22');INSERT 0 1hrdb=# SELECT * FROM tab_money ;amounts---------¥20.00¥20.22(2 rows)hrdb=# --货币数据类型避免精度丢失的解决方法SELECT amounts::numeric::float8 FROM tab_money;amounts---------2020.22
温馨提示:
布尔类型
| 名称 | 描述 | 存储空间 | 取值 |
| BOOLEAN | 布尔类型 | 1字节 | true:真 false:假 null:未知(unknown |
示例:
hrdb=# --创建boolean类型表hrdb=# CREATE TABLE IF NOT EXISTS tab_boolean(col1 boolean,col2 boolean);CREATE TABLEhrdb=# --插入布尔类型的状态值,状态值可以是以下任意一种hrdb=# INSERT INTO tab_boolean VALUES(TRUE,FALSE);--规范用法INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('true','false');INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('True','False');INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('TRUE','FALSE');INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('1','0');INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('on','off');INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('ON','OFF');INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('y','n');INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('Y','N');INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('yes','no');INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('Yes','No');INSERT 0 1hrdb=# INSERT INTO tab_boolean VALUES('YES','NO');INSERT 0 1hrdb=# SELECT * FROM tab_boolean ;col1 | col2------+------t | ft | ft | ft | ft | ft | ft | ft | ft | ft | ft | ft | f(12 rows)
字符类型
| 名称 | 描述 | 存储空间 |
CHAR(n) CHARACTER(n) | 定长字符串,不足补空格。n是指字符长度,如不带精度n,默认精度为1。 | 最大为10MB。 |
VARCHAR(n) CHARACTER VARYING(n) | 变长字符串。n是指字符长度。 | 最大为10MB。 |
| TEXT | 变长字符串。 | 最大为1G-8023B(即1073733621B)。 |
| 名称 | 描述 | 存储空间 |
| name | 用于对象名的内部类型。 | 64字节 |
| "char" | 单字节内部类型。 | 1字节 |
示例:
hrdb=# --创建字符类型表hrdb=# CREATE TABLE IF NOT EXISTS tab_chartype(hrdb(# col1 char(15),hrdb(# col2 varchar(15),hrdb(# col3 text,hrdb(# col4 name,hrdb(# col5 "char" );CREATE TABLEhrdb=# --字段注释hrdb=# COMMENT ON COLUMN tab_chartype.col1 IS '表示定长为15的字符串';COMMENThrdb=# COMMENT ON COLUMN tab_chartype.col2 IS '表示变长为15的字符串';COMMENThrdb=# COMMENT ON COLUMN tab_chartype.col3 IS '表示变长字符串,为varchar的扩展字符串';COMMENThrdb=# COMMENT ON COLUMN tab_chartype.col4 IS '用于对象名的内部类型';COMMENThrdb=# COMMENT ON COLUMN tab_chartype.col5 IS '表示单字节类型';COMMENThrdb=# --插入数据hrdb=# INSERT INTO tab_chartypehrdb-# VALUES('sungsasong','sungsasong','sungsasong','tab_chartype','s');INSERT 0 1hrdb=# --插入包含空格的数据hrdb=# INSERT INTO tab_chartypehrdb-# VALUES('sungsa song','sung sas ong','sung sa song ','tab_chartype','s');INSERT 0 1hrdb=# --计算不同数据类型存储的字符串的长度hrdb=# SELECT char_length(col1),char_length(col2),char_length(col3),char_length(col4),char_length(col5)hrdb-# FROM tab_chartype ;char_length | char_length | char_length | char_length | char_length-------------+-------------+-------------+-------------+-------------10 | 10 | 10 | 12 | 111 | 12 | 13 | 12 | 1
温馨提示:
二进制数据类型
| 名称 | 描述 | 存储空间 |
| BYTEA | 变长的二进制字符串 | 4字节加上实际的二进制字符串。最大为1G-8203字节。 |
注意:除了每列的大小限制以外,每个元组的总大小也不可超过1G-8203字节。
示例:
hrdb=# --创建两种bytea格式的表hrdb=# CREATE TABLE IF NOT EXISTS tab_bytea(col1 bytea,col2 bytea);CREATE TABLEhrdb=# --字段注释hrdb=# COMMENT ON COLUMN tab_bytea.col1 IS 'bytea hex 格式的二进制串';COMMENThrdb=# COMMENT ON COLUMN tab_bytea.col2 IS 'bytea escape 格式的二进制串';COMMENThrdb=# --插入数据,第一个值代表单引号,输出16进制的值为\x27,第二个为转义16进制的值fhrdb=# INSERT INTO tab_byteahrdb-# VALUES('\047',E'\xF');INSERT 0 1hrdb=# --插入数据,第一个值代表反斜杠,输出16禁止的值为\x5c,第二个值为转义16进制的值fchrdb=# INSERT INTO tab_byteahrdb-# VALUES('\134',E'\\xFC');INSERT 0 1hrdb=# --查看结果hrdb=# SELECT * FROM tab_bytea;col1 | col2------+------\x27 | \x0f\x5c | \xfc
注意:
hrdb=# SELECT hextoraw('FCd');hextoraw----------FCDINSERT INTO tab_byteaVALUES('\134',E'\\xFG');ERROR: invalid hexadecimal digit: "G"LINE 2: VALUES('\134',E'\\xFG');
日期时间数据类型
| 名称 | 描述 | 存储空间 |
| 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字节 |
| reltime | 相对时间间隔。格式为: X years X mons X days XX:XX:XX。 | 4字节 |
6.1
日期输入
type [ ( p ) ] 'value'
示例:
hrdb=> --创建日期输入表hrdb=> CREATE TABLE tab_datetype(col1 date);CREATE TABLEhrdb=> --字段注释hrdb=> COMMENT ON COLUMN tab_datetype.col1 IS '日期类型,默认遵循datestyle风格(MDY)';COMMENThrdb=> --插入数据hrdb=> INSERT INTO tab_datetype VALUES(date '04-26-2020');INSERT 0 1hrdb=> --在MDY风格下,也支持YMD的输入方式,但是不支持DMY或者其它格式的输入,如下会报错hrdb=> INSERT INTO tab_datetype VALUES(date '22-04-2020');ERROR: date/time field value out of range: "22-04-2020"LINE 1: INSERT INTO tab_datetype VALUES(date '22-04-2020');^HINT: Perhaps you need a different "datestyle" setting.hrdb=> --解决办法,修改datestyle的格式hrdb=> --查看当前数据库的datestyle的格式hrdb=> show datestyle;DateStyle-----------ISO, MDY(1 row)hrdb=> --会话级别修改datestyle格式hrdb=> SET datestyle = 'DMY';SEThrdb=> --再次插入 22-04-2020hrdb=> INSERT INTO tab_datetype VALUES(date '22-04-2020');INSERT 0 1hrdb=> --查询数据hrdb=> SELECT * FROM tab_datetype ;col1------------2020-04-262020-04-22
6.2
时间输入
时间类型包括
time [ (p) ] without time zone 和time [ (p) ] with time zone。
如果只写time等效于time without time zone。即不带时区的时间格式
如果在time without time zone类型的输入中声明了时区,则会忽略这个时区。
示例:
hrdb=> --不带时区的时间hrdb=> SELECT time '13:22:25';time----------13:22:25(1 row)hrdb=> SELECT time without time zone '20:20:18';time----------20:20:18(1 row)hrdb=> SELECT time with time zone '18:20:20';timetz-------------18:20:20+08(1 row)
6.3
特殊时间类型
示例:
hrdb=> --创建reltime时间数据类型表hrdb=> CREATE TABLE tab_reltime(col1 varchar,col2 reltime);CREATE TABLEhrdb=> --字段注释hrdb=> COMMENT ON COLUMN tab_reltime.col1 IS '原始时间文本时间';COMMENThrdb=> COMMENT ON COLUMN tab_reltime.col2 IS 'reltime表示的时间以实际时间计算得到显示结果';COMMENThrdb=> --插入数据hrdb=> INSERT INTO tab_reltime VALUES('125','125');INSERT 0 1hrdb=> INSERT INTO tab_reltime VALUES('10 DAYS','10 DAYS');INSERT 0 1hrdb=> INSERT INTO tab_reltime VALUES('420 DAYS 12:00:23','420 DAYS 12:00:23');INSERT 0 1hrdb=> --查询数据hrdb=> SELECT * FROM tab_reltime;col1 | col2-------------------+-------------------------------125 | 00:02:0510 DAYS | 10 days420 DAYS 12:00:23 | 1 year 1 mon 25 days 06:00:23
温馨提示:
6.4
其它时间类型
其它时间类型包含时间戳及间隔时间数据类型,示例如下:
示例:
hrdb=> --创建时间戳和间隔时间表hrdb=> CREATE TABLE tab_timestamp_interval(col1 timestamp with time zone,col2 timestamp without time zone,col3 interval day to second);CREATE TABLEhrdb=> --字段注释hrdb=> COMMENT ON COLUMN tab_timestamp_interval.col1 IS '带时区的时间戳';COMMENThrdb=> COMMENT ON COLUMN tab_timestamp_interval.col2 IS '不带时区的时间戳';COMMENThrdb=> COMMENT ON COLUMN tab_timestamp_interval.col1 IS '间隔时间类型';COMMENThrdb=> --插入数据hrdb=> INSERT INTO tab_timestamp_intervalhrdb-> VALUES('2020-04-26 13:20:34.234322 CST',hrdb(> '2020-04-08 14:40:12.234231+08',hrdb(> '165');INSERT 0 1hrdb=> INSERT INTO tab_timestamp_intervalhrdb-> VALUES('2020-04-25 14:56:34.223421',hrdb(> '2020-04-09 18:54:12.645643 CST',hrdb(> '10 YEAR 3 MONTH 25 DAYS 14 HOUR 32 MINUTE 19 SECOND');INSERT 0 1hrdb=> --查询数据hrdb=> SELECT * FROM tab_timestamp_interval;col1 | col2 | col3-------------------------------+----------------------------+----------------------------------2020-04-27 03:20:34.234322+08 | 2020-04-08 14:40:12.234231 | 00:02:452020-04-25 14:56:34.223421+08 | 2020-04-09 18:54:12.645643 | 10 years 3 mons 25 days 14:32:19
网络地址类型
| 名称 | 存储空间 | 描述 |
| cidr | 7或19字节 | IPv4或IPv6网络 |
| inet | 7或19字节 | IPv4或IPv6主机和网络 |
| macaddr | 6字节 | MAC地址 |
示例:
hrdb=> --创建IP地址及MAC地址表hrdb=> CREATE TABLE tab_icm(col1 cidr,col2 inet,col3 macaddr);CREATE TABLEhrdb=> --字段注释hrdb=> COMMENT ON COLUMN tab_icm.col1 IS '存储IPv4或IPv6网络地址类型';COMMENThrdb=> COMMENT ON COLUMN tab_icm.col2 IS '存储IPv4或IPv6网络地址类型及子网';COMMENThrdb=> COMMENT ON COLUMN tab_icm.col3 IS '存储设备MAC地址';COMMENThrdb=> --插入数据hrdb=> INSERT INTO tab_icm VALUES('10.10.20.10/32','10.10.20.10','00-50-56-C0-00-08');INSERT 0 1hrdb=> INSERT INTO tab_icm VALUES('10.10.20/24','10.10.20.10','00-50-56-C0-00-08');INSERT 0 1hrdb=> INSERT INTO tab_icm VALUES('10.10/16','10.10.20.10','00-50-56-C0-00-08');INSERT 0 1hrdb=> INSERT INTO tab_icm VALUES('10/8','10.10.20.10','00-50-56-C0-00-08');INSERT 0 1hrdb=> INSERT INTO tab_icm VALUES('fe80::81a7:c17c:788c:7723/128','fe80::81a7:c17c:788c:7723','00-50-56-C0-00-01');INSERT 0 1hrdb=> --查询数据SELECT * FROM tab_icm;col1 | col2 | col3-------------------------------+---------------------------+-------------------10.10.20.10/32 | 10.10.20.10 | 00:50:56:c0:00:0810.10.20.0/24 | 10.10.20.10 | 00:50:56:c0:00:0810.10.0.0/16 | 10.10.20.10 | 00:50:56:c0:00:0810.0.0.0/8 | 10.10.20.10 | 00:50:56:c0:00:08fe80::81a7:c17c:788c:7723/128 | fe80::81a7:c17c:788c:7723 | 00:50:56:c0:00:01(5 rows)
几何数据类型
点
线(射线)
线段
矩形
路径(包含开放路径【开放路径类似多边形】和闭合路径)
多边形
圆
| 名称 | 存储空间 | 说明 | 表现形式 |
| point | 16字节 | 平面中的点 | (x,y) |
| lseg | 32字节 | (有限)线段 | ((x1,y1),(x2,y2)) |
| box | 32字节 | 矩形 | ((x1,y1),(x2,y2)) |
| path | 16+16n字节 | 闭合路径(与多边形类似) | ((x1,y1),...) |
| path | 16+16n字节 | 开放路径 | [(x1,y1),...] |
| polygon | 40+16n字节 | 多边形(与闭合路径相似) | ((x1,y1),...) |
| circle | 24字节 | 圆 | <(x,y),r> (圆心和半径) |
示例:
hrdb=> --创建几何数据类型表hrdb=> CREATE TABLE tab_geometric(col1 point,col2 lseg,col3 box,col4 path,col5 path,col6 polygon,col7 circle);CREATE TABLEhrdb=> --字段注释hrdb=> COMMENT ON COLUMN tab_geometric.col1 IS '二维几何的基本构造点(x,y)';COMMENThrdb=> COMMENT ON COLUMN tab_geometric.col2 IS '线段((x1,y1),(x2,y2))';COMMENThrdb=> COMMENT ON COLUMN tab_geometric.col3 IS '矩形((x1,y1),(x1,y2),(x2,y1),(x2,y1)),';COMMENThrdb=> COMMENT ON COLUMN tab_geometric.col4 IS '开放路径((x1,y1),(x2,y2),(x3,y3),...)';COMMENThrdb=> drop table tab_geometric ;DROP TABLEhrdb=> --创建几何数据类型表hrdb=> CREATE TABLE tab_geometric(col1 point,col2 lseg,col3 box,col4 path,col5 path,col6 polygon,col7 circle);CREATE TABLEhrdb=> --字段注释hrdb=> COMMENT ON COLUMN tab_geometric.col1 IS '二维几何的基本构造点(x,y)';COMMENThrdb=> COMMENT ON COLUMN tab_geometric.col2 IS '线段[(x1,y1),(x2,y2)]';COMMENThrdb=> COMMENT ON COLUMN tab_geometric.col3 IS '矩形((x1,y1),(x1,y2)),';COMMENThrdb=> COMMENT ON COLUMN tab_geometric.col4 IS '开放路径[(x1,y1),(x2,y2),(x3,y3),...]';COMMENThrdb=> COMMENT ON COLUMN tab_geometric.col5 IS '闭合路径[(x1,y1),(x2,y2),(x3,y3),...,(xn,yn)]';COMMENThrdb=> COMMENT ON COLUMN tab_geometric.col6 IS '多边形,相当于闭合路径((x1,y1),(x2,y2),(x3,y3),...,(xn,yn)';COMMENThrdb=> COMMENT ON COLUMN tab_geometric.col7 IS '一组坐标点作为圆心和半径r构成<(x,y),r>';COMMENThrdb=> --插入数据hrdb=> INSERT INTO tab_geometrichrdb-> VALUES('(1,2)',hrdb(> '[(1,2),(2,3)]',hrdb(> '((1,2),(1,3))',hrdb(> '[(1,2),(2,3),(2,4),(1,3),(0,2)]',hrdb(> '[(1,2),(2,3),(3,4)]',hrdb(> '((1,2),(2,3),(2,4),(1,3),(0,2))',hrdb(> '<(2,3),3>');INSERT 0 1hrdb=> --查询数据hrdb=> SELECT * FROM tab_geometric;col1 | col2 | col3 | col4 | col5 | col6 | col7-------+---------------+-------------+---------------------------------+---------------------+---------------------------------+-----------(1,2) | [(1,2),(2,3)] | (1,3),(1,2) | [(1,2),(2,3),(2,4),(1,3),(0,2)] | [(1,2),(2,3),(3,4)] | ((1,2),(2,3),(2,4),(1,3),(0,2)) | <(2,3),3>
JSON数据类型
示例:
hrdb=> --创建JSON数据类型表hrdb=> CREATE TABLE tab_json(col1 json,col2 jsonb);CREATE TABLEhrdb=> --字段注释hrdb=> COMMENT ON COLUMN tab_json.col1 IS '存储json输入文本';COMMENThrdb=> COMMENT ON COLUMN tab_json.col1 IS '存储json转换后的二进制文本';COMMENThrdb=> --插入数据hrdb=> --插入数据hrdb=> INSERT INTO tab_jsonhrdb-> VALUES('{"江苏省":"南京市","甘肃省":"兰州市","北京市":"北京市"}',hrdb(> '{"湖北省":"武汉市","四川省":"成都市","陕西省":"西安市"}');INSERT 0 1hrdb=> --给col1创建索引,将会不被支持。col2支持索引hrdb=> CREATE INDEX idx_col1 ON tab_json USING GIN(col1);ERROR: data type json has no default operator class for access method "gin"HINT: You must specify an operator class for the index or define a default operator class for the data type.hrdb=> CREATE INDEX idx_col2 ON tab_json USING GIN(col2);CREATE INDEXhrdb=> --查询数据hrdb=> SELECT * FROM tab_json;col1 | col2---------------------------------------------------------+--------------------------------------------------------------{"江苏省":"南京市","甘肃省":"兰州市","北京市":"北京市"} | {"四川省": "成都市", "湖北省": "武汉市", "陕西省": "西安市"}
温馨提示:
数组数据类型
示例:
hrdb=> --创建数组表hrdb=> CREATE TABLE tab_array(col1 text[],col2 integer[][],col3 integer ARRAY[3]);CREATE TABLEhrdb=> --字段注释hrdb=> COMMENT ON COLUMN tab_array.col1 IS '文本类型一维数组';COMMENThrdb=> COMMENT ON COLUMN tab_array.col2 IS '整型类型二维数组';COMMENThrdb=> COMMENT ON COLUMN tab_array.col3 IS '声明长度为3的数组';COMMENThrdb=> --插入数据hrdb=> INSERT INTO tab_arrayhrdb-> VALUES('{"江苏省","甘肃省","北京市"}',hrdb(> '{1,2,3,4,5}',hrdb(> '{21,22,31}');INSERT 0 1hrdb=> INSERT INTO tab_arrayhrdb-> VALUES('{"天津市","湖北省","陕西市"}',hrdb(> '{5,4,3,2,1}',hrdb(> '{21,22,31,44}');INSERT 0 1hrdb=> --查询数据hrdb=> SELECT * FROM tab_array;col1 | col2 | col3------------------------+-------------+---------------{江苏省,甘肃省,北京市} | {1,2,3,4,5} | {21,22,31}{天津市,湖北省,陕西市} | {5,4,3,2,1} | {21,22,31,44}(2 rows)hrdb=> --访问指定列中某个数组的元素hrdb=> SELECT col1[1],col2[3],col3[4] FROM tab_array;col1 | col2 | col3--------+------+------江苏省 | 3 |天津市 | 3 | 44

推荐阅读

2020-04-29

2020-04-21


点击“阅读原文”




