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類型要低。
table

小結:char和varchar的關係就是空間和時間的關係,char是以空間換時間,犧牲了磁盤空間,但羸得了查詢時間。 效率

對於Oracle,還有更深層次的區別。
好比對於員工的「備註」信息,若是用varchar(4000)。有的員工備註原來不多,後來有可能加入大量的備註。因爲varchar類型是沒有在記錄之間保存多餘的空閒空間的,因此就會引用記錄的「行遷移」,形成磁盤碎片,從而下降查詢效率。而char類型則用空格已經佔用了,不會引用磁盤空間的再分配。不會在項目使用過程當中引用碎片問題。好比QQ簽名、羣簡介等信息用戶常常修改,用char就比varchar要好。
date

相關文章
相關標籤/搜索