標籤:無法查詢 長度 clob 大於 文檔 float 自然數 規則 字元類型
當建立一個表時,需要為表的各個列指定資料類型,Oracle的資料類型主要有5種,字元類型、數實值型別、日期時間類型、LOB類型和偽列。
一、字元類型
1、CHAR類型
定長字串,長度為1~2000位元組,如果定義時未指定大小,預設為1,使用時,若儲存的值大小小於指定的長度,則用空格填充剩餘長度,
若大於指定長度,則報錯。樣本:CHAR(20),若此時儲存一個長度為10的字串,則還是佔用20個位元組的空間。(此外,還可以用
CHAR(20CHAR)的方式進行定義,這種方式的意思是儲存多少個字元,而不是位元組)。
2、VARCHAR2類型
可變字串,長度為1~4000位元組,定義時需指定大小,使用時,若儲存的值大小小於指定的長度,則長度縮小為值的大小,若大於指定長度,
則報錯。(Oracle也有VARCHAR類型,但該類型有可能會被在未來的版本中被重新定義,所以不推薦使用)樣本:VARCHAR2(20),
若此時儲存一個長度為10的字串,則佔用10個位元組的空間。(也可以使用VARCHAR2(20CHAR)的方式定義,意思同CHAR類型)。
3、NCHAR類型
儲存Unicode字元的定長字串,既儲存雙位元組字元類型資料,每個字元佔用2個位元組,其他特性與CHAR類型相似。樣本:NCHAR(20),
若此時儲存一個長度為10的字串,則佔用40個位元組的空間。
4、NVARCHAR2類型
儲存Unicode字元的可變字串,其他特性與VARCHAR2類型相似。樣本:NVARCHAR2(20),若此時儲存一個長度為10的字串,
則佔用20個位元組的空間。
二、數實值型別
1、NUMBER類型
NUMBER類型可以儲存正數、負數、0、定點數和浮點數。格式為NUMBER(P,S),其中P為精度,表示數值的有效位元(從左邊第一個不為0
的數字算起,不包括小數點和負號為有效位元),在1~38之間。S為範圍,表示小數點右邊數位位元,在-84~127之間。使用規則:
將值精確到小數點右邊S位並四捨五入,判斷有效位元是否<=P。以下結合幾個樣本進行說明:
(1)、NUMBER(3):當要儲存的值是100時,精確到小數點右邊0位並四捨五入後值為100,有效位元為3,可以儲存。當值是3.563時,
精確到小數點右邊0位並四捨五入後值為4,有效位元為1,可以儲存。當值是2350.5時,精確到小數點右邊0位並四捨五入後值為2351,
有效位元為4,不可以儲存。
(2)、NUMBER(3,2):當要儲存的值是100時,精確到小數點右邊2位並四捨五入後值為100.00,有效位元為5,不可以儲存。當值是3.563時,
精確到小數點右邊2位並四捨五入後值為3.56,有效位元為3,可以儲存。當值是2350.5時,精確到小數點右邊2位並四捨五入後
值為2350.50,有效位元為6,不可以儲存。
(3)、NUMBER(3,-2):當S為負數時,較為特殊,會將值左邊|S|(|S|為S的絕對值)位的值進行四捨五入後取0且不計入有效位元,
如:當要儲存的值是100時,實際值為100,有效位元為1,可以儲存。當值是3.5時,實際值為0,有效位元為1,可以儲存。
當值是2350.5時,實際值為2400,有效位元為2,可以儲存。
2、INTEGER類型
是NUMBER的子類型,等同於NUMBER(38,0),用於儲存整數。
3、FLOAT類型
是NUMBER的子類型,格式為FLOAT(n),n在1~126之間,這個值是二進位的精度,最大值126轉換為十進位大概為38。
三、日期時間類型
1、DATE類型
儲存日期和時間的類型,使用7個位元組的固定長度,儲存世紀、年、月、日、時、分、秒,最小時間為公元前4712年1月1日,最大時間為
公元9999年12月31日。可以使用SYSDATE函數擷取目前時間的DATE類型。
2、TIMESTAMP類型
儲存日期和時間的類型,使用7到12位元組長度,秒數精確到小數秒(不指定精度的情況下為小數點後6位,指定精度可以達到9位),
且包含時區資訊。可以使用SYSTIMESTAMP函數擷取目前時間的TIMESTAMP類型。
四、LOB類型
1、CLOB類型
儲存大量字元資料,可以儲存單位元組字元資料和多位元組字元資料,主要用於儲存非結構化XML文檔。
2、BLOB類型
儲存二進位對象,片、視頻和音樂。
3、BFILE類型
儲存一個定位器,該定位器指向一個伺服器檔案系統的二進位檔案,最大為4G。
4、NCLOB類型
與CLON類似,不過NCLON可同時支援固定寬度字元集和可變寬度字元集,最大為4G。
操作LOB類型資料可以使用PL/SQL提供的DBMS_LOB程式包來完成,使用LOB類型要合理分配好資料表空間,否則會對效能造成影響。
五、偽列
偽列的定義:類似於表中的列,但並未實際儲存在表中,無法對偽列進行增刪改。
1、ROWID
表中的每一行都有一個地址,可以唯一的標識資料庫中的一行,ROWID可以返回這個地址,可以用來作為查詢條件查詢唯一行,提高查詢效率,
還可以查看行在表中是如何儲存的。
2、ROWNUM
ROWNUM偽列可以為查詢結果從1開始進行排序,可以用來限制返回行數,Oracle的分頁就是使用ROWNUM實現的。需注意,使用ROWNUM
必須包含1,否則無法查出資料,也就是說,ROWNUM=1可以查詢出結果集中第一行的資料,但ROWNUM=2是無法查詢任何資料的,
還有ROWNUM>2也是無法查詢出任何資料的,但使用ROWNUM<2就可以查詢出兩條資料,這是因為ROWNUM是一個從1開始的偽列,
Oracle認為ROWNUM>n(n為大於1的自然數)的條件不成立,所有無法查出資料。
(關於偽列的更多資料可以查看官方文檔:http://docs.oracle.com/cd/E11882_01/server.112/e41084/pseudocolumns.htm#SQLRF0025)
Oracle第二章——Oracle資料類型