当前位置:必发365电子游戏 > 操作系统 > 必发365电子游戏分别是基本数据类型、复合数据类型、域和伪类型
必发365电子游戏分别是基本数据类型、复合数据类型、域和伪类型
2019-12-19

 

第六章  数据类型

6.1概述

 

    PostgreSQL 提供了充分的数据类型。顾客能够选用 CREATE TYPE 命令在数据库中开改善的数据类型。PostgreSQL 的数据类型被分为四种,分别是主导数据类型、复合数据类型、域和伪类型。

 

    基本数据类型是数据库内置的数据类型,包蕴integer``、``char``、``varchar``等数据类型。表``6-1``列出了PostgreSQL提供的具有大旨数据类型。复合数据类型是顾客自个儿定义的,使用CREATE TYPE命令就会制造二个复合数据类型。域是后生可畏种独特的宗旨数据类型,它由基本数据类型加上一个约束标准构成,使用CREATE DOMAIN命令就能够创造叁个域,关于域的详细音讯,参谋《SQL命令手册》对CREATE DOMAIN命令的分解。伪类型是颇有特殊功效的数据类型,那么些数据类型不得不分畛域表的列的数据类型,只可以作为函数的参数或重回值的数据类型。

 

    下边包车型地铁小节将会详细介绍焦点数据类型、复合数据类型和伪类型。

表 6-1. 基本数据类型

名字

描述

bigint

有标记 8 字节整数

bigserial

自增八字节整数

bit [ (n) ]

定长位串

bit varying [ (n) ]

变长位串

boolean

逻辑布尔量 (真/假)

box

平面中的星型

bytea

二进制数据("字节数组")

character varying [ (n) ]

变长字符串

character [ (n) ]

定长字符串

cidr

IPv4 仍旧 IPv6 互连网地址

circle

平面中的圆

date

日历日期(年,月,日)

double precision

双精度浮点数字

inet

IPv4 只怕 IPv6 网络地址

integer

四字节长有标记整数

interval [ (p) ]

时刻间距

line

平面中的Infiniti长直线

lseg

平面中的线段

macaddr

MAC 地址

numeric [ (p, s) ]

可选精度的可信赖数字

path

平面中的几何路子

point

平面中的点

polygon

平面中的密封几何渠道

real

单精度浮点数

smallint

有号子两字节整数

serial

自增四字节整数

text

变长字符串

time [ (p) ] [ without time zone ]

一天里的光阴

time [ (p) ] with time zone

一天里的年华,蕴涵时区

timestamp [ (p) ] [ without time zone ]

日期和时间

timestamp [ (p) ] with time zone

日期和时间

tsquery

全文字笔迹核实索查询

tsvector

全文字笔迹核实索文书档案

txid_snapshot

客户等级事务ID快速照相

uuid

通用唯一标志符

xml

XML数据

兼容性: 下列类型是在SQL标准中定义的: bitbit varyingbooleancharcharactercharacter varyingvarchardatedouble precisionintegerintervalnumericdecimalrealsmallinttime (包涵有时区和无时区的), timestamp (包括有的时候区和无时区的)。

    PostgreSQL的词法解析器在深入剖析客户发生的SQL命令时,首先将此中的单词分成五类:整数、非整数数字、字符串、标记符和严重性字。半数以上的非数值常量首先被以为是字符串。

 

    SQL语言提供了明确地指定字符串的类型的机制。例如:




SELECT 'Origin':: text AS "label", '(0,0)':: point AS "value";

 

 label  | value

--------+-------

 Origin | (0,0)

(1 row)

 

在地点的例证中,客商内定'Origin' 的品类是text,'(0,0卡塔尔(英语:State of Qatar)'的类型是 point。假使客户未有明了地内定和'Origin'和'(0,0卡塔尔'的数据类型,系统先把它们的项目设为`unknown``,未来再明确它们的实际数据类型。```

 

6.2 数值类型

    数值类型包涵2、4或8字节的卡尺头,4或8字节的浮点数和可以定义精度的十进制数。 表6-2 列出了装有数值类型。

表6-2. 数值类型

名字

存储空间

描述

取值区间

smallint

2 字节

小整数

-32768 到 +32767

integer

4 字节

常用的整数

-2147483648 到 +2147483647

bigint

8 字节

大整数

-9223372036854775808 到 9223372036854775807

decimal

变长

顾客定义精度,能够精确地球表面示小数

无限制

numeric

变长

顾客定义精度,可以标准地球表面示小数

无限制

real

4 字节

精度可变,不能够确切地意味着小数

精度是6个十进制位

double precision

8 字节

精度可变,无法准确地代表小数

精度是拾四个十进制位

serial

4 字节

小范围的自增整数

大规模的自增整数

bigserial

8 字节

大面积的自增整数

1 到 9223372036854775807

    数值类型常量的语法在第1.4.4节里描述。 数值类型有黄金时代套完整的数学生运动算符和函数。相关音信请参见第7章。下边将详细描述那个项目。

6.2.1 整数类型

    类型 smallintintegerbigint 只好保留整数,也正是未有小数部分的数字。借使筹算在多少个整数品类中保存三个赶过它亦可代表的值范围的板寸,数据库将会报错。

    常用的品类是integer,因为它提供了在代表范围、存款和储蓄空间和属性之间的精品平衡。唯有在磁盘空间恐慌的状态下才使用 smallint。只有在 integer太小的时候才使用 bigint,因为在扩充数学生运动算时,interger类型的数据bigint类型的多寡要快。

    SQL标准只定义了整数类型 integer(或int)、smallint``和``bigint

6.2.2 任意精度数值

numeric品类最多能存款和储蓄有1000个数字位的数字还要能举办准确的数值总括。它根本用于要求标准地代表数字的场子,如货币金额。不过,对numeric 类型进行算术运算比整数类型和浮点类型要慢比超级多。

numeric花色有四个术语,分别是标度和精度。numeric``类型的标度(scale)是到小数点右边全部小数位的个数, numeric 的精度(precision)是负有数字位的个数,因举例, 23.5141 的精度是6而标度为4。能够以为整数的标度是零。

numeric 类型的最大精度和最大标度都是足以安插的。能够用下边包车型客车语法定义二个numeric类型:

(1)NUMERIC(precision, scale)

(2)NUMERIC(precision)

