Oracle 建表常用資料型別詳解

2021-06-19 11:18:28 字數 3699 閱讀 3097

前言:

為列指定資料型別並不難,難的是指定合適的資料型別。同樣是字串型別,選擇定長還是變長,其中大有文章。所以需要耐心而細緻的學習下面的內容。

建立表時,必須為表的各個列指定資料型別。如果實際的資料與該列的資料型別不相匹配,則資料庫會拒絕儲存。如為學生指定出生日期為「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要好。

下面是oracle中的系統檔案中關於資料型別的定義:

subtype float is number; -- number(126)

subtype real is float; -- float(63)

subtype "double precision" is float;

subtype integer is number(38,0);

subtype int is integer;

subtype smallint is number(38,0);

subtype decimal is number(38,0);

subtype numeric is decimal;

subtype dec is decimal;

subtype binary_integer is integer range '-2147483647'..2147483647;

subtype natural is binary_integer range 0..2147483647;

subtype naturaln is natural not null;

subtype positive is binary_integer range 1..2147483647;

subtype positiven is positive not null;

subtype signtype is binary_integer range '-1'..1;  -- for sign functions

type varchar2 is new char_base;

subtype varchar is varchar2;

subtype string is varchar2;

subtype long is varchar2(32760);

subtype raw is varchar2;

subtype "long raw" is raw(32760);

subtype rowid is varchar2(256);

-- ansi fixed-length char

-- define synonyms for char and charn.

subtype char is varchar2;

subtype character is char;

type mlslabel is new char_base;

Oracle建表常用資料型別詳解

oracle建表常用資料型別詳解 建立表時,必須為表的各個列指定資料型別。如果實際的資料與該列的資料型別不相匹配,則資料庫會拒絕儲存。如為學生指定出生日期為 1980 13 31 在oracle中,常見的資料型別有 字串 字串分為定長型別char和變長型別varchar2。數字 整數 number ...

Oracle 建表常用資料型別的詳解

建立表時,必須為表的各個列指定資料型別。如果實際的資料與該列的資料型別不相匹配,則資料庫會拒絕儲存。如為學生指定出生日期為 1980 13 31 在oracle中,常見的資料型別有 字串 字串分為定長型別char和變長型別varchar2。數字 整數 number 整數字 小數 number 總長度...

oracle 建庫建表以及資料型別 主鍵自增

jdbc oracle localhost 1521 oracle.jdbc.driver.oracledriver create table userinfo id number 6 primary key,主鍵 name varchar2 20 not null,非空 number 1 age ...