Oracle 常用數據類型詳解

jopen 11年前發布 | 50K 次閱讀 Oracle 數據庫服務器

創建表時,必須為表的各個列指定數據類型。如果實際的數據與該列的數據類型不相匹配,則數據庫會拒絕保存。如為學生指定出生日期為“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要好。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!