(3)NUMERIC

 

    精度必需为正数,标度可感到零只怕正数。在上头的第二种语法中并未有一点名标度,则系统会将标度设为0,所以NUMESportageIC(precision,0)``和NUMERIC(`precision)是等价的。第三种类型的语法没有指定精度和标度,则这种类型的列可以接受任意精度和标度的numeric数据(在系统能表示的最大精度范围内),而不会对输入的数据进行精度或标度的变换。如果一个列被定义成numeric类型而且指定了标度,那么输入的数据将被强制转换成这个标度(如果它的标度比定义列的numeric``的标度大),举办标度调换时的规规矩矩是四舍五入。假诺输入的数额开展标度调换后收获的多少在小数点左侧包车型大巴数据位的个数超越了列的档案的次序的精度减去标度的差,系统将会告诉周围上边包车型客车错误:```

`错误:  numeric品种数据溢出。```

`细节:  precision3, scale3的数必得被四舍五入成小于1的数。```

`    ``上边是一个实例:```

create table test ( col1 numeric(3,3));

insert into test values(0.5678);

insert into test values(0.5671);

insert into test values ( 1.4);

`错误:  numeric品种数据溢出。```

`细节:  precision3, scale3的数必需被四舍五入成小于1的数。```

=>select * from test;

col1

-------

0.568

0.567

`(2 rows)```

numeric 类型采用一个新鲜的值 “NaN``”,它的情致是“不是多个数字"。任何在 NaN 上边包车型客车操作都扭转此外四个 NaN。 固然在 SQL 命令里把这一个值当做八个常量写,必须把它用单引号引起来,比如 UPDATE table SET x = 'NaN'。在输入时,”NaN”的尺寸写漫不经意。

 

   注意:在别的的数据库中,NaN和别的的数值数据都不对等,多个NaN也是不等于的,在postgresSQL中,为了索引完成的有利,NaN被当作大于或等于全体非NaN的数值。

 

    类型 decimalnumeric是等价的,两体系型都以SQL规范定义的,SQL规范必要numeric的默许精度应该是0,PostgreSQL未有进行这些准则,为了压实程序的移植性,最佳还要钦定numeric的精度和标度。

6.2.3 浮点类型

数据类型 realdouble precision 表示不规范的变精度的数字。这么些连串完毕了IEEE 规范754二进制浮点数算术(分别对应单精度和双精度)。

 

    不确切的意思是一些数值不能精确地用real和double precision``表示,存款和储蓄在数据Curry的只是它们的相像值。假如供给规范地保留有个别数值(比如计算货币金额),应使用 numeric 类型。别的,相比五个浮点数是或不是等于时,恐怕会获得意料之外的结果。

    通常,real 类型的表示的数值范围是起码-1E+37到+1E+37,精度至少是6位小数。double precision 类型表示的界定平日是-1E+308到+1E+308 ,精度是起码13个人小数。太大依然太小的数值都会变成错误。借使输入数据的精度太高,会被约成能够被接收的精度。太贴近零的数字,假诺和0的里边表示方式同样,会爆发下溢(underflow)的不当。

    浮点类型还应该有多少个特别值:

Infinity
-Infinity
NaN

那个值分别表示 IEEE 754规范中的特殊值"正无穷大","负无穷大", 以致"不是四个数字"。即使在 SQL 命令里把那几个数值作为常量写,务必在它们用单引号引起来,举个例子UPDATE table SET x = 'Infinity'。 输入时,这个值的高低写无关大局。

 

注意:IEEE 754正经须要NaN和其他的数值数据都不等于,七个NaN也是不等于的,在postgresSQL中,为了索引落成的惠及,NaN被作为大于或等于全体非NaN的数值。

 

    PostgreSQL 还援救 SQL 标准中定义的档期的顺序floatfloat(p)p 定义以二进制位表示的最低能够选用的精度,p的取值在1到53里头。实际上,假使p的取值在1到24里面,float(p)被当做是real类型,假设p的取值在25到53中间,float(p)被看成是double precision``类型。不带精度的float被看作是`double precision``类型。```

6.2.4 种类号项目(Serial)

serialbigserial 并非的确的数据类型,只是为着能够给表中的数据行设置一个唯风度翩翩的标记。它犹如其余一些数据库中的 AUTO_INCREMENT 属性。使用它们的主意如下:

CREATE TABLE tablename (

        colname SERIAL

);

地点的下令实际上上等价于上面包车型客车两条命令:

CREATE SEQUENCE tablename_colname_seq;

CREATE TABLE tablename(

        colname integer DEFAULT nextval('tablename_colname_seq') NOT NULL

);

 

    上面的下令在表中开创了三个种类为无符号整数的列,该列与叁个连串对象相关联,那么些队列对象的早先值是1, 表中每插入一条新的笔录,该体系的值会自动加生龙活虎,在向表中插入数据时,INSERT命令不要为该列钦命数量,只怕钦赐它的值为DEFAULT。

    下边是二个实例:

create table test3 ( product_id serial, name char(5));

insert into test3(name)  values('pen');

insert into test3(name)  values('car');

insert into test3  values(DEFAULT, 'bike');

=>select * from  test3;

product_id | name

------------+-------

          1 | pen

          2 | car

          3 | bike

(3 rows)

 

    注意:insert命令中鲜明不要为serial或bigserial类型的列钦赐一个不是DEFAULT的值,因为对于那样的命令系统是不会报错的,会产生serial或bigserial类型的列上的数值现身混乱。

6.3 字符类型

表 6-3. 字符类型

名字

描述

character varying(n), varchar(n)

变长,最大尺寸有限定

character(n), char(n)

定长, 不足补空白

text

变长,最大尺寸未有约束

     表6-3列出了PostgresSQL中得以选择的字符类型。

    SQL规范定义了三种基本的字符类型:character varying(n)character(n),这里的n是贰个正整数。二种档次最多能够累积n个字符。试图存款和储蓄越来越长的字串到那么些项指标列里,系统会报错,除非全体超过长度n的字符都以空格(这种情景下该字符串将被截断成长度为n的字符串)。如若要存款和储蓄的字符串的尺寸比n小,类型为 character 的列将自动用空格填充该字符串,使它的尺寸达到n,而项目为 character varying 的列直接保存该字符串,不会对它举行任哪个地方理。

    假如鲜明将把三个数值转变来character(n)或者 character varying(n)``类型,如若调换之后的字符串的尺寸超越n,那么它将被活动截断成长度为n的字符串,系统不会报错(那也是SQL标准供给的)。

char(n)varchar(n) 分别是 character(n)character varying(n)的外号。未有定义长度的character 等同于 character(1)。未有定义长度的character varying花色选用任性长度的字符串,那是PostgreSQL的扩张个性。

 

另外,PostgreSQL 提供了text项目,它能够储存大肆长度的字符串,而且长度未有最大范围。固然SQL标准中并未有定义text类型,但多数其他SQL 数据库系统中有其风流倜傥类型。

 

character(n)``类型的数据在仓库储存时间长度度不足n的字符串会用空格填充,在展现数据时也会把填充的空格展现出来,不过在相比三个character``类型的值的时候,字符串的兼具结尾空格符号将自行被忽略,在调换到别的字符串类型的时候,character``类型的值里面结尾的空格字符都会被删除。请留意,对于 character varyingtext``类型的值,结尾的空格在拍卖时是不会被忽略的。

对于character(n)character varying(n)``类型,同意存款和储蓄的最长字符串所占的蕴藏空间差不离1GB。借使想囤积长度没有上限的长字串,那么使用 text``类型只怕未有一点名长度的character varying

 

   提示: 这两种数据类型之间从未品质差距,但是character(n)character varying(n)``类型多使用了物理存储空间。 即使在好几别的的数据库系统里,character(n)character varying(n)``快一些, 但在 PostgreSQL 里未有这种场所。在大许多场所下,应该运用text或者character varying

请参照他事他说加以考察第1.4.1节和1.4.2节赢得字符串常量的的语法新闻,参照他事他说加以考查第7.4节得四管理字符串的运算符和函数的音讯。数据库的字符集决定用于存款和储蓄文本值的字符集,有关字符集的详细新闻,请参见《数据库管理员指南》第5章。

 

   上边是二个用到字符串的实例:

CREATE TABLE test1 (a character(4));

INSERT INTO test1 VALUES ('ok');

INSERT INTO test1 VALUES ('ok '卡塔尔(قطر‎;  --ok前边跟了三个空格

SELECT a, char_length(a) FROM test1; --函数char_length``在第7.4节中有详实介绍.

  a   | char_length

------+-------------

 ok   |           2

 ok   |           2

(2 rows)

 

CREATE TABLE test2 (b varchar(5));

INSERT INTO test2 VALUES ('ok');

INSERT INTO test2 VALUES ('good      ');

INSERT INTO test2 VALUES ('too long');

似是而非:  输入的字符串对于项目character varying(5卡塔尔(英语:State of Qatar)来讲过长。

必发365电子游戏,INSERT INTO test2 VALUES ('too long'::varchar(5卡塔尔(英语:State of Qatar)卡塔尔(英语:State of Qatar); -- 截断字符串

SELECT b, char_length(b) FROM test2;

   b   | char_length

-------+-------------

 ok    |           2

 good  |           5

 too l |           5

 

    在 PostgreSQL 还会有此外三种定长字符串类型,在表6-4 里呈现。这两种类型是供系统内部使用的,应用程序不应该使用这两种类型。name类型长度当前定为 64 字节(63 可用字符加上得了符)。类型"char"(注意引号)和char(1)是不等同的,它只占叁个字节的囤积空间,它在系统内部当枚举类型用。

表6-4。 特殊字符类型

名字

仓库储存空间

描述

"char"

1 字节

单字节内部类型

name

64 字节

对象名的里边类型

 

6.4 二进制数据类型

bytea 类型可以储存二进制字符串,如表6-5所示。

 

表6-5. 二进制数据类型

名字

仓库储存空间

描述

bytea

1或4 字节加上实际的二进制字符串

变长的二进制字符串

  

二进制字符串是三个字节数值的队列。SQL 标准定义了风华正茂种分歧的二进制字符串类型,叫做 BLOB 或者 BINARY LARGE OBJECT``,其输入格式和 bytea 区别,不过提供的函数和操作符好多相通。``bytea``类型数据的具体含义由应用程序自己决定,数据库也提供了和普通文本字符串的处理方式类似的方法来对``bytea``类型数据进行输入和输出。

 

能够利用字符串常量的语法来输入bytea类型的数据,对特种的字符如单引号、反斜杠、不可打字与印刷的字符以致0,要接收转义表示法,具体用法如表6-6所示。

 

表6-6. `要求举办转义管理的字符```

十进制数值

描述

输入格式

例子

出口格式

0

'//000'

select '//000'::bytea;

/000

39

单引号

'/'' ``或者`` '//047'

select '/''::bytea;

'

92

反斜杠

'////' ``或者`` '//134'

select '////'::bytea;

//

0 到 31 和 127 到 255

不行打字与印刷的字符

'//xxx' (八进制值)

SELECT '//001'::bytea;

/001

   

bytea类型的数额在出口时也要开展转义管理,反斜杠用五个反斜杠表示,不可打字与印刷的字符用反斜杠加上表示它们的值的多个八进制位表示,可打字与印刷的字符用它们本人表示。如表6-7所示。

表6-7. bytea 出口格式

十进制数值

描述

转义现在的出口个数

例子

出口结果

92

反斜杠

//

select '//134'::bytea;

//

0 ``到`` ``31 ``和`` ``127 ``到`` ``255

不行打印的八进制字符

/xxx(octal value)

select '//001'::bytea;

/001

32 ``到`` ``126

可打字与印刷的八进制字符

顾客端字符集展现格局

(``1``)``select '//175'::bytea;

(``2``)``select '//165//166'::bytea

(``1``)``}

(``2``)``uv

 

6.5 日期/时间档案的次序

    PostgreSQL 补助SQL典型中兼有的日子和岁月等级次序,如表6-8所示。那些数据类型上能够展开的操作在第7.9节里描述。

表6-8. 日期/时间项目

名字

储存空间尺寸

描述

最小值

最大值

分辨率

timestamp [ (p) ] [ without time zone ]

8 bytes

包罗日期和时间

4713 BC

294276 AD

1微妙/ 14 位

timestamp [ (p) ] with time zone

8 bytes

包蕴日期和时间,带时区

4713 BC

294276 AD

1微妙/ 14 位

interval [ (p) ]

12 bytes

日子间距

-178000000 年

178000000 年

1微妙/ 14 位

date

4 bytes

唯有日期

4713 BC

5874897 AD

1 天

time [ (p) ] [ without time zone ]

8 bytes

唯有时间

00:00:00

24:00:00

1微妙/ 14 位

time [ (p) ] with time zone

12 bytes

唯有的时候间,带时区

00:00:00+1459

24:00:00-1459

1微妙/ 14 位

timetimestampinterval能够定义精度值p,这么些精度值定义用来表示秒的小数位的个数,默许的场馆下,未有精度限定。对于timestampinterval``,``p``的取值范围是``0``到``6``(实际的精度可能小于``6``)。对于time``,``p``的取值范围是``0``到``10``。

 

    类型time with time zone是SQL规范定义的,这几个项目有个别多余。在大好多情状下,datetimetimestamp without time zonetimestamp with time zone 的组成就能够满意任何利用供给。

    类型 abstimereltime 是低分辨率时间等级次序,它们是数据库内部选取的档案的次序,在应用程序里面不应有运用那八个类型。

6.5.1 日期/时间输入

     日期和岁月足以用各个格式来表示,富含 ISO 8601、SQL标准中定义的格式等。对于一些格式,日期输入里的月和天的意味或然会有歧义,如若参数DateStyle 棉被服装置为 MDY,数据库将按“月-日-年”的格式来申明输入的数额,DMY 表示“日-月-年”,而 YMD表示“年-月-日”。

 

    PostgreSQL在拍卖日期/时间输入上比SQL规范要灵活得多。像一个文本字符串同样,任何日期或时间的输入都必需用单引号括起来。SQL标准定义的语法如下:

type [ (p) ] 'value'

    对于timetimestampinterval品类的数码足以指定精度p,p的取值范围上焕发青新春已经讲过。如果未有定义p,暗中同意是输入的小时常量的精度。 表6-9、6-10和6-11列出了日期/时间数额在输入和出口时接受的主要字。

表6-9. 表示月的重大字

缩写

January

Jan

February

Feb

March

Mar

April

Apr

May

 

June

Jun

July

Jul

August

Aug

September

Sep, Sept

October

Oct

November

Nov

December

Dec

表6-10. 代表天的根本字

缩写

Sunday

Sun

Monday

Mon

Tuesday

Tue, Tues

Wednesday

Wed, Weds

Thursday

Thu, Thur, Thurs

Friday

Fri

Saturday

Sat

 

表6-11. 日子/时间域修饰符

标识符

   描述

ABSTIME

忽略

AM

12:00早前的时间

AT

忽略

JULIAN, JD, J

下叁个域用儒略日表示(Julian Day)

ON

忽略

PM

12:00随后的时光

T

下叁个域是时间

 

6.5.1.1 日期

   表6-12 显示了date 类型也许的输入格式。

表6-12. 日期格式

例子

描述

January 8, 1999

无论参数datestyle取任何值,都还未歧义

1999-01-08

ISO-8601 格式,任何情势下都以1998年十一月8号(推荐使用该格式)

1/8/1999

有歧义,在MDY下是1月8日;在 DMY 形式下是做六月1日

1/18/1999

MDY方式下是10月14日,其余形式下被谢绝

01/02/03

MDY 方式下的2002年青女月2日; DMY 形式下的 二〇〇四 年 10月 1日; YMD 方式下的二零零零年一月27日

1999-Jan-08

别的形式下都以十六月8日

Jan-08-1999

任何情势下都以四月8日

08-Jan-1999

其它形式下都以十十月8日

99-Jan-08

YMD 方式下是三月8日,别的形式报错

08-Jan-99

1月8日,YMD 形式下会报错

Jan-08-99

1月8日,YMD 形式下会报错

19990108

ISO-8601; 任何形式下都以1997年八月8日

990108

ISO-8601; 任何方式下都是1997年3月8日

1999.008

年和年里的第几天

J2451187

儒略日

January 8, 99 BC

公元前99年

6.5.1.2 时间

      时间档期的顺序包括 time [ (p) ] without time zonetime [ (p) ] with time zone。 只写 time 等同于 time without time zone。对于项目time [ (p) ] with time zone``,需要同时指定时间和日期。如果在 time without time zone 类型的输入中钦赐了时区,时区会被忽视。

表6-13. 时间输入

例子

描述

04:05:06.789

ISO 8601

04:05:06

ISO 8601

04:05

ISO 8601

040506

ISO 8601

04:05 AM

与 04:05 相像;AM 不影响数值

04:05 PM

与 16:05等同;输入小时数必得 <= 12

04:05:06.789-8

ISO 8601

04:05:06-08:00

ISO 8601

04:05-08:00

ISO 8601

040506-08

ISO 8601

04:05:06 PST

带缩写的时区

2003-04-12 04:05:06 America/New_York

带全称的时区

表6-14. 时区输入

例子

描述

PST

印度洋行业内部时间(Pacific Standard Time)

America/New_York

时区全称

PST8PDT

POSIX风格的时区名称

-8:00

ISO-8601 与 PST 的偏移

-800

ISO-8601 与 PST 的偏移

-8

ISO-8601 与 PST 的偏移

Zulu

军方对 UTC 的缩写(译注:或者是美军)

Z

zulu 的缩写

视图``pg_timezone_names``列出了所有可以识别的时区名``。

6.5.1.3 时间戳(timestamp)

       时间戳类型的输入由三个日期和时间的对接组成,后边随着三个可选的时区,三个可选的 AD 或者 BCAD/BC 能够出今后时区前面,但最棒放在时区的后面)。上边是三个实例,它们宽容ISO 8601:

(1)1999-01-08 04:05:06

(2)1999-01-08 04:05:06 -8:00

 

还足以接受上面包车型地铁格式

January 8 04:05:06 1999 PST

   

SQL标准通过翻看符号"+" 或 "-" 是或不是存在来区分常量的品种是 timestamp without time zone还是timestamp with time zone。 例如,TIMESTAMP '2004-10-19 10:23:54'的类型timestamp without time zone``,TIMESTAMP '二〇〇二-10-1906:23:54+02'的体系是timestamp with time zone``。PostgreSQL不使用这些准绳,由早前边的三个例证的例子都会被认为timestamp without time zone。在PostgreSQL中,timestamp without time zone``类型的常量前面必须加上TIMESTAMP WITH TIME ZONE, 例如,TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02'。

`timestamp without time zone``类型的常量中只要有的时候区消息,时区消息会被系统自动忽视。```

timestamp with time zone花色的数量的里边存款和储蓄的格式总是UTC(全球联结时间,早先也叫Green威治时间欧霉素T)。假若多个输入值中钦定了时区,系统将以该时区为依照将它转变为UTC格式,假如在输入的值中尚无点声望明,系统以参数timezone的值作为指准时区为基于,将它调换为UTC格式。

 

假使要出口贰个 timestamp with time zone``类型的数据,它总是从 UTC被转到参数timezone钦赐的时区,并被突显为该时区的本地时间。 要看其余时区的该时间,要么改善 参数参数timezone``的值,要么使用 AT TIME ZONE 子句(参考第7.9.3节)。

 

       在 timestamp without time zonetimestamp with time zone 之间的进展改换是经常假如 timestamp without time zone 数值的时区是参数timezone 钦赐的时区。可以用AT TIME ZONE 钦命别的的时区。

6.5.1.4 时间距离

`` ``interval``类型的数值能够用上面语法来定义:

[@] quantity unit [quantity unit...] [direction]

这里quantity 是叁个数字(大概有号子),unitmicrosecondmillisecond``、``secondminute,、hourdayweekmonthyeardecadecenturymillennium依然这么些单位的缩写或复数,direction 可以是 ago 也许为空。符号 “@``” 是可选的,能够不写。

 

    天、小时、分钟以致秒的数值的后面能够不用醒目地跟单位。 比方,“``1 12:59:10``”“``1 day 12 hours 59 min 10 sec``”是等价的。

    可选精度 p 的取值在0到6 之间,默许是输入的常量的精度。

 

6.5.1.5 特殊值

        PostgreSQL 为便于起见支持多少个非常输入值,全部这一个值在SQL命令里作为常量使用时,要用单引号引起来。now、today、tomorrow和yesterday``在被读取时会被自动转换为普通的日期或时间值。

表 6-15. 特有日期/时间输入

输入的字符串

平价的数据类型

描述

Epoch

date, timestamp

1966-01-01 00:00:00+00 (Unix 系统零时卡塔尔(قطر‎

infinity

timestamp

比其它别的时间戳都晚

-infinity

timestamp

比其余别的时间戳都早

Now

date, time, timestamp

日前事情早先的年华

Today

date, timestamp

前几天子夜

tomorrow

date, timestamp

今天子夜

yesterday

date, timestamp

昨君王夜

allballs

time

00:00:00.00 UTC

   

下列与SQL规范卓越的函数也得以用来获取相应数据类型的眼下值: CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPLOCALTIMELOCALTIMESTAMP。最终多个函数接收叁个可选的秒的精度值(在第7.9.4节里对那个函数有详细描述)。

6.5.2 日期/时间输出

        时间/日期类型的出口格式有三种:ISO 8601、SQL(Ingres)、守旧的POSTGRES和德文。能够运用命令SET datestyle``来设置岁月/日期类型的出口格式,``私下认可是 ISO 格式(SQL 标准供给利用 ISO 8601 格式)。表 6-16 列出了了各样输出格式的实例。

表 6-16. 日期/时间输出格式

类型

描述

例子

ISO

ISO-8601/SQL 标准

1997-12-17 07:37:16-08

SQL

观念风格

12/17/1997 07:37:16.00 PST

POSTGRES

本来风格

Wed Dec 17 07:37:16 1997 PST

German

地域风格

17.12.1997 07:37:16.00 PST

    借使参数datestyle里有DMY 消息,在SQL和POSTGRES风格里,日期在月份事情未发生前现身,不然月份面世在日期以前。表6-17 是此外一些实例。

表 6-17. 日期顺序

类型

描述

例子

SQL, DMY

//`年```

17/12/1997 15:37:16.00 CET

SQL, MDY

//`年```

12/17/1997 07:37:16.00 PST

Postgres, DMY

//`年```

Wed 17 Dec 07:37:16 1997 PST

`   ```

``interval 的出口格式和输入格式相仿,centuryweek 被转移成年和日,而 ago 被调换来合适的标识。在 ISO 格局下输出格式如下:

[ quantity unit [ ... ] ] [ days ] [ hours:minutes:secondes ]

 

    能够用命令SET datestyle来安装日期/时间的输出格式,也能够在文书postgresql.conf 里校勘参数DateStyle 的值。也得以用函数to_char(参阅第7.8节)越来越灵活地调节输出格式。

6.5.3时区

     PostgreSQL 近年来帮忙 1901 年到 2038 年里面包车型大巴夏时制时间(对应于古板Unix 系统时间的象征的范围)。若是时光超越那一个节制,那么只要时间是筛选的时区的"标定期间"。SQL 典型在日期和岁月档期的顺序和效果与利益上有一点点零乱,上边是多个广大的主题素材:

(1)``date (日期)类型与时区未有关系,而 time (时间)类型却有或能够与时区关联。但是现实世界的时区必得与与时间和日期同有时候提到才有含义。

(2)私下认可的时区用同UTC的摇曳来表示。由此,当在 DST 的境界进行日期/时间运算时,不能够将时刻转换来夏时制时间。

 

    为了消除那些主题材料,提出在运用时区的时候,使用那个同一时间包蕴日期和岁月的日子/时间档案的次序。提议不要使用场目 time with time zone (保留此类型是为着同SQL标准分外)。

    PostgresSQL有二种办法来指准期区名:

(1)使用时区的康健,举个例子`America/New_York,视图pg_timezone_names``列出了全部能够识其他时区名。```

(2)使用时区的缩写,比方`PST,视图pg_timezone_names``列出了有着能够识别的时区缩写。```

`(3POSXI风格的时区表示法,举例PST8PDT。```

在事实上的运用中,最佳使用全称的时区名。参数``timezone``和``log_timezone``的值不能使用缩写的时区表示方式,运算符``AT TIME ZONE``可以使用缩写的时区表示方式。时区名称不区分抑扬顿挫写,全数的时区音讯寄放在数据库软件的装置目录的子目录.../share/timezone/ 和`.../share/timezonesets/``里面。```

    可以在 文件postgresql.conf 里设置配置参数 timezone,还是能用上面的情势来安装时区:

若是文件postgresql.conf 里没有设置timezone,服务器试图动用服务器主机上的操作系统意况变量TZ的值作为服务器的暗许时区。 若无定义TZ,也许TZ的值是 PostgreSQL 不能够识其余时区, 那么服务器将通过检查C 库函数 localtime() 的表现规定来操作系统的暗中同意时区(若是postgresql.conf 里未有安装参数log_timezone``,这几个法则也用来分明参数log_timezone的值)。

SQL 命令 SET TIME ZONE 为会话设置时区,它相当于与命令SET TIMEZONE TO。

 

6.5.4 内部贯彻

    PostgreSQL 使用儒略历法(Julian dates)来进展具备的日期/时间测算。 这种措施就算一年的长短是365.2425天,它可以很规范地质度量算从4713 BC(公元前4713年)到相当的远的的前程的妄动一天的日期。

6.6 布尔类型

    PostgreSQL 援救SQL标准中定义的 boolean 数据类型。boolean``类型只可以有多少个取值:真(True卡塔尔国或假(False卡塔尔。空值表示处境未知(unknown)。能够选拔下列常量来代表”真”,它们是等价的,推荐使用TRUE:

TRUE

't'

'true'

'y'

'yes'

'1'

接收下列常量来表示假,它们是等价的,推荐应用FALSE:

FALSE

'f'

'false'

'n'

'no'

'0'

 

    上边是采用布尔类型的实例:

CREATE TABLE test1 (a boolean, b text);

INSERT INTO test1 VALUES (TRUE, 'sic est');

INSERT INTO test1 VALUES (FALSE, 'non est');

SELECT * FROM test1;

 a |    b

---+---------

 t | sic est

 f | non est

 

SELECT * FROM test1 WHERE a;

 a |    b

---+---------

 t | sic est

 

`   ``布尔品种在存款和储蓄时占用二个字节的半空中。```

6.7 枚举类型

   PostgtesSQL中的枚举类型相似于C语言中的enum类型。

6.7.1 成立枚举类型

   能够用命令CREATE TYPE 来创设枚举类型,举个例子:

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');

 

   枚举类型被创设以往,能够在建表的时候利用它,比方:

 

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');

CREATE TABLE person (

    name text,

    current_mood mood

);

INSERT INTO person VALUES ('Moe', 'happy');

SELECT * FROM person WHERE current_mood = 'happy';

 name | current_mood

------+--------------

 Moe  | happy

(1 row)

6.7.2 枚举类型的排序

      枚举类型的值的次第便是在开立项目时内定的值列表中各类值现身的相继。能够对枚举类型举行相比操作,也足以运用集函数,比方:

 

INSERT INTO person VALUES ('Larry', 'sad');

INSERT INTO person VALUES ('Curly', 'ok');

SELECT * FROM person WHERE current_mood > 'sad';

 name  | current_mood

-------+--------------

 Moe   | happy

 Curly | ok

(2 rows)

 

SELECT * FROM person WHERE current_mood > 'sad' ORDER BY current_mood;

 name  | current_mood

-------+--------------

 Curly | ok

 Moe   | happy

(2 rows)

 

SELECT name FROM person

  WHERE current_mood = (SELECT MIN(current_mood) FROM person);

 name 


 Larry

(1 row)

 

6.7.3 类型安全

      无法对多少个例外的枚举类型的值举办比较操作,不然系统会报错,譬如:

 

CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic');

CREATE TABLE holidays (                                          

    num_weeks int,

    happiness happiness

);

INSERT INTO holidays(num_weeks,happiness) VALUES (4, 'happy');

INSERT INTO holidays(num_weeks,happiness) VALUES (6, 'very happy');

INSERT INTO holidays(num_weeks,happiness) VALUES (8, 'ecstatic');

INSERT INTO holidays(num_weeks,happiness) VALUES (2, 'sad');

错误:  enum类型happiness常量语法错误: "sad"。

SELECT person.name, holidays.num_weeks FROM person, holidays

  WHERE person.current_mood = holidays.happiness;

谬误:  运算符不设有: mood = happiness。  -- mood和happiness是莫衷一是的枚举类型

 

   能够将三个例外的枚举类型的值调换到其余项目标数目,然后再扩充相比较,举例:

SELECT person.name, holidays.num_weeks FROM person, holidays

  WHERE person.current_mood::text = holidays.happiness::text;

 name | num_weeks

------+-----------

 Moe  |         4

(1 row)

 

6.7.4 完成细节

    枚举类型的值的文件标签是分别抑扬顿挫写的,比如,'happy' 和`'HAPPY'是不同的。另外,值的文本标签的长度不能超过63``个字符。```

 

6.8 几何类型

    几何数据类型表示二维空间的对象。表6-18 展现了PostgreSQL 里面有着的几何类型。最主旨的项目是“点”,它是任何数据类型的根基。

表 6-18. 几何类型

名字

仓库储存空间

描述

表现情势

point

16 字节

空间中或多或少

(x,y)

line

32 字节

(Infiniti长的卡塔尔国直线(未完全达成)

((x1,y1),(x2,y2))

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 字节

圆(圆心和半径卡塔尔(英语:State of Qatar)

<(x,y卡塔尔(قطر‎,r>(圆心与半径)

    对于那一个几何类型,PostgreSQL提供了无数运算符和函数。它们在第7.11节里有表明。

6.8.1点(point)

      点是最主旨的几何类型。上面语法定义point``类型的值:

( x , y )

  x , y

x和y都以浮点数,表示横坐标和纵坐标。

6.8.2 线段(lseg)

    线段 (lseg)用八个点来表示。 lseg 的值用下边语法定义:

( ( x1 , y1 ) , ( x2 , y2 ) )

  ( x1 , y1 ) , ( x2 , y2

    x1 , y1   ,   x2 , y2

这里的 (x1,y1)(x2,y2) 是线段的端点。

6.8.3 长方形(box)

    圆柱形是用多少个对角个点来表示的。 它的值用上面包车型大巴语法定义:

(1)( ( x1 , y1 ) , ( x2 , y2 ) )

(2)( x1 , y1 ) , ( x2 , y2

(3) x1 , y1   ,   x2 , y2

(x1,y1)(x2,y2) 是星型的后生可畏对对角点。

 

星型的多少在出口使用第意气风发种语法。

6.8.4路径(path)

    路线由后生可畏多级一连的点构成。路线大概是挖潜的,列表中首先个点和最后贰个点并未有连接,也恐怕是闭路的,第八个和末段三个点连接起来。

path 的值用上边语法定义:

(1)( ( x1 , y1 ) , ... , ( xn , yn ) )

(2)[ ( x1 , y1 ) , ... , ( xn , yn ) ]

(3)( x1 , y1 ) , ... , ( xn , yn

(4) ( x1 , y1   , ... ,   xn , yn

(5) x1 , y1   , ... ,   xn , yn   

    这里的点是整合路线的线条的端点。 方括弧[]标记路线是挖潜的,圆括弧()注解路线是闭路的。

    路线的多少在出口时行使第意气风发种语法。

6.8.5多边形(polygon)

     多边形由生机勃勃多种点代表(多边形的终极)。多边形在概念上与闭路路线同样,可是它与闭路路线的存储情势不平等同一时候有谈得来的生龙活虎套帮衬函数。

polygon 的值用下列语法定义:

(1)( ( x1 , y1 ) , ... , ( xn , yn ) )

(2)( x1 , y1 ) , ... , ( xn , yn

(3) ( x1 , y1   , ... ,   xn , yn

(4)  x1 , y1   , ... ,   xn , yn   

此地的点是构成多边形边界的线条的端点。

    多边形数据在出口使用第生龙活虎种语法。

6.8.6圆(circle)

    圆由一个圆心和三个半径表示。 circle 的值用上边语法定义:

(1)< ( x , y ) , r >

(2)( ( x , y ) , r )

(3) ( x , y ) , r 

(4) x , y   , r 

这里的 (x,y) 是圆心,而r圆的半径。

    圆的多寡在出口时利用第大器晚成种格式。

 

6.9 网络地址类型

    PostgreSQL 提供了用来存款和储蓄IPv4、IPv6和MAC地址的数据类型,如表6-19所示。 使用这个数据类型存款和储蓄网络地址比用纯文本类型要好,因为这一个连串提供输入错误检查和局地特许的运算符和函数来管理互联网地址(参考第7.12节)。

表 6-19. 网络地址类型

名字

积存空间

描述

cidr

7 或 19 字节

IPv4 和 IPv6 网络

inet

7 或 19 字节

IPv4 或 IPv6 网络和主机

macaddr

6 字节

MAC 地址

    

在对inet 或者cidr 类型的数量开展排序的时候,IPv4 地方总是排在 IPv6 地方前面,包罗那贰个封装在IPv6地址里面或映射成 IPv6 地址的 IPv4 地址,举例::10.2.3.4 要么::ffff::10.4.3.2。

6.9.1 `inet```

``inet项目保存三个主机 IPv4 或IPv6 地址,也得以並且保留该主机所在的子网新闻。子网是因而掩码来代表的。假诺互连网掩码是32而且地址是IPv4,那么它不表示其他子网,只是代表生机勃勃台主机。在 IPv6 里,地址长度是 128 位,由此 1二十几个人掩码表示二个唯豆蔻梢头的主机地址。注意假设只想保留网络地址,应该利用 cidr 而不是 inet

   

该品种的输入格式是“地址``/y ”,这里的地址是 IPv4 或者 IPv6 ,y 是子网掩码的位数的位数 若是轻巧“/y”, 则子网掩码对 Ipv4 是 32,对 IPv6 是 128,所以该值表示唯有后生可畏台主机。数据在突显时,如果y等于32,”/32”不会被出示出来。

6.9.2 `cidr```

`` `` cidr封存叁个IPv4 或 IPv6 类型的网络地址。其输入和出口格式坚守无类域间路由(Classless Internet Domain Routing)标准。它的格式是“地址``/y``”,这里 的地址 是 IPv4 或 IPv6 网络地址,y是 互连网掩码的二进制位数。即使轻巧/y, 那么掩码的深浅用古板的IP地址分类系列总计出来(IP地址分为四类,分别是A、B、C和D)。若是网络地址中对应非互联网掩码的二进制位中出现了“1”,则不是二个合法的cidr类型的多少,比方,192.168.1.0/16就不是二个法定的cidr地址。

    

表6-20是CIDR实例:

表6-20. cidr 类型输入实例

cidr输入

cidr显示

函数abbrev(cidr)的输出

192.168.100.128/25

192.168.100.128/25

192.168.100.128/25

192.168/24

192.168.0.0/24

192.168.0/24

192.168/25

192.168.0.0/25

192.168.0.0/25

192.168.1

192.168.1.0/24

192.168.1/24

192.168

192.168.0.0/24

192.168.0/24

128.1

128.1.0.0/16

128.1/16

128

128.0.0.0/16

128.0/16

128.1.2

128.1.2.0/24

128.1.2/24

10.1.2

10.1.2.0/24

10.1.2/24

10.1

10.1.0.0/16

10.1/16

10

10.0.0.0/8

10/8

10.1.2.3/32

10.1.2.3/32

10.1.2.3/32

2001:4f8:3:ba::/64

2001:4f8:3:ba::/64

2001:4f8:3:ba::/64

2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128

2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128

2001:4f8:3:ba:2e0:81ff:fe22:d1f1

::ffff:1.2.3.0/120

::ffff:1.2.3.0/120

::ffff:1.2.3/120

::ffff:1.2.3.0/128

::ffff:1.2.3.0/128

::ffff:1.2.3.0/128

6.9.3 inetcidr 对比

``   inetcidr 类型之间的本质差距在于inet 地址中对应非互连网掩码的二进制位中得以出现“1”,cidr 则不选择这种样式的地点。

    提示: 不喜欢inetcidr值的出口格式,能够选取函数hosttextabbrev

6.9.4 `macaddr```

`` macaddr 类型存款和储蓄 MAC 地址,举例,以太网网卡的硬件地址(MAC 地址还用于别的用项)。MAC地址有上边三种格式,它们都钦定的是同三个地点:

'08002b:010203'

'08002b-010203'

'0800.2b01.0203'

'08-00-2b-01-02-03'

'08:00:2b:01:02:03'

 

     对于a 到 f,大小写都得以。输出总是接收地方列出的尾声意气风发种样式。

 

6.10位串类型

        位串是由 1和0的构成的串。有两种位串类型 bit(n)bit varying(n)n是四个正整数。

bit(n)种类的数目必得可信地包容长度n,不然系统会报错。bit varying``类型可以接受变长位串,但位串的长度也无法抢先n。bit 等同于 bit(1),没有一点名长度的bit varying 类型的尺寸将从未限定。

 

       注意: 假如分明地把三个位串值转变来 bit(n)``类型,那么它的入手将被截断或许在侧边补齐零,直到恰巧构成n 位位串,系统不会报错。近似地,假设鲜明地把三个位串数值调换来 bit varying(n),假使它的长度超过了n 位,那么它的超过n的有些将被电动截掉。

    

位串常量的语法的音讯详见第1.4.3节。用于位串的运算符和函数,在第7.6节里有详细描述。

        上面是使用位串的实例:

CREATE TABLE test (a BIT(3), b BIT VARYING(5));

INSERT INTO test VALUES (B'101', B'00');

INSERT INTO test VALUES (B'10', B'101');

不当: 位串长度2与类型bit(3卡塔尔(قطر‎不相称。

INSERT INTO test VALUES (B'10'::bit(3), B'101');

SELECT * FROM test;

  a  |  b

-----+-----

 101 | 00

 100 | 101

 

6.11 UUID 类型

       uuid类型用于存款和储蓄TucsonFC 4122和ISO/IEC 9834-8:二零零五中定义的通用唯风华正茂标记符(stores Universally Unique Identifiers,UUID),有点数据库中把那一个类别名为GUID(globally unique identifier)。UUID由一个1二十几人的数字构成,它的正统的输入格式由叁16个小写的十八进制位组成,那三20个十二进制位被分为4个组,第二个组有隐含8个十八进制位,接下去的三个组个饱含4个十五进制位,最后七个组包括12个十五进制位。差别的组横杠分开(-卡塔尔(英语:State of Qatar),比如:a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11。

 

        PostgreSQL还接受上面三种格式,在那之中的十五进制位能够是大写的:

(1)A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11

(2){a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}

(3)a0eebc999c0b4ef8bb6d6bb9bd380a11

 

        uuid类型的数量在出口时总是利用方面包车型客车率先种格式。PostgreSQL只是背负存款和储蓄uuid类型的数码,同有的时候间提供了UUID类型的比较函数,但不提供别的发生UUID的函数(因为尚未任何二个算法是契合全数的使用类型的),应用程序必需和睦付出生成uuid的函数。

 

6.12 XML 类型

数据库能够用xml类型来存款和储蓄xml数据,也能够用text类型来存款和储蓄xml文书档案,不过text类型未有提供函数来拍卖xml数据,使用起来未有xml类型方便。第7.13节列出了管理XML数据的函数。

xml类型可以存款和储蓄xml文书档案(document),也足以储存由XMLDecl? content定义的xml内容片段(content卡塔尔(قطر‎。xml内容片段能够有三个一流成分。能够用表明式xmlvalue IS DOCUMENT来判别多个xml值是xml文书档案依旧xml内容片段。

6.12.1 创建xml值

     使用函数XMLPA福睿斯SE从字符串中生成xml数据,它的语法如下:

XMLPARSE ( { DOCUMENT | CONTENT } value)

 

     上边是一些实例:

(1)XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>')

(2)XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')

 

      XMLPA奔驰M级SE是SQL标准中定义的函数,PostgreSQL同一时候提供了上面包车型大巴主意来创制xml值:

xml '<foo>bar</foo>'

'<foo>bar</foo>'::xml

 

xml类型不会注脚它的值中是或不是带有文书档案类型表明(Document Type Declaration,DTD)。

 

      函数xmlserialize能够将xml值转还成字符串,它的语法如下:

XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type )

内部的项目(type)能够是character、 character varying或text(也许这么些品种的别称)。

 

       使用函数XMLPA瑞虎SE 和XMLSEKoleosIALIZE的时候,xml值的门类由参数“xml option”来调节,能够采纳SET命令来改换那个参数的值,它的语法如下(使用别的一个都得以):

(1)SET XML OPTION { DOCUMENT | CONTENT };

(2)SET xmloption TO { DOCUMENT | CONTENT };

xml option的默许值是CONTENT,任何款式的XML数据对于CONTENT来讲都以合法的。

 

 

6.12.2 编码管理

    顾客端编码、服务器编码和xml数据的编码类型恐怕不风度翩翩致。要是接收文本格局在客商端和服务器之间传送数据,数据库会活动对字符数据开展编码类型转换(详细音讯请参照他事他说加以考察《数据库管理员手册》第5章)。服务器在拍卖顾客端发送过来的的xml数据时,数据中编码类型的扬言(encoding declaration)将被忽略。服务器在将xml数据发给顾客端时,个中也不会饱含编码类型表明。

    如若接收二进制方式在客商端和服务器之间传送数据,数据库不会对传送的数额开展编码类型调换。服务器在管理顾客端发送过来的的xml数据时,会保留xml数据中的编码类型注明,借使xml数据还未定义编码类型,则以为它的编码类型是UTF-8。服务器在将xml数据发给顾客端时,此中会蕴藏xml数据的编码类型表明。

    要是xml数据的编码类型、顾客端的编码类型和服务器的编码类型相近,则在拍卖xml数据时不便于现身错误,推荐应用途目UTF-8作为xml数据的编码类型、客商端的编码类型和服务器的编码类型。

6.12.3 访问XML类型的数目

不能够在xml类型的列上创设索引,怎么着在询问中做客xml类型的多寡,在第7.13节里有详细汇报。

 

 

6.13 数组

    PostgreSQL 允许表的列的数据类型是变长的多维数组。数组的品类能够是别的基本类型、枚举类型、复合类型或客户自定义类型(可是无法是域)。

6.13.1 数组类型的扬言

      下边通过贰个实例来注脚什么使用数组,首先建表:

CREATE TABLE sal_emp (

    name            text,

    pay_by_quarter  integer[],

    schedule        text[][]

);

 

       从地方的事例能够看见,三个数组类型是经过在数组成分类型名前边加上方括号([])来定义的。上面包车型客车下令创设了三个叫 sal_emp 的表,列name的门类是text,列pay_by_quarter的花色是二个二维整型数组,列schedule的档期的顺序是二个text类型的二维数组。 

 

       也足以在建表时一览通晓地钦点数组的轻重,举个例子:

CREATE TABLE tictactoe (

    squares   integer[3]

);

 

       在现阶段的贯彻中,系统不会检讨数组七月素的个数是或不是超过它的分寸,所以integer[3]和integer[]是等价的。 此外,系统也不会检讨数组的成分是还是不是复合数组的维数要求,所以在概念数组时,多维数组是没风趣的,它相通定义五个生龙活虎维数组,比方,intger[]、integer[][]和intger[4]都相互是等价的。对以意气风发维数组,它的要素得以是一个精简的常量,也足以是三个数组,比如,3和{1,2} 都是数组intger[]的合法成分。

 

6.13.2 数组值输入

   贰个数组常量的习感到常格式如下:

‘{ val1 delim val2 delim ... }’

这里的 delim 是该类型的分隔符(在品种对应的pg_type 记录里钦命)对于PostgreSQL 提供的正统数据类型里,除了box 类型的相间符是分号(;)外,全数别的品类的相间符都以逗号(,)。每种 val 可以是三个数组成分类型的常量,也足以是一个子数组。举个例子

'{{1,2,3},{4,5,6},{7,8,9}}'

 

 

    如若数组成分为空值,用null或NULL来表示。

 

    上边是此外一些实例:

 

INSERT INTO sal_emp

    VALUES ('Bill',

    '{10000, 10000, 10000, 10000}',

    '{{"meeting", "lunch"}, {"training", "presentation"}}');

 

INSERT INTO sal_emp

    VALUES ('Carol',

    '{20000, 25000, 25000, 25000}',

    '{{"breakfast", "consulting"}, {"meeting", "lunch"}}');

 

INSERT INTO sal_emp

    VALUES ('Carol',

    '{20000, 25000, 25000, 25000}',

    '{{"breakfast", "consulting"}, {"meeting", null}}');

 

INSERT INTO sal_emp

    VALUES ('Carol',

    '{20000, 25000, 25000, 25000}',

    '{null, null}');

 

    查询表sal_emp能够获取下边的结果:

 

SELECT * FROM sal_emp;

 name  |      pay_by_quarter       |                 schedule

-------+---------------------------+-------------------------------------------

 Bill  | {10000,10000,10000,10000} | {{meeting,lunch},{training,presentation}}

 Carol | {20000,25000,25000,25000} | {{breakfast,consulting},{meeting,lunch}}

 Mike  | {20000,25000,25000,25000} | {{breakfast,consulting},{meeting,NULL}}

 Alex  | {20000,25000,25000,25000} | {NULL,NULL}

(4 rows)

 

 

    也足以使用数修筑造器的语法:

 

INSERT INTO sal_emp

    VALUES ('Bill',

    ARRAY[10000, 10000, 10000, 10000],

    ARRAY[['meeting', 'lunch'], ['training', 'presentation']]);

 

INSERT INTO sal_emp

    VALUES ('Carol',

    ARRAY[20000, 25000, 25000, 25000],

    ARRAY[['breakfast', 'consulting'], ['meeting', 'lunch']]);

 

    注意,假诺数组的要素也是数组,那么这么些数组的各种成分的维数和各类维的朗朗上口必须风流倜傥致,不然系统会报错,比如:

(1)INSERT INTO sal_emp

    VALUES ('Bill',

    '{10000, 10000, 10000, 10000}',

    '{{"meeting", "lunch"}, {"meeting"}}');

错误:  多维数组的各个成分的维数和每一种维的轻重必得风姿洒脱律。

说明:{"meeting", "lunch"}含有2个元素,{"meeting”}只有1个元素。

 

 

    对于多维数组,要么它的具备因素都不是空值,要么它的保有因素都是空值。假如有一点成分为空值,别的一些因素不是空值,系统将会报错,比如:

(1)INSERT INTO sal_emp

    VALUES ('Bill',

    '{10000, 10000, 10000, 10000}',

    '{{"meeting", "lunch"}, null}');

不当:  数组常量语法不科学: "{{"meeting", "lunch"}, null}"。

证实:{"meeting", "lunch"}不是空值,但别的二个成分是空值。如果把{"meeting", "lunch"}也改成null,则是叁个法定的数组输入。

6.13.3 访谈数组

      首先,演示一下如何访谈数组的有些一个元素。上边包车型大巴询问找寻第二季度的薪饷和第大器晚成季度的薪金差别的职工:

SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];

 

 name


 Carol

(1 row)

 

      数组的下标是写在方括号的。暗许的气象下,PostgreSQL以为数组都是风流倜傥维的。

      下边包车型大巴询问搜索具有工作者的第三季度的薪酬:

SELECT pay_by_quarter[3] FROM sal_emp;

 

 pay_by_quarter


          10000

          25000

(2 rows)

 

        还可以访谈二个数组的妄动圆锥形片断,恐怕叫分片。对于生机勃勃维或多维数组,叁个数组的某意气风发局部是用“下标下界:下标上界“表示的。举个例子:

SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';

 

        schedule


 {{meeting},{training}}

 (1 row)

上边的查询还足以写成下边包车型大巴款式:

SELECT schedule[1:2][1] FROM sal_emp WHERE name = 'Bill';

  

若果轻松了下标下界,则下标下界默以为1,所以schedule[1:2][1]等价于schedule[1:2][1:1],schedule[1:2][2]等价于schedule[1:2][1:2]。例如:

SELECT schedule[1:2][2] FROM sal_emp WHERE name = 'Bill';

 

                 schedule


 {{meeting,lunch},{training,presentation}}

 

(1 row)

  

假如查询内定的分片的下标的下界超过了数组的下标的上界,系统不会报错,将会回去三个空数组,举个例子:

SELECT schedule[3:5][1:2] FROM sal_emp WHERE name = 'Bill';

schedule


 {}

(1 row)

  

  若是查询钦定的分片的下标的下界未有当先数组的下标的上界,但子数组的下标的上界超出了超过数组的下标的上界,系统也不会报错,会自行将子数组的下标的上界设为数组的下标的上界,比方:

SELECT schedule[1:5][2] FROM sal_emp WHERE name = 'Bill';

 

                 schedule


 {{meeting,lunch},{training,presentation}}

 

(1 row)

   

可以用array_dims 函数来得到任何数组的当前维数音信和和各类维对应的下标的上界与下界,比方:

SELECT array_dims(schedule) FROM sal_emp WHERE name = 'Carol';

 

 array_dims


 [1:2][1:2]

(1 row)

   

也足以用 函数array_upper 和 array_lower 获得数组钦点的维数下标的上界和下界。

SELECT array_upper(schedule, 1) FROM sal_emp WHERE name = 'Carol';

 

 array_upper


           2

(1 row)

6.13.4 改善数组

6.13.4.1 使用UPDATE命令

      能够三次立异数组的的持有因素,比如:

UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'

WHERE name = 'Carol';

 

照旧使用数建筑造器,举个例子:

UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]

WHERE name = 'Carol';

 

       也得以只更新数组的某二个成分:

UPDATE sal_emp SET pay_by_quarter[4] = 15000

WHERE name = 'Bill';

 

或然更新数组的有些分片,举个例子:

UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'

    WHERE name = 'Carol';

  

 假若二个数组独有n个成分,使用UPDATE命令给数组的第n+m个要素赋值,那么数组将会化为叁个有n+m个成分的数组,此中的第n到第n+m-1个因素会被电动赋为空值。当前只能对豆蔻梢头维数组开展那样的操作。

   

在立异七个数组片段时,钦点数组的下标可认为负数,更新操作结束后,数组的下标将以负数最初,实际不是从1开端,例如,顺序实行上面包车型客车多少个指令,注意观望输出的结果:

(1)select * from sal_emp;

 name  |      pay_by_quarter       |                 schedule

-------+---------------------------+-------------------------------------------

 Bill  | {10000,10000,10000,10000} | {{meeting,lunch},{training,presentation}}

 Carol | {20000,25000,25000,25000} | {{breakfast,consulting},{meeting,lunch}}

(2 rows)

 

(2)select array_dims(pay_by_quarter)  from sal_emp;

 array_dims


 [1:4]

 [1:4]

(2 rows)

 

(3)UPDATE sal_emp SET pay_by_quarter[-1:2] = '{3,3,27000,27000}';

 

(4)select array_dims(pay_by_quarter)  from sal_emp;

 array_dims


 [-1:4]

 [-1:4]

(2 rows)

(5)select * from sal_emp;

 name  |            pay_by_quarter            |                 schedule

-------+--------------------------------------+-------------------------------------------

 Bill  | [-1:4]={3,3,27000,27000,10000,10000} | {{meeting,lunch},{training,presentation}}

 Carol | [-1:4]={3,3,27000,27000,25000,25000} | {{breakfast,consulting},{meeting,lunch}}

(2 rows)

 

6.13.4.2 数组连接运算符

     能够用运算符 || 连接四个数组产生叁个新的数组,举例:

(1)SELECT ARRAY[1,2] || ARRAY[3,4];

 ?column?


 {1,2,3,4}

(1 row)

 

(2)ELECT ARRAY[5,6] || ARRAY[[1,2],[3,4]];

      ?column?


 {{5,6},{1,2},{3,4}}

(1 row)

 

       连接运算符能够三番两次贰个成分和叁个少年老成维数组,连接多少个 N 维的数组,连接三个N维数组和叁个N+1 维的数组。

尽管连接四个要素和一个生机勃勃维数组,结果数组的下标下界与在场运算的生龙活虎维数组的下标下界相仿,举个例子:

(1)SELECT array_dims(1 || '[0:1]={2,3}'::int[]);

 array_dims


 [0:2]

(1 row)

 

(2)SELECT array_dims(ARRAY[1,2] || 3);

 array_dims


 [1:3]

(1 row)

 

        固然总是连接四个 N 维的数组,结果数组的下标下界与运算符侧边的数组的下标下界相符,比方:

(1) SELECT array_dims('[-1:0]={2,3}'::int[] || ARRAY[1,2]);

 array_dims


 [-1:2]

(1 row)

 

(2)SELECT array_dims(ARRAY[1,2] || '[-1:0]={2,3}'::int[]);

 array_dims


 [1:4]

(1 row)

   

即便老是四个 N 维数组和贰个N+1 维的数组,N维数组将改为N+1数组的叁个成分。比方:

(1)SELECT  ARRAY[1,2] || ARRAY[[3,4],[5,6]];

      ?column?


 {{1,2},{3,4},{5,6}}

(1 row)

(2)SELECT  ARRAY[[3,4],[5,6]] || ARRAY[1,2];

      ?column?


 {{3,4},{5,6},{1,2}}

(1 row)

 

       也足以用函数array_prepend、array_append和array_cat连接多少个数组。前面多个函数只帮忙生机勃勃维数组,array_cat支持多维数组。最棒使用连接运算符,不要间接行使这个函数,在顾客自定义函数中豆蔻梢头旦有至关重大,能够直接使用这个函数。举个例子:

(1)SELECT array_prepend(1, ARRAY[2,3]);

 array_prepend


 {1,2,3}

(1 row)

 

(2)SELECT array_append(ARRAY[1,2], 3);

 array_append


 {1,2,3}

(1 row)

 

(3)SELECT array_cat(ARRAY[1,2], ARRAY[3,4]);

 array_cat


 {1,2,3,4}

(1 row)

 

(4)SELECT array_cat(ARRAY[[1,2],[3,4]], ARRAY[5,6]);

      array_cat


 {{1,2},{3,4},{5,6}}

(1 row)

 

(5)SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]);

      array_cat


 {{5,6},{1,2},{3,4}}

6.13.5 查询数组中的数据

     若是知道数组的大小,可以分明地援引数组中的每一个成分。例如:

SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR

                            pay_by_quarter[2] = 10000 OR

                            pay_by_quarter[3] = 10000 OR

                            pay_by_quarter[4] = 10000;

 

       如若数组中的成分过多,上边的办法鲜明过于冗杂。其余一个主意在第7.19节里描述。能够对数组使用ANY谓词,下边包车型客车询问能够用上边包车型地铁例子来替代:

SELECT * FROM sal_emp WHERE 10000 = ANY (pay_by_quarter);

   

也足以对数组使用ALL谓词,下边包车型地铁询问找寻数组pay_by_quarter的富有因素的值都等于 10000 的职工的记录:

SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);

 

6.13.6 数组输入和出口语法

       数组在被输出时,用二个文本字符串来表示,全数的数组成分用五个大括号({和})括起来,区别的数组成分用八个分割符分开。分隔符由数组元素的品种来支配,对于内置数据类型,除了box类型使用分号(;)以外,别的的数据类型的相间符都以逗号(,),举个例子,上面是贰个一人整型数组,它有4个要素:

{1,2,3,4}

   

 对于多维数组,它的每一种维的数额都要用七个大括号({和}卡塔尔(英语:State of Qatar)括起来,比方,下边是二个二维数组,假若它的名字是array_two_dims:

{{1,2},{3,4}}  

array_two_dims[1][1]=1,array_two_dims[1][2]=2,array_two_dims[2][1]=3,array_two_dims[2][2]=4。

   

对于字符串类型的数组,若是它的某部成分的值中包罗大括号、分隔符、双引号、反斜杠或空格,大概该值在调换来大写后是字符串NULL,在输出时,成分的值将用双引号引起来,而且值中的双引号和反斜杠后面将被机关抬高多个反斜杠。在输出时,要是成分的值是白手,将会用五个双引号来表示,空值用NULL表示。

 

       对于字符串类型的数组,推荐应用数构筑造器来为数组输入数据,借使使用普通的字符串语法来输入数据,在要素的值中冒出反斜杠和双引号的场合下,必要选取转义表示法,并且反斜杠数量要翻倍,下边包车型大巴事例插入五个数组成分,第七个要素是反斜杠,第一个要素是双引号。

INSERT ... VALUES (E’{"////","//""}’);

 那是因为字符串文本微型机会去掉第黄金时代层反斜杠,然后剩下的字符串就是{"//","/""}。 接着该字串被传送给 text 数据类型的输入函数,分别成为 / 和 "。

 

   也能够用美金符号节制的字符串的格式来为数组输入数据,那样就能够幸免接受双倍的反斜杠。

      上面是部分实例:

CREATE TABLE test( name text[]);

insert into test values(E'{"////","//""}');

insert into test values(E'{"////","//""}');

insert into test values('{null,null}'卡塔尔(قطر‎;  --数组的八个要素都以空值

insert into test values('{"null",""}'卡塔尔(英语:State of Qatar);  --数组的第多少个成分是字符串null,第贰个因素是二个空荡荡

insert into test values('{"ggg ",""}');

select * from test;

   name


 {"//","/""}

 {"//","/""}

 {NULL,NULL}

 {"null",""}

 {ggg,""}

(5 rows)

 

 

6.14 复合数据类型

    复合数据类型由二个或多个域组成,每一种域的数据类型能够是数据库的主干数据类型,也能够是复合数据类型,它就像于C语言中的布局,PostgreSQL 允许像使用简易数据类型那样选拔复合数据类型 比如,贰个表的某些列可以被声称为贰个复合类型。

6.14.1 定义复合类型

       使用命令CREATE TYPE创设五个复合类型,举例:

(1)CREATE TYPE complex AS (

    r       double precision,

    i       double precision

);

 

(2)CREATE TYPE inventory_item AS (

    name            text,

    supplier_id     integer,

    price           numeric

);

 

       命令CREATE TYPE的语法相通于CREATE TABLE``。

       创立了复合数据类型今后,就足以用建表时采纳它,比如:

CREATE TABLE on_hand (

    item      inventory_item,

    count     integer

);

INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);

   

也能够在函数中援用复合数据类型,比方:

CREATE FUNCTION price_extension(inventory_item, integer) RETURNS numeric

AS 'SELECT $1.price * $2' LANGUAGE SQL;

 

SELECT price_extension(item, 10) FROM on_hand;

      

创造表的时候,系统会自行创设二个复合数据类型,它的名字与表的名字同样,所以实际客户自定义的复合类型与数据库中的表是不能够同名的,不然系统会报错,举例:

CREATE TABLE test( name text[]);

CREATE TYPE test AS (

r double precision,

i double precision

);

 

错误: 表test已经存在。

6.14.2 复合类型值的输入和输出格式

     复合类型常量的貌似格式如下:

'( val1 , val2 , ... )'

 

举例,'("fuzzy dice",42,1.99卡塔尔国'就是近来创立的inventory_item类型的值。

   

设若值列表中的值的个数比复合类型的域的个数少,那么复合类型的排在前边的域将被赋给值列表中对应的值,剩下的域将被置为空值(NULL)。举个例子,下边这一个常量将inventory_item的第三个域置为空值:

'("fuzzy dice",42,)'

   

万大器晚成复合数据类型的有个别域的值是空白,则用七个双引号表示,举例:

'("",42,)'

 

 其余借使想把有个别域的值设为空值,逗号与逗号(或括号)之间并不是现身其余字符。比方,上边包车型地铁常量将inventory_item的第1个域设为空值:

'("",,1.8)'

上边包车型客车常量将inventory_item的全数域都设为空值:

'(,,)'

 

       也得以用多少行布局器(相信信息参谋第2.12节)的语法来布局复合类型值,推荐应用这种语法。这种艺术平日比用字符串的语法更简明。在输入的字符串中隐含反斜杠和双引号的意况下,必得使用转义语法,假使使用字符串的语法,反斜杠的数额必得翻倍(详细消息参照他事他说加以考察本章6.13.6 节),使用数据行结构器则要简澳优些,反斜杠的多寡无需翻倍。 譬喻:

ROW('fuzzy dice', 42, 1.99)

ROW('', 42, NULL)

ROW(E'/"', 42,88卡塔尔(英语:State of Qatar),1000卡塔尔(英语:State of Qatar) --E'/"' 表示输入的是三个双引号

ROW(E'//', 42,88卡塔尔(英语:State of Qatar), 1000 --E'//'表示输入的是三个反斜杠

 

假使数据行布局器中现身的域的个数超越三个,ROW关键字也得以被略去,举个例子,ROW('fuzzy dice', 42, 1.99卡塔尔国和('fuzzy dice', 42, 1.99卡塔尔(قطر‎是等价的。

 

       复 合数据类型的值在被输出时,若是它的有些域是字符串类型,而且那几个域的值中包罗反斜杠和双引号,那么三个反斜杠将用三个反斜杠表示,一个双引号将用四个双 引号表示。空串用四个双引号表示。要是字符串里面满含逗号、双引号、括号、空格和反斜杠,这一个字符串将用多少个双引号括起来,其它的字符串不会用双引号括起 来。比如:

INSERT INTO on_hand VALUES (ROW(E'/"', 42,88), 1000);

INSERT INTO on_hand VALUES (ROW(E'//', 42,88), 1000);

INSERT INTO on_hand VALUES (ROW('', 42,88卡塔尔(قطر‎, 1000卡塔尔(英语:State of Qatar); --注意,ROW里面包车型地铁首先值是四个单引号,不是一个双引号

INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);

INSERT INTO on_hand VALUES (ROW('(fuzzy', 42, 1.99), 1000);

INSERT INTO on_hand VALUES (ROW('fuzzy', 42, 1.99), 1000);

必发365电子游戏分别是基本数据类型、复合数据类型、域和伪类型。test=# select * from on_hand;

item | count

--------------------------+-------

("""",42,88) | 1000

("//",42,88) | 1000

("",42,88) | 1000

("fuzzy dice",42,1.99) | 1000

("(fuzzy",42,1.99) | 1000

("fuzzy dice",42,1.99) | 1000

("(fuzzy",42,1.99) | 1000

(fuzzy,42,1.99) | 1000

(8 rows)

 

6.14.3 访谈复合类型的值

       要访问一个复合类型的值的有个别域,能够选取肖似上边包车型地铁语法:

SELECT (item).name FROM on_hand WHERE (item).price > 9.99;

 

       列名必需用括号括起来,如若item未有用括号括起来,系统会认为item是一个表的名字,并不是表on_hand中的列的名字,也得以在列名后边加上表的名字,举例:

SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;

   

后生可畏经三个函数再次回到三个复合类型的值,要拜候那个值的有些域,也要动用方面包车型客车语法,举个例子:

SELECT (my_func(...)).field FROM ...

6.14.4 更新复合类型的值

    借使要翻新三个复合类型的值的全部域,使用近似上面包车型地铁语法:

UPDATE mytab SET complex_col = ROW(1.1,2.2);  --假定表mytab的列complex_col的数据类型是在前面的例子中(在第6.14.1节里定义)定义的类型complex

    也足以只更新三个复合类型值的有个别域:

UPDATE mytab SET complex_col.r = (complex_col).r + 1;

    注意,不可能把在 SET 前面现身的列名用括号括起来,可是在等号侧面的表明式中援用同三个列时要把列名用括号括起来。

    INSERT语句中也得以钦赐只为列的有些域提供值,比如:

INSERT INTO mytab (complex_col.r, complex_col.i) VALUES(1.1, 2.2);

    若无为列的全体域提供值,那么余下的域将用空值填充。

 

6.15 对象标记符类型(oid)

``oid 类型是三个无符号的四字节整数。PostgreSQL 在数据库内部采取oid类型的列作为各个系统表的主键。顾客创制的表也足以有贰个种类为oid的列(建表时接纳WITH OIDS``子句),因为oid类型只是叁个四字节的整数,在三个比超大的表中,oid的值大概不唯意气风发,所以并非在客商成立的表中使用 oid 类型的列作为主键。oid类型的列对于客户建构的表未有别的功效,最佳不用在顾客创设的表中增多系统列oid。

 

6.16 伪类型

       PostgreSQL中有生机勃勃种特别的数据类型,这种数据类型叫伪类型。八个伪类型不能够看做表的列的数据类型。伪类型只好被看成函数的参数的数据类型和函数的重临值的数据类型。表6-21列出了具备的伪类型。

 

表 6-21. 伪类型

类型名称

描述

anyarray

标注函数接纳或重回大肆数组类型

anyelement

标记函数选取或回到放肆数据类型

anyenum

标识函数接收或回到任意枚举类型

anynonarray

申明函数选取或重临放肆非数组类型

cstring

评释函数采纳或重返大肆以/0停止的字符串

internal

申明函数接收或回到大肆服务器内部的数据类型

record

申明函数重返多少个不分明的数额行行类型

trigger

评释函数将要触发器中动用。

void

标记函数未有重临值

 

用 C语言编写的函数(无论是数据库内置的要么动态装载的)都足以承担或然再次来到率性的伪数据类型。函数的小编应该保险函数在使用伪数据类型的数额时方可健康地干活。

 

用经过语言编写的函数只好使用适用于该进程语言的伪数据类型。当前,全数的进程语言都能接纳使用 voidrecord 作为函数再次来到值的数据类型(即便函数用做触发器,它的重临值的门类必得是trigger)。PL/pgSQL 还支持anyelementanyarrayanynonarrayanyenum``作为函数的参数和返回值的数据类型

伪类型internal用来评释那多少个只可以在数据库系统里头被调用的函数,这一个函数无法在客户的SQL查询里被直接调用。借使函数至罕见叁个internal 类型的参数,SQL查询就不可能间接调用它。唯有在函数除至稀少一个 internal``类型的参数的情状下,技巧将函数的重临值的类型定义为internal类型,应当要坚决守住那条法规。

 

anyelementanyarrayanynonarray和`anyenum又被叫做多态数据类型,使用这些数据类型的函数叫做多态函数。多态函数的参数的数据类型是不确定,实际的数据类型由传递给函数的参数的数据类型决定。anyelement表示任意数据类型,包括数组类型。anyarray表示任意数组类型。anyenum表示任意枚举类型。anynonarray``表示猖獗非数组类型。```

 

如果一个函数的返回值的数据类型是多态类型,那么该函数至少有一个参数的类型是多态类型。

上一篇:没有了