Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90924252
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-08 10:43:26

 



在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数据库使用的数据型别相当的多,这对于一套免费的数据库来说是相当的不错,我们可以把每一种数据型别应用在各种不同的领域之中,而且我们也可以根据需要去选择比较省空间的数据型别,而好的数据型别,不但可以帮我们有效的管理数据,而且也可以防止我们写入一些错误的数据格式进入数据库。


出处:南方Linux
阅读(1034) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~