在postgreSQL数据库之中,数据库表(TABLE)中的数据栏位我们都必须要定义它的数据格式为何,而PostgreSQL数据库所支援的数据形态则是非常多,如表3.1所示
===============================
注:(DATA)数据,又称为 资料。
===============================
▓字串形态类别
字串格式是在数据库之中最常使用到的一种数据型态,像是人的姓名是字串的格式,一般的数值资料都可以存成文字格式,文字类别主要要分成character(n)、varchar(n)、text三种格式型态,各有长处和缺点。
(1) CHARACTER(n)(固定长度)
character(n)是一个固定长度的文字数据类别,一般我们都是使用简称为char(n)两者是同义,用法也是一样,参数n是此变数所要宣告的最大字元长度,若写入此资料栏位的数据超过数据库的长度n 时,我们必须要对每一个要建立的栏位来做分析评估,像身份证字号是固定长度的一组文字资料,长度固定为10,所以我们就可以使用var(10)来做宣告,如此做不但可以节省使用数据库的空间,而且当我们在开发应用程式时,在写入身份证数据时,能够防止我们写入的数据超过此长度的身份证数据。
例如:
‘A123456789’ 是一个身份证号码就可以存在 char(10)之中。
(2) CHARACTER VARYING(n)和VARCHAR(n)(变动长度)
character varying(n)是一种变动长度的数据型别,最人的长度为n,一般我们都是使用简称archar(n)两者是同义,用法也是一样,参数n是此变数所要宣告的最大字元长度,使用的方式大致上是相容的,从字面上的意义,我们可以以知道char(n)跟varchar(n)所占用的储存空间来说,char(n)不管资料是否有达n个位元组,都必须占用n个位元组,不足的地力则会使用空白填满,而varchar(n)则是一种动态长度文字宣告,虽然每个栏位最大只能够容纳n个位元组,但是若不足n个位元组时,只会占用到实际的的位元组空间,若输入的数据字元数超过设定的n 值时,会出现错误的信息,使用变动长度varchar(n)的好处是可以节省比较多的储存空同。
(3) TEXT(不限制长度)
文字数据型别(text)是用来储存没有规则长度的数据型别,因此这种数据型别也不用设定最大的长度n的值,若所要存的数据是文章之类,由于长度不固定,而且又需要比较多的字元组来储存数据,就可以使用text格式,因为基本上text是没有限制一定的长度,应该可以达到2GB位元组大小,应付一般的需要就已经足够了。
▓ 数值形态类别
数值数据是用来存放数值的数据,主要有INTEGER、INT2、INT8、NUMERIC(P,D)、FLOAT4和FLOAT8,INTEGER跟INT4是同一种数据型别占用4个位元组大小、数值范围从-2ˆ7至2ˆ7。
INT2象是小整数,占用了两个位元组的大小数值范围从-2ˆ7至2ˆ7。
而INT8就像是大整数一样,占用了八个位元组大小数值范围-2ˆ63至2 ˆ63,如此大的数字已能够我们使用了。
NUMERIC(P, D)是可以由使用者自己定义精确度的数值数据型别,P代表使用者定义全部使用者定义全部的数值位数,而D代表在这个数值中有几位是小数。
例如:NUMERIC (5,3)就代表者五位数有三位小数点,格式像12.345就是一个五位数三小数的范例了。
Float4跟Float8则是用来存放浮点逼算数值。
以下我们对于每一种数值型态有详细的介绍。
整数型态主要是用来储存没有小数点的整数值,整数型态共有三种smallint,integer,bigint,这三种整数数据型态最大的差别是在於存在硬碟所使用的容量大小,如表3.2所示,一般我们常使用的是integer整数数据型态,此种数据型态占用4个位元组的大小,可以使用的范围从-2147483648至+2147483647,除非是我们所使用的硬碟空间不足,才有必要去使用smallint整数数据型态,这种数据型态所占用的硬盘空间为2个位元组的大小,所使用的范围从-32768至+32768,若是我们要存放的数值大於32767以上的话,就必须使用bigint整数数据型态,此种数值资料占用8个位元组的硬盘空间,但是可以使用的数值范围为-9223372036854775808至9223372036854775807,我想这样子大的数据应该够一般使用了。
● 精确度数值型态
精确度的数值型态主要用来存放任何必须要有精确度的数值数据,一般都用在於货币金额和其它需要准确性高的数量,共有两种表示法‘decimal’跟numeric, 因为decimal跟numeric 同义,使用方法一样,所以我们直接介绍mumeric的用法。
主要格式如下:
NUMERIC(precisrion, scale)
参数precision代表此数值精确的位数,一定为正数。 其中参数scale代表精确到小数点之后的位数几位,此参数可以为正数或为零。
例如:数值123456.1234在NUMERIC之中代表着参数precision值为十位,而参数scale的值为四位,代表着此数值最大的长度为十位,精确度至小数点之后四位,精确度数值表示法为numeric(6, 2)。
Numeric表示法也可以用来代表整数数据型态,也就是当参数scale为零时,就代表着整数型态,但是一般没用人会使用这个来代表整数型态,因为此种数据型态的运算此较复杂,会比较浪费系统资源,所以若要表示整数可以使用integer数据型态比较合适。两者列表如表3.3所示:
● 浮点数数值型态
浮点数数据型态,一般都称作real为单精确度数值型态,也简称为float4,因为占用了4个位元组的数据,而数值的范围是从-E+37到+1E+37,精度至少是6位少数。
double precision称为双精确度数值型态,又简称为float8,占用八个位元组硬盘空间,范围从-E+308至+lE+308,精确度至少l5位。因为此种数值型态的精碓度是会变动的,若使用者需要用到精确度高,像是货币这一类的数据,最好是使用numeric(precision, scale)数据型态,才能保证数据的正确性。如表3.4表示两种数据型态的比较。
● 序列型态
serial並不是一个数据型态,它代表着一个栏位的整数值取得来自于一个自动编号器自动的產生,serial的值是从1 至 +2147483647之间,占用4个位元组,而bigserial是占用八个字元组,整数值的范围是从 1至9223372036854775807。一般都是用在主键(primary key)自动產生,因此我们就不用担心,主键(primary key)的键值会重复,因为每次主键的值都是由系统的SERIAL自动產生的。表3.5是两种数据型別的比较。
语法如下:
CREATE TABLE tablename ( colname SERIAL );
范例:
假如我们在建立一个书籍资料,我们希望每一本书给一个特定不能重复的号码,那麼我们可以执行如下的命令建立一个如下的表格:
CREATE TABLE book (id SERIAL) ;
若是我们使用的键值有可能会超过 +2147483647的话,那在建立资料表时就可以使用BIGSERIAL来建立资料表,如下所示:
CREATE TABLE book (id BIGSERIAL) ;
其实CREATE TABLE book (id SERIAL)是等於下面两行执行的结果。
CREATE SEQUENCE book_id_seq ;
CREATE TABLE book ( id integer DEFAULT nextval (‘book_id_seq’) UNIQUE NOT NULL ) ;
上面第一行代表著建立一个新的(序列SEQUENCE),名称为book_id_seq
第二行是建立一个名称为book的资料表,其中建立了一个名称为id的整数型态栏位,DEFAULT是预设值为nextval (‘book_id_seq’)也就是取得book_id_seq序列的下一个数值编号,而且设定此栏位是不可重覆的资料,而且是NOT NULL型态。
▓ 日期时间型态类別
时间的格式型态主要是用来存放日期跟时间的,主要有四种格式:DATE、TIME、TIMESTAMP跟INTERVAL,而除了日期Date跟时区 (time zone)无关以外又可以分为有时区(with time zone)和无时区(without time zone)两大类。在PostgreSQL之中,日期和时间的数据栏位提供相当多种的表示方式,这是因为每个国家会因为地区的风俗习惯不同,而且每个地区的时间也因为时差不同,所以PostgreSQL提供了所有可用的日期和时间数据栏位型别可以使用。如下表3.6则是所有可用的日期和时间数据型别。
DATE主要是存放日期的数据型态,例如:
“00l/12/5”,TIME主要是存放着时间的数据型态,例如:“17:23:l0”,TIMESTAMP主要是存放著日期加上时间的数据型态,例如:“2001-12-5 17:23:10”, INTERVAL是存着两个时间差的一种数据型态,例如:200-12-5 11:00:00 2001-12-6 12:00:两个时间差就是1 l:00:00
第一位数字l则代表相差了一天,而后面的三组数字分別代表“一个小时:零分:零秒”可以用来计算两个时间差的值,再放入此数据型別之中。以下我们做详细的介绍。
● 日期(date)
日期(date)数据型态是一种用来储存日期的数据栏位,一个日期(date)的数据栏位会占用4个位元组的硬盘空间,日期可以使用的输入格式有很多种,为了方便,我们可以使用月份的缩写,下表3.7代表十二月的月份缩写字串,为了方便,我们可以使用星期的缩写,下表3.8代表一个星期的星期缩写字串,下表3.9代表各种日期的输入格式字串。
● 带时区的数据型别(time with time zone input)
带时区时间的数据型别(time with time zone input)是一种时间(time)加上一个时间偏移量(PST)的数据型别,时区所表示的方式也有很多种,象北京的时区是格林威治(UTC)时间+8小时,格式有如下表3.10四种范例格式。
● 不带有时间差的时间数据型别 (time without time zone intput)
不带有时间差的时间数据型别 (time without time zone intput),是一种只有时间而没有时间差的数据型别,使用的输入格式如表3.11所示:
● timestamp[with time zone input]数据型态
timestamp[with time zone input]数据型别主要是包含一个日期,加一个时间,后面再跟着一个AD(西元前)或BC(西元后) ,最后在加上一个时区,例如:
‘ 2002-0l-0l 02:03:04 -8:00 ’
代表着西元2002年一月一日二点三分四秒减八个小时时差。
● timestamp[without time zone input]数据型态
timestamp[with time zone input]资料型别主要是包含一个日期,加一个时间,后面再跟着一个AD(西元前)或BC(西元后) ,最后是不附带时区,例如:
‘ 2002-0l-0l 02:03:04 ’
代表着西元2002年一月一日二点三分四秒。
● interval数据型态
interval主要是用来存放着两个日期时间相差的值。 例如:
‘ l 02:03:05 ’代表相差一天二小时三分五秒。
● 日期时间的输出(data/time output)
日期的输出格式共有四种,分别是“ISO-8601”、“传统风格”、“原始风格”和“地区风格”,如表3.12所示。 PST代表地方的时区。SQL风格又可以分欧洲(European)跟非欧洲(US)两种。主要的差别在于欧洲(European)风格是日子在月份的前面,而非欧洲(US)则是月份在日子的前面,我们可以使用SQL语法SET DateStyle to ‘US’格式,而SET DateStyle to ‘European’设定为欧洲格式。
▓ 逻辑型态类别(boolean)
逻辑型别一般都是用来定义逻辑上面两种情形,一种「是」(True)另外一种则「否」(False) 一般我们会使用在只有两种选择时就可以用逻辑数据型别,像是非题就可以使用此种格式,可以节省很多的空间,当然还有第三种状态,那就是不知(unknow)状态,在PostgreSQL之中是以SQL NULL状态来代表。表3.13表示各种可以使用的输入格式列表。
▓ 几何数据类别
几何数据类别,主要形态有POINT、LSEG、LINE、PATH(闭合)、PATH(开放)BOX、POLYGON、CIRCLE八种,如下表3.14所示,我们以下详细的介绍。
● 点(point)
点(point)是一个2维坐标的的基本单位,一般是以坐标x和y来代表。 语法如下:
(x,y ) 或 x,y
以上的参数
x是用浮点数(float)表示的点的x坐标。 y是用浮点数(float)表示的点的y坐标。
例如:‘(3.1,4.2)’就代表在x轴为3.1和y轴为4.2的一个交点。
● 线(line)
线段(line)是用一对点来代表的,语法如下:
((x1,y1),(x2,y2)) 或
(x1,y1),(x2,y2) 或
x1,y1, x2,y2 或
在以上的参数之中,有两个线段的端点,分别为
(x1,y1) 一个坐标为(x1,y1)的点
(x2, y2) 一个坐标为(x2, y2)的点
因此由这两个端点连结起来的就是一个线段。
● 矩形(BOX)
矩形是用两个对角点(POINT)来表示的。
Box用下面语法声明:
((x1,y1),(x2,y2)) 或
(x1,y1),(x2,y2) 或
x1,y1, x2,y2
这里的参数是
(x1,y1) 代表一个坐标为(x1,y1)的点
(x2,y2) 代表一个坐标为(x2,y2)的点
是代表矩形的两个对角点(POINT)。
例如:‘((1,1),(2,2))’代表以此两个点为对角的矩形。
● 路径(PATH)
路径代表着一系列点的连结,有两种代表方式,一种是开放(open)的路径,就是第一个点没有跟最后一个点连结,另外一种是闭合(close)的路径,也就是第一个点跟后一个点有连结。提供了函数popen(path)和pclose(path)来强制路径是开放的还是闭合的,可以用函数isopen(path)和isclosed(path)来在查询中选择是那种。
所使用的表示法如下:
((x1,y1),…,(xn,yn)) 或 [(x1,y1),…,(xn,yn)] 或 (x1,y1),…,(xn,yn) 或 (x1,y1,…,xn,yn) 或 x1,y1 ,…,xn,yn 或
所代的参数是一系列的点坐标如下格式:
(xn,yn)是一系列的点(POINT)所组合而成的。
在表示法之中,若包括整个路径的中括号是“[”和“]”是代表一个开放(open)路径,而小括号“(”和“)”就代表是一个闭合的路径。
例如:‘((1,1),(2,2),(3,3))’就代表着一个闭合的路径,而‘[(1,1),(2,2),(3,3)]’就代表着一个开放的路径。
● 多边形(POLYGON)
多边形(polygon)是由一系列点(POINT)代表,多边形可以认为与闭合路径(PATH)用法是一样的,但是存入的方式不同,有自己的一套方法。
Polygon所使用的表示法如下:
((x1,y1),…,(xn,yn)) 或 (x1,y1),…,(xn,yn) 或 (x1,y1,…,xn,yn) 或 x1,y1 ,…,xn,yn 或
所代入的参数是一系列的点(POINT)所组合而成的,而这些点会组成多边形(Polygon)的边界和点。
多边形的输出格式采用第一种表示法((x1,y1),…,(xn,yn)) 格式输出。
例如:((1,1),(2,2),(3,3,(4,4))就代表着一个连结此四个点的多边形。
● 圆形(CIRCLE)
圆形(circle)代表一个圆的数据格式,要表示一个圆只要有参数圆心和参数半径就可以表示。
圆使用下面的表示法代表:
<(x,y),r> 或 ((x,y),r) 或 (x,y),r 或 x,y , r 或
这里的参数所代表的就是:
(x,y) 一个点代表圆心
r 一个数值,代表圆的半径
圆输出时采用第一种格式‘<(x,y),r>’ 例如:输入时字串‘<(1,1),2>’代表一个以点(1,1)为圆心而半径为2的圆。
网络格式形态主要有以下三种:INET、CIDR、MACADDR,INET是用来存放一个网络的IP地址,例如:192.163.1.1,CIDR则是用来存放着网络的实体位址。如表3.15所示为各种形态的比较,以下有详细的介绍。
● INET网络位址形态
代表着一个网络的IP位址或是一个子网络,格式为
x.x.x.x 或 x.x.x.x/y
两种表示法,第一种代表一个主机(host),第二种代表一个子网络。
x.x.x.x表示一个网络的IP主机,而y代表一个子网络的netmask,我们以一个数字代表,若为32代表一个主机。
● CIDR网络位址形态
cidr跟inet是类同的数据型别,最大的不同在于inet可以去掉右边的netmask代表一个主机,但是cidr一定要有netmask,范例如下所示:
格式为
x.x.x.x/y
x.x.x.x表示一个网络的IP主机,而y 代表子网络的netmask,我们以一个数字代表, 若为32代表一个主机。
范例:
如表3.16为所有的输入和输出的格式。
● MACADDR网络位址数据型态
macaddr主要是代表着一个网络卡的实体位址,所使用的输入格式相当的多,范例如表3.17所示:
输出的格式以最后一种表示法‘08:00:2b:01:02:03’ 格式为主。
结语:
由于PostgreSQL数据库使用的数据型别相当的多,这对于一套免费的数据库来说是相当的不错,我们可以把每一种数据型别应用在各种不同的领域之中,而且我们也可以根据需要去选择比较省空间的数据型别,而好的数据型别,不但可以帮我们有效的管理数据,而且也可以防止我们写入一些错误的数据格式进入数据库。
|