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要好。
下面是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 建表常用資料型別詳解
前言 為列指定資料型別並不難,難的是指定合適的資料型別。同樣是字串型別,選擇定長還是變長,其中大有文章。所以需要耐心而細緻的學習下面的內容。建立表時,必須為表的各個列指定資料型別。如果實際的資料與該列的資料型別不相匹配,則資料庫會拒絕儲存。如為學生指定出生日期為 1980 13 31 在oracle...
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 ...