天天看點

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要好。