簡介
目前Oracle 數據庫大概有26個字段類型,大體分為六類,分別是字符串類型、數字數據類型、日期時間數據類型、大型對象(LOB)數據類型、RAW和LONG RAW數據類型、ROWID和UROWID數據類型。當然Oracle還提供用戶自定義的數據類型,但這里不做討論。
字符串類型
CHAR
CHAR數據類型存儲固定長度的字符值。一個CHAR數據類型可以包括1到2000個字符。如果對CHAR沒有明確地說明長度,它的默認長度則設置為1。 如果對某個CHAR類型變量賦值,其長度小於規定的長度,那么Oracle自動用空格填充。
注意:如果給了一個比固定長度更長的值,其尾部帶有空格,則空格會被刪除到固定的長度。如果值太大Oracle會返回一個錯誤。
VARCHAR
用於保存可變長的字符串數據。其中最大字節長度由(size)指定。每行長度可變,最大長度為每行4000字節。設置長度(size)前需考慮字符集為單字節或多字節。
注意:VARCHAR是被廢棄的類型,Oracle目前都推薦使用VARCHAR2。雖然VARCHAR也可以用,但不確保未來的版本是否還支持。
VARCHAR2
用於保存可變長的字符串數據。其中最大字節長度由(size)指定。每行長度可變,最大長度為每行4000字節。設置長度(size)前需考慮字符集為單字節或多字節。由於VARCHAR2數據類型只存儲為該列所賦的字符(不加空格),所以VARCHAR2需要的存儲空間比CHAR數據類型要小。
和VARCHAR的區別:
VARCHAR2把所有字符都占兩字節處理(一般情況下),VARCHAR只對漢字和全角等字符占兩字節。數字、英文字符等都是一個字節;
VARCHAR2把空串等同於null處理,而varchar仍按照空串處理;
大部分情況下建議使用VARCHAR2類型,可以保證更好的兼容性。
NCHAR
Unicode數據類型,根據字符集而定的固定長度字符串,最大長度2000bytes。
NCHAR2
Unicode數據類型,根據字符集而定的可變長度字符串,最大長度4000bytes。
LONG
可變長字符列,最大長度限制為2GB,用於不需要作字符串搜索的長串數據。
注意:此類型是一個遺留下來的而且將來不會被支持的數據類型,逐漸被BLOB,CLOB,NCLOB等大的數據類型所取代。
數字類型
NUMBER
NUMBER數據類型精度可以高達38位,它有兩個限定符,如:column NUMBER(precision,scale)。precision表示數字中的有效位。如果沒有指定precision的話,Oracle將使用38作為精度。scale表示小數點右邊的位數,scale默認設置為0。如果把scale設成負數,Oracle將把該數字取舍到小數點左邊的指定位數。
DECIMAL
Oracle只是在語法上支持DECIMAL類型,但是在底層實際上它就是NUMBER類型,支持DECIMAL類型是為了能把數據從Oracle數據庫移到其他數據庫中。
FLOAT
FLOAT類型也是NUMBER的子類型。其格式FLOAT(N),數 N 指示位的精度,可以存儲的值的數目。N 值的范圍可以從 1 到 126。若要從二進制轉換為十進制的精度,請將N乘以 0.30103。要從十進制轉換為二進制的精度,請用 3.32193 乘小數精度。126 位二進制精度的最大值是大約相當於 38 位小數精度。
BINARY_FLOAT
BINARY_FLOAT 是一種 32 位,單精度浮點數字數據類型。每個 BINARY_FLOAT 值需要 5 字節存儲空間,其中 1 字節用於存儲數據值的長度。支持 NUMBER 數據類型所提供的基本功能。但采用二進制精度,而NUMBER 采用十進制精度。因此能夠提供更快的數學運算速度,且能減少占用的存儲空間。
BINARY_DOUBLE
BINARY_DOUBLE 是一種 64 位,雙精度浮點數字數據類型。每個 BINARY_DOUBLE 值需要9 字節存儲空間,其中 1 字節用於存儲數據值的長度。支持 NUMBER 數據類型所提供的基本功能。但采用二進制精度,而NUMBER 采用十進制精度。因此能夠提供更快的數學運算速度,且能減少占用的存儲空間。
日期類型
DATE
ORACLE最常用的日期類型,它可以保存日期和時間,常用日期處理都可以采用這種類型。DATE表示的日期范圍可以是公元前4712年1月1日至公元9999年12月31日。DATE類型在數據庫中的存儲固定為7個字節, 第1字節:世紀+100、 第2字節:年、第3字節:月、第4字節:天、第5字節:小時+1、第6字節:分+1、第7字節:秒+1。
TIMESTAMP
ORACLE常用的日期類型,它與DATE的區別是不僅可以保存日期和時間,還能保存小數秒,小數位數可以指定為0-9,默認為6位,所以最高精度可以到ns(納秒),數據庫內部用7或者11個字節存儲,如果精度為0,則用7字節存儲,與DATE類型功能相同,如果精度大於0則用11字節存儲。第1字節:世紀+100、第2字節:年、第3字節:月、第4字節:天、 第5字節:小時+1、第6字節:分+1、第7字節:秒+1、 第8-11字節:納秒,采用4個字節存儲,內部運算類型為整形。
注意:TIMESTAMP日期類型如果與數值進行加減運算會自動轉換為DATE型,也就是說小數秒會自動去除。
TIMESTAMP WITH TIME ZONE
對TIMESTAMP進行了擴展,用於存儲時區、時間戳以及時區位移值,其中fractional_seconds_precision是數字在第二日期時間字段的小數部分數字的所有值。可接受的值是0到9,默認是6。默認格式是確定明確的NLS_DATE_FORMAT參數或隱式的NLS_TERRITORY參數。大小固定為13字節。此數據類型包含日期時間字段YEAR,MONTH,日,小時,分鍾,秒,TIMEZONE_HOUR和TIMEZONE_MINUTE。它有一個明確的分數秒和時區。
TIMESTAMP WITH LOCAL TIME ZONE
所有的TIMESTAMP WITH TIME ZONE值,但下列情況除外:數據標准化數據庫的時區時,存儲在數據庫中。當數據被檢索,用戶可以看到在會話時區中的數據。默認格式是確定明確的NLS_DATE_FORMAT參數或隱式的NLS_TERRITORY參數。
INTERVAL YEAR TO MONTH
存儲期間年數和月的時間,其中year_precision是數字的年份日期時間字段的數量。可接受的值是0到9。默認是2。大小固定為5個字節。
INTERVAL DAY TO SECOND
其格式為:INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)],是存儲一段時間以天,小時,分鍾和秒,其中day_precision是數字在DAY日期時間字段的最大數量。可接受的值是0到9。默認是2。fractional_seconds_precision是數字中的第二個字段的小數部分的數量。可接受的值是0到9。默認是6。大小固定為11個字節。
INTERVAL YEAR TO MONTH
Oracle語法:INTERVAL YEAR [(year_precision )] TO MONTH,用來表示一段時間差,只精確到年和月。year_precision是數字年的時間段,接受的值為0到9。默認值是2。大小固定為5個字節。
大對象(LOB)類型
CLOB
最大4G,存儲單字節字符型數據。適用於存儲超長文本。
NCLOB
最大4G,存儲多字節國家字符型數據。適用於存儲超長文本。
BLOB
最大4G,存儲二進制數據。適用於存儲圖像、視頻、音頻等。
BFILE
最大長度是4GB,在數據庫外部保存的大型二進制對象文件,最大長度是4GB。這種外部的LOB類型,通過數據庫記錄變化情況,但是數據的具體保存是在數據庫外部進行的。 Oracle 可以讀取、查詢BFILE,但是不能寫入,不參與事務。
RAW和LONG RAW類型
RAW
RAW(n)格式,其中n=1 to 2000,可變長二進制數據,在具體定義字段的時候必須指明最大長度n,Oracle 用這種格式來保存較小的圖形文件或帶格式的文本文件,如Miceosoft Word文檔。RAW是一種較老的數據類型,將來會逐漸被BLOB、CLOB、NCLOB等大的對象數據類型所取代。
LONG RAW
最大長度是2GB。可變長二進制數據,最大長度是2GB。Oracle 用這種格式來保存較大的圖形文件或帶格式的文本文件,如Miceosoft Word文檔,以及音頻、視頻等非文本文件。在同一張表中不能同時有LONG類型和LONG RAW類型,LONG RAW也是一種較老的數據類型,將來會逐漸被BLOB、CLOB、NCLOB等大的對象數據類型所取代。
ROWID和UROWID類型
ROWID
ROWID為該表行的唯一標識,是一個偽列,可以用在SELECT中,但不可以用INSERT,UPDATE來修改該值。ROWID列,Oracle使用ROWID列來建立內部索引。你可以引用ROWID的值,但ROWID並不存放在數據庫中,你可以創建一個表包含ROWID數據類型。但Oracle不保證該值是合法的rowids。用戶必須確保該ROWID值是真實合法的。
UROWID
UROWID支持邏輯和物理的rowids,列UROWID類型可以存儲各種rowids,從8.1以后的Oracle才有UROWID類型,它也可以用來保存以前的ROWID類型數據信息。
特殊類型
XMLTYPE
XMLTYPE是Oracle從9i開始特有的數據類型,是一個繼承了BLOB的強大存在,可以用來存儲xml並提供了相當多的操作函數,用來直接讀取xml文檔和管理節點。理論上可以保存2G大小的數據。作為XML數據的特殊存儲類型,XMLTYPE提供了適合的保存、檢索和操作的支持。
XMLINDEX
XMLINDEX 索引可用於 SQL/XML 函數 XMLExists()、XMLTable() 和 XMLQuery(),而且它在查詢的任何部分都有效;它並不限於用在 WHERE 子句中。而您可能用於 XML 數據的其他任何索引都無法做到這一點。XMLINDEX 因此可提高對 SELECT 列表數據和 FROM 列表數據的訪問速度,對 XML 片段提取尤為有用。基於函數的索引和 CTXXPath 索引。您無需預先了解將在查詢中使用的XPath 表達式。XMLINDEX 完全是通用的,而基於函數的索引則不同。可將 XMLINDEX 索引用於基於 XML 模式或非基於模式的數據。它可用於二進制 XML 和非結構化存儲模型。B 樹索引僅適用於以對象關系方式存儲(結構化存儲)的基於模式的數據;它對於存儲在二進制XML 或CLOB 實例中的基於 XML 模式的數據效率低下。可使用 XMLINDEX 索引通過 XPath 表達式進行搜索,這些表達式的目標是集合(即文檔中出現多次的節點)。而函數索引則不然。