二、字段類型
不同的字段類型用來存放不同類型的數(shù)據(jù),。創(chuàng)建和使用表時(shí),,你更應(yīng)該理解五種常用的字段類型:字符型,文本型,,數(shù)值型,,邏輯性和日期型。
(1)字符型數(shù)據(jù)
字符型數(shù)據(jù)非常有用,。當(dāng)你需要存儲(chǔ)短的字符串信息時(shí),,你總是要用到字符型數(shù)據(jù)。例如,,你可以把從HTML form的文本框中搜集到的信息放在字符型字段中,。
要建立一個(gè)字段用來存放可變長度的字符串信息,你可以使用表達(dá)式 VARCHAR,??紤]你前面創(chuàng)建的表guestbook:
CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate DATETIME)
在
這個(gè)例子中,,字段visitor的數(shù)據(jù)類型為VARCHAR。注意跟在數(shù)據(jù)類型后面的括號(hào)中的數(shù)字,。這個(gè)數(shù)字指定了這個(gè)字段所允許存放的字符串的最大長
度,。在這個(gè)例子中,字段visitor能存放的字符串最長為四十個(gè)字符,。如果名字太長,,字符串會(huì)被截?cái)啵槐A羲氖畟€(gè)字符,。
VARCHAR類型可以存儲(chǔ)的字符串最長為255個(gè)字符,。要存儲(chǔ)更長的字符串?dāng)?shù)據(jù),可以使用文本型數(shù)據(jù)(下一節(jié)中講述),。
另一種字符型數(shù)據(jù)用來存儲(chǔ)固定長度的字符數(shù)據(jù),。下面是一個(gè)使用這種數(shù)據(jù)類型的例子:
CREATE TABLE guestbook (visitor CHAR(40),comments TEXT,entrydate DATETIME)
在這個(gè)例子中,字段visitor被用來存儲(chǔ)四十個(gè)字符的固定長度字符串,。表達(dá)式CHAR指定了這個(gè)字段應(yīng)該是固定長度的字符串,。
VARCHAR型和CHAR型數(shù)據(jù)的這個(gè)差別是細(xì)微的,但是非常重要,。假如你向一個(gè)長度為四十個(gè)字符的VARCHAR型字段中輸入數(shù)據(jù)Bill Gates,。當(dāng)你以后從這個(gè)字段中取出此數(shù)據(jù)時(shí),你取出的數(shù)據(jù)其長度為十個(gè)字符——字符串Bill Gates的長度,。
現(xiàn)在假如你把字符串輸入一個(gè)長度為四十個(gè)字符的CHAR型字段中,,那么當(dāng)你取出數(shù)據(jù)時(shí),所取出的數(shù)據(jù)長度將是四十個(gè)字符,。字符串的后面會(huì)被附加多余的空格,。
當(dāng)你建立自己的站點(diǎn)時(shí),你會(huì)發(fā)現(xiàn)使用VARCHAR型字段要比CHAR型字段方便的多,。使用VARCHAR型字段時(shí),,你不需要為剪掉你數(shù)據(jù)中多余的空格而操心。
VARCHAR型字段的另一個(gè)突出的好處是它可以比CHAR型字段占用更少的內(nèi)存和硬盤空間,。當(dāng)你的數(shù)據(jù)庫很大時(shí),,這種內(nèi)存和磁盤空間的節(jié)省會(huì)變得非常重要。
(2)文本型數(shù)據(jù)
字符型數(shù)據(jù)限制了字符串的長度不能超過255個(gè)字符,。而使用文本型數(shù)據(jù),,你可以存放超過二十億個(gè)字符的字符串。當(dāng)你需要存儲(chǔ)大串的字符時(shí),,應(yīng)該使用文本型數(shù)據(jù),。
這里有一個(gè)使用文本型數(shù)據(jù)的例子:
CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate DATETIME)
在這個(gè)例子中,字段comments被用來存放訪問者對(duì)你站點(diǎn)的意見。注意文本型數(shù)據(jù)沒有長度,,而上一節(jié)中所講的字符型數(shù)據(jù)是有長度的,。一個(gè)文本型字段中的數(shù)據(jù)通常要么為空,要么很大,。
當(dāng)你從HTML form的多行文本編輯框(TEXTAREA)中收集數(shù)據(jù)時(shí),,你應(yīng)該把收集的信息存儲(chǔ)于文本型字段中。但是,,無論何時(shí),,只要你能避免使用文本型字段,你就應(yīng)該不適用它,。文本型字段既大且慢,,濫用文本型字段會(huì)使服務(wù)器速度變慢。文本型字段還會(huì)吃掉大量的磁盤空間,。
警告:
一旦你向文本型字段中輸入了任何數(shù)據(jù)(甚至是空值),,就會(huì)有2K的空間被自動(dòng)分配給該數(shù)據(jù)。除非刪除該記錄,,否則你無法收回這部分存儲(chǔ)空間,。
(3)數(shù)值型數(shù)據(jù)
SQL Sever支持許多種不同的數(shù)值型數(shù)據(jù)。你可以存儲(chǔ)整數(shù),、小數(shù),、和錢數(shù)。
通常,,當(dāng)你需要在表中的存放數(shù)字時(shí),你要使用整型(INT)數(shù)據(jù),。INT型數(shù)據(jù)的表數(shù)范圍是從-2,,147,483,,647到2,,147,483,,647的整數(shù),。下面是一個(gè)如何使用INT型數(shù)據(jù)的例子:
CREATE TABLE visitlog (visitor VARCHAR(40),numvisits INT)
這個(gè)表可以用來記錄你站點(diǎn)被訪問的次數(shù)。只要沒有人訪問你的站點(diǎn)超過2,,147,,483,647次,,nubvisits字段就可以存儲(chǔ)訪問次數(shù),。
為了節(jié)省內(nèi)存空間,你可以使用SMALLINT型數(shù)據(jù)。SMALLINT 型數(shù)據(jù)可以存儲(chǔ)從-32768到32768的整數(shù),。這種數(shù)據(jù)類型的使用方法與INT型完全相同,。
最后,如果你實(shí)在需要節(jié)省空間,,你可以使用TINYINT型數(shù)據(jù),。同樣,這種類型的使用方法也與INT型相同,,不同的是這種類型的字段只能存儲(chǔ)從0到255的整數(shù),。TINYINT型字段不能用來存儲(chǔ)負(fù)數(shù)。
通
常,,為了節(jié)省空間,,應(yīng)該盡可能的使用最小的整型數(shù)據(jù)。一個(gè)TINYINT型數(shù)據(jù)只占用一個(gè)字節(jié),;一個(gè)INT型數(shù)據(jù)占用四個(gè)字節(jié),。這看起來似乎差別不大,但
是在比較大的表中,,字節(jié)數(shù)的增長是很快的,。另一方面,一旦你已經(jīng)創(chuàng)建了一個(gè)字段,,要修改它是很困難的,。因此,為安全起見,,你應(yīng)該預(yù)測(cè)以下,,一個(gè)字段所需要
存儲(chǔ)的數(shù)值最大有可能是多大,然后選擇適當(dāng)?shù)臄?shù)據(jù)類型,。
為
了能對(duì)字段所存放的數(shù)據(jù)有更多的控制,,你可以使用NUMERIC型數(shù)據(jù)來同時(shí)表示一個(gè)數(shù)的整數(shù)部分和小數(shù)部分。NUMERIC型數(shù)據(jù)使你能表示非常大的數(shù)
——比INT型數(shù)據(jù)要大得多,。一個(gè)NUMERIC型字段可以存儲(chǔ)從-10^38到10^38范圍內(nèi)的數(shù),。NUMERIC型數(shù)據(jù)還使你能表示有小數(shù)部分的
數(shù)。例如,,你可以在NUMERIC型字段中存儲(chǔ)小數(shù)3.14,。
當(dāng)定義一個(gè)NUMERIC型字段時(shí),你需要同時(shí)指定整數(shù)部分的大小和小數(shù)部分的大小,。這里有一個(gè)使用這種數(shù)據(jù)類型的例子:
CREATE TABLE numeric_data (bignumber NUMERIC(28,0), fraction NUMERIC (5,4) )
當(dāng)這個(gè)語句執(zhí)行時(shí),,將創(chuàng)建一個(gè)名為numeric_data的包含兩個(gè)字段的表。字段bignumber可以存儲(chǔ)直到28位的整數(shù),。字段fraction可以存儲(chǔ)有五位整數(shù)部分和四位小數(shù)部分的小數(shù),。
一個(gè)NUMERIC型數(shù)據(jù)的整數(shù)部分最大只能有28位,小數(shù)部分的位數(shù)必須小于或等于整數(shù)部分的位數(shù),小數(shù)部分可以是零,。
你
可以使用INT型或NUMERIC型數(shù)據(jù)來存儲(chǔ)錢數(shù),。但是,專門有另外兩種數(shù)據(jù)類型用于此目的,。如果你希望你的網(wǎng)點(diǎn)能掙很多錢,,你可以使用MONEY型數(shù)
據(jù)。如果你的野心不大,,你可以使用SMALLMONEY型數(shù)據(jù),。MONEY型數(shù)據(jù)可以存儲(chǔ)從-922,337,,203,,685,477.5808到
922,,337,,203,685,,477.5807的錢數(shù),。如果你需要存儲(chǔ)比這還大的金額,你可以使用NUMERIC型數(shù)據(jù),。
SMALLMONEY型數(shù)據(jù)只能存儲(chǔ)從-214,,748.3648到214,748.3647 的錢數(shù),。同樣,,如果可以的話,你應(yīng)該用SMALLMONEY型來代替MONEY型數(shù)據(jù),,以節(jié)省空間,。下面的例子顯示了如何使用這兩種表示錢的數(shù)據(jù)類型:
CREATE TABLE products (product VARCHAR(40),price MONEY,
Discount_price SMALLMONEY)
這個(gè)表可以用來存儲(chǔ)商品的折扣和普通售價(jià)。字段price 的數(shù)據(jù)類型是MONEY,,字段discount_price的數(shù)據(jù)類型是SMALLMONEY。
(4)存儲(chǔ)邏輯值
如果你使用復(fù)選框(CHECKBOX)從網(wǎng)頁中搜集信息,,你可以把此信息存儲(chǔ)在BIT型字段中,。BIT型字段只能取兩個(gè)值:0或1。這里有一個(gè)如何使用這種字段的例子:
CREATE TABLE opinion (visitor VARCHAR(40),good BIT)
這個(gè)表可以用來存放對(duì)你的網(wǎng)站進(jìn)行民意調(diào)查所得的信息,。訪問者可以投票表示他們是否喜歡你的網(wǎng)站,。如果他們投YES,就在BIT型字段中存入1,。反之,,如果他們投NO,就在字段中存入0(在下一章里,你將學(xué)會(huì)如何計(jì)算投票),。
當(dāng)心,,在你創(chuàng)建好一個(gè)表之后,你不能向表中添加BIT型字段,。如果你打算在一個(gè)表中包含BIT型字段,,你必須在創(chuàng)建表時(shí)完成。
(5)存儲(chǔ)日期和時(shí)間
當(dāng)你建立一個(gè)網(wǎng)站時(shí),,你也許需要記錄在一段時(shí)間內(nèi)的訪問者數(shù)量,。為了能夠存儲(chǔ)日期和時(shí)間,你需要使用DATETIME型數(shù)據(jù),,如下例所示:
CREATE TABL visitorlog(arrivaltime DATETIME ,departuretime DATETIME)
這個(gè)表可以用來記錄訪問者進(jìn)入和離開你網(wǎng)站的時(shí)間和日期,。一個(gè)DATETIME型的字段可以存儲(chǔ)的日期范圍是從1753年1月1日第一毫秒到9999年12月31日最后一毫秒。
如
果你不需要覆蓋這么大范圍的日期和時(shí)間,,你可以使用SMALLDATETIME型數(shù)據(jù),。它與DATETIME型數(shù)據(jù)同樣使用,只不過它能表示的日期和時(shí)間
范圍比DATETIME型數(shù)據(jù)小,,而且不如DATETIME型數(shù)據(jù)精確,。一個(gè)SMALLDATETIME型的字段能夠存儲(chǔ)從1900年1月1日到2079
年6月6日的日期,它只能精確到秒,。
DATETIME型字段在你輸入日期和時(shí)間之前并不包含實(shí)際的數(shù)據(jù),,認(rèn)識(shí)這一點(diǎn)是重要的。在下一章,,你將學(xué)習(xí)怎樣使用大量的SQL函數(shù)來讀取和操作日期和時(shí)間(參見下面的“缺省值”一節(jié)),。你也可以在VBScript和JScript 中使用日期和時(shí)間函數(shù)來向一個(gè)DATETIME型字段中輸入日期和時(shí)間。