建立表時,必須為表的各個列指定資料類型。如果實際的資料與該列的資料類型不相比對,則資料庫會拒絕儲存。如為學生指定出生日期為“1980-13-31”。
在Oracle中,常見的資料類型有:
字元串:字元串分為定長類型char和變長類型varchar2。
數字:整數 number(整數位),小數 number(總長度,小數位),隻寫number,表示無限制。
日期:date類型,可以儲存年月日時分秒。
問題:Oracle中為什麼字元串類型為varchar2,它與varchar有什麼關系?
回答:
在Oracle中, varchar已經作為了保留字。如果你使用varchar類型,Oracle也不會報錯,但是建表以後你會發現,已經自動變為了varchar2類型。
問題:用number還是用integer(整數)?
另外Oracle也有integer等其它類型,但是用integer有缺點,就是不知道其長度,甚至可能在不同的作業系統上(如32位CPU和64位CPU)所配置設定的長度是不同的。而用number,指定多少,就永遠是多少,一切掌握在自己手中。
問題:如何為字元串和數字類型指定長度?
char類型可以不指定長度,則預設為1,而varchar2必須指定長度。
char和varchar類型的長度最大長度大約在4000多一點點。
number表示不限整數或小數,它能夠儲存非常大的數字或者儲存小數位非常多的數字。是以為了節約磁盤空間,盡量指定長度。
date:不需要指定長度。
問題:字元串最大長度約為4000。如果要儲存更多的内容怎麼辦?
解決的方法有兩種。第一種是用大對象類型,即CLOB或者BLOB類型,但是程式設計比較麻煩;第二種是用一對多的父子表實作。
大對象是指大量的資料。如果用char或varchar2,列的最大長度大約在4000多;如果内容更多,其中一個方法就是将列設定為CLOB類型,但是隻限制儲存字元資料,如小說。如果是二進制資料,如圖檔、聲音、office文檔,則需要将列設定BLOB類型。CLOB或BLOB最大能夠裝4G的内容。如果是電影,則更通常的做法是在表中儲存電影的名稱、路徑等資訊,電影直接儲存在磁盤上,而不是直接存儲在資料庫中,也不是用BFile類型。
示例:建立小說表
create table xiao_shuo(
xs_id number(10) primary key, –小說編号
xs_name varchar2(5), –小說名稱
xs_contenct clob, –小說内容
xs_fen_mian blob –小說封面(圖檔)
);
第二種是利用父子表實作,例如:小說表(小說ID,小說标題),内容表(小說ID,行數,行内容),其中行内容為varchar(4000)。這表示每一行最多儲存4000個字元。
重點問題:定長類型和變長類型和什麼差別?
兩者主要的差別展現在存儲上和查詢效率上。
首先講char——定長類型。
如将姓名列指定為char(8)。當儲存“張三”時,資料庫還會自動儲存4個空格;儲存“張三豐”時,資料庫還會自動儲存2個空格,這樣每個人的姓名長度都為8,長度是固定的,是以叫做“定長”。明顯,在儲存資訊時,定長會因為儲存了很空格而多占用了磁盤空間。
資料庫儲存這些“多餘”的空格有什麼作用?
那就是查詢時,在取到字段的長度以後,不再需要判斷每一個姓名的實際長度,就可以取到資料。這樣查詢效率大大提高了。
下面再講varchar2——變長類型。
如将姓名列指定為varchar2(8)。當儲存“張三”和儲存“張三豐”時,資料庫都隻儲存資料的本身,不會自動添加空格。兩個人姓名的長度分别為4和6,長度是變化的,是以叫做“變長”。這樣沒有多占用任何磁盤空間。
但是在查詢時,每個人的姓名的長度都不同,必須先判斷後取資料,是以查詢效率比char類型要低。
小結:char和varchar的關系就是空間和時間的關系,char是以空間換時間,犧牲了磁盤空間,但羸得了查詢時間。
對于Oracle,還有更深層次的差別。
比如對于員工的“備注”資訊,如果用varchar(4000)。有的員工備注原來很少,後來有可能加入大量的備注。由于varchar類型是沒有在記錄之間儲存多餘的空閑空間的,是以就會引用記錄的“行遷移”,造成磁盤碎片,進而降低查詢效率。而char類型則用空格已經占用了,不會引用磁盤空間的再配置設定。不會在項目使用過程中引用碎片問題。比如QQ簽名、群簡介等資訊使用者經常修改,用char就比varchar要好。