ORACLE基本數據類型(亦叫內置數據類型 built-in datatypes)能夠按類型分爲:字符串類型、數字類型、日期類型、LOB類型、LONG RAW& RAW類型、ROWID & UROWID類型。正則表達式
在講敘字符串類型前,先要講一下編碼。字符串類型的數據可依編碼方式分紅數據庫字符集(CHAR/VARCHAR2/CLOB/LONG)和國際字符集(NCHAR/NVARCHAR2/NCLOB)兩種。數據庫中的字符串數據都經過字符集將字符轉換爲數字後(二進制),才存儲到數據塊中。經過不一樣的編碼集轉換,即使是相同的字符,也可能會轉換成不一樣的二進制編碼。這也是產生亂碼的緣由。數據庫的編碼格式通常是在建立數據庫時指定的。固然也能夠修改數據庫的編碼。數據庫
查看數據庫視圖所包含的數據類型:SELECT * FROM DBA_TYPES WHERE OWNER IS NULL.具體細節狀況參見Oracle® Database SQL Language Quick Reference 10/11g 或官方文檔express
一 字符串類型oracle
字符串數據類型還能夠依據存儲空間分爲固定長度類型(CHAR/NCHAR) 和可變長度類型(VARCHAR2/NVARCHAR2)兩種.app
所謂固定長度:是指雖然輸入的字段值小於該字段的限制長度,可是實際存儲數據時,會先自動向右補足空格後,纔將字段值的內容存儲到數據塊中。這種方式雖然比較浪費空間,可是存儲效率較可變長度類型要好。同時還能減小數據行遷移狀況發生。函數
所謂可變長度:是指當輸入的字段值小於該字段的限制長度時,直接將字段值的內容存儲到數據塊中,而不會補上空白,這樣能夠節省數據塊空間。 ui
1.1:CHAR類型 CHAR(size [BYTE | CHAR])編碼
CHAR類型,定長字符串,會用空格填充來達到其最大長度。非NULL的CHAR(12)老是包含12字節信息。CHAR字段最多能夠存儲2,000字節的信息。若是建立表時,不指定CHAR長度,則默認爲1。另外你能夠指定它存儲字節或字符,例如 CHAR(12 BYTYE) CHAR(12 CHAR).通常來講默認是存儲字節,你能夠查看數據庫參數spa
NLS_LENGTH_SEMANTICS的值。rest
注意:數據庫的NLS_CHARACTERSET 爲AL32UTF8,即一個漢字佔用三到四個字節。若是NLS_CHARACTERSET爲ZHS16GBK,則一個字符佔用兩個字節。
若是串的長度小於或等於250(0x01~0xFA), Oracle 會使用1 個字節來表示長度。對於全部長度超過250 的串,都會在一個標誌字節0xFE 後跟有兩個字節來表示長度。所以,若是有一個包含「Hello World」的VARCHAR2(80),則在塊中可能如圖12.-1 所示
1.2: NCHAR類型
這是一個包含UNICODE格式數據的定長字符串。NCHAR字段最多能夠存儲2,000字節的信息。它的最大長度取決於國家字符集。另外查詢時,若是字段是NCHAR類型,則須要以下書寫
SELECT translated_description FROM product_descriptions
WHERE translated_name = N'LCD Monitor 11/PM';
1.3 VARCHAR類型
不要使用VARCHAR數據類型。使用VARCHAR2數據類型。雖然VARCHAR數據類型目前是VARCHAR2的同義詞,VARCHAR數據類型將計劃被從新定義爲一個單獨的數據類型用於可變長度的字符串相比,具備不一樣的比較語義。
1.4: VARCHAR2類型
變長字符串,與CHAR類型不一樣,它不會使用空格填充至最大長度。VARCHAR2最多能夠存儲4,000字節的信息。
1.5: NVARCHAR2類型
這是一個包含UNICODE格式數據的變長字符串。 NVARCHAR2最多能夠存儲4,000字節的信息。
二. 數字類型
2.1 NUMBER類型
NUMBER(P,S)是最多見的數字類型,能夠存放數據範圍爲10^130~10^126(不包含此值),須要1~22字節(BYTE)不等的存儲空間。
P 是Precison的英文縮寫,即精度縮寫,表示有效數字的位數,最多不能超過38個有效數字
S是Scale的英文縮寫,可使用的範圍爲-84~127。Scale爲正數時,表示從小數點到最低有效數字的位數,它爲負數時,表示從最大有效數字到小數點的位數
下面是官方文檔的示例
Actual Data |
Specified As |
Stored As |
123.89 |
NUMBER |
123.89 |
123.89 |
NUMBER(3) |
124 |
123.89 |
NUMBER(6,2) |
123.89 |
123.89 |
NUMBER(6,1) |
123.9 |
123.89 |
NUMBER(3) |
124 |
123.89 |
NUMBER(4,2) |
exceeds precision |
123.89 |
NUMBER(6,-2) |
100 |
.01234 |
NUMBER(4,5) |
.01234 |
.00012 |
NUMBER(4,5) |
.00012 |
.000127 |
NUMBER(4,5) |
.00013 |
.0000012 |
NUMBER(2,7) |
.0000012 |
.00000123 |
NUMBER(2,7) |
.0000012 |
1.2e-4 |
NUMBER(2,5) |
0.00012 |
1.2e-5 |
NUMBER(2,5) |
0.00001 |
2.2 INTEGER類型
INTEGER是NUMBER的子類型,它等同於NUMBER(38,0),用來存儲整數。若插入、更新的數值有小數,則會被四捨五入。
例如:
CREATE TABLE TEST
(
ID INTEGER
)
查看錶TEST的DDL定義以下所示
CREATE TABLE "SYS"."TEST"
( "ID" NUMBER(*,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SYSTEM" ;
INSERT INTO TEST
SELECT 12.34 FROM DUAL;
INSERT INTO TEST
SELECT 12.56 FROM DUAL;
SQL> SELECT * FROM TEST;
ID
----------
12
13
2.3 浮點數
浮點數能夠有一個十進制數點任何地方從第一個到最後一個數字,或者能夠在全部有沒有小數點。指數可能(可選) 用於如下數量增長的範圍 (例如, 1.777e-20)。刻度值不適用於浮點數字,由於能夠顯示在小數點後的位數的數量不受限制。
二進制浮點數不一樣數量的值由 Oracle 數據庫內部存儲的方式。使用小數精度數存儲值。徹底相同號碼存儲範圍和數量由支持的精度內的全部文本。正是由於使用小數精度(數字 0 到 9) 表示文本存儲文本。使用二進制精度 (數字 0 和 1) 存儲二進制浮點數。這種存儲方案不能表明全部確切地使用小數精度的值。頻繁地,將值從十進制轉換爲二進制的精度時出現的錯誤時撤消值回從二進制轉換爲十進制精度。在字面 0.1 是一個這樣的例子。
Oracle 數據庫提供了專爲浮點數的兩種數值數據類型:
BINARY_FLOAT
BINARY_FLOAT 是 32 位、 單精度浮點數字數據類型。能夠支持至少6位精度,每一個 BINARY_FLOAT 的值須要 5 個字節,包括長度字節。
BINARY_DOUBLE
BINARY_DOUBLE 是爲 64 位,雙精度浮點數字數據類型。每一個 BINARY_DOUBLE 的值須要 9 個字節,包括長度字節。
在數字的列中,浮點數有小數精度。在 BINARY_FLOAT 或 BINARY_DOUBLE 的列中,浮點數有二進制的精度。二進制浮點數支持的特殊值無窮大和 NaN (不是數字)。
您能夠指定列在表 2-4 範圍內的浮點數。"數字文本"中定義了用於指定浮點數的格式。
Table 2-3 Floating Point Number Limits
Value |
Binary-Float |
Binary-Double |
Maximum positive finite value |
3.40282E+38F |
1.79769313486231E+308 |
Minimum positive finite value |
1.17549E-38F |
2.22507485850720E-308 |
2.5 FLOAT類型
FLOAT類型也是NUMBER的子類型。
Float(n),數 n 指示位的精度,能夠存儲的值的數目。N 值的範圍能夠從 1 到 126。若要從二進制轉換爲十進制的精度,請將 n 乘以 0.30103。要從十進制轉換爲二進制的精度,請用 3.32193 乘小數精度。126 位二進制精度的最大值是大約至關於 38 位小數精度。
三. 日期類型
日期類型用於存儲日期數據,可是並非使用通常的格式(2012-08-08)直接存儲到數據庫的。
3.1 DATE類型
DATE是最經常使用的數據類型,日期數據類型存儲日期和時間信息。雖然能夠用字符或數字類型表示日期和時間信息,可是日期數據類型具備特殊關聯的屬性。爲每一個日期值,Oracle 存儲如下信息: 世紀、 年、 月、 日期、 小時、 分鐘和秒。通常佔用7個字節的存儲空間。
3.2 TIMESTAMP類型
這是一個7字節或12字節的定寬日期/時間數據類型。它與DATE數據類型不一樣,由於TIMESTAMP能夠包含小數秒,帶小數秒的TIMESTAMP在小數點右邊最多能夠保留9位
3.3 TIMESTAMP WITH TIME ZONE類型
這是TIMESTAMP類型的變種,它包含了時區偏移量的值
3.4 TIMESTAMP WITH LOCAL TIME ZONE類型
3.5 INTERVAL YEAR TO MOTH
3.6 INTERVAL DAY TO SECOND
四. LOB類型
內置的LOB數據類型包括BLOB、CLOB、NCLOB、BFILE(外部存儲)的大型化和非結構化數據,如文本、圖像、視屏、空間數據存儲。BLOB、CLOB、NCLOB類型
4.1 CLOB 數據類型
它存儲單字節和多字節字符數據。支持固定寬度和可變寬度的字符集。CLOB對象能夠存儲最多 (4 gigabytes-1) * (database block size) 大小的字符
4.2 NCLOB 數據類型
它存儲UNICODE類型的數據,支持固定寬度和可變寬度的字符集,NCLOB對象能夠存儲最多(4 gigabytes-1) * (database block size)大小的文本數據。
4.3 BLOB 數據類型
它存儲非結構化的二進制數據大對象,它能夠被認爲是沒有字符集語義的比特流,通常是圖像、聲音、視頻等文件。BLOB對象最多存儲(4 gigabytes-1) * (database block size)的二進制數據。
4.4 BFILE 數據類型
二進制文件,存儲在數據庫外的系統文件,只讀的,數據庫會將該文件當二進制文件處理
五. RAW & LONG RAW類型
5.1 LONG類型
它存儲變長字符串,最多達2G的字符數據(2GB是指2千兆字節, 而不是2千兆字符),與VARCHAR2 或CHAR 類型同樣,存儲在LONG 類型中的文本要進行字符集轉換。ORACLE建議開發中使用CLOB替代LONG類型。支持LONG 列只是爲了保證向後兼容性。CLOB類型比LONG類型的限制要少得多。 LONG類型的限制以下:
1.一個表中只有一列能夠爲LONG型。(Why?有些不明白)
2.LONG列不能定義爲主鍵或惟一約束,
3.不能創建索引
4.LONG數據不能指定正則表達式。
5.函數或存儲過程不能接受LONG數據類型的參數。
6.LONG列不能出如今WHERE子句或完整性約束(除了可能會出現NULL和NOT NULL約束)
官方文檔描敘以下:
The use of LONG values is subject to these restrictions:
A table can contain only one LONG column.
You cannot create an object type with a LONG attribute.
LONG columns cannot appear in WHERE clauses or in integrity constraints (except that they can appear in NULL and NOT NULL constraints).
LONG columns cannot be indexed.
LONG data cannot be specified in regular expressions.
A stored function cannot return a LONG value.
You can declare a variable or argument of a PL/SQL program unit using the LONG datatype. However, you cannot then call the program unit from SQL.
Within a single SQL statement, all LONG columns, updated tables, and locked tables must be located on the same database.
LONG and LONG RAW columns cannot be used in distributed SQL statements and cannot be replicated.
If a table has both LONG and LOB columns, then you cannot bind more than 4000 bytes of data to both the LONG and LOB columns in the same SQL statement. However, you can bind more than 4000 bytes of data to either the LONG or the LOB column.
In addition, LONG columns cannot appear in these parts of SQL statements:
GROUP BY clauses, ORDER BY clauses, or CONNECT BY clauses or with the DISTINCT operator in SELECT statements
The UNIQUE operator of a SELECT statement
The column list of a CREATE CLUSTER statement
The CLUSTER clause of a CREATE MATERIALIZED VIEW statement
SQL built-in functions, expressions, or conditions
SELECT lists of queries containing GROUP BY clauses
SELECT lists of subqueries or queries combined by the UNION, INTERSECT, or MINUS set operators
SELECT lists of CREATE TABLE ... AS SELECT statements
ALTER TABLE ... MOVE statements
SELECT lists in subqueries in INSERT statements
5.2 LONG RAW 類型,能存儲2GB 的原始二進制數據(不用進行字符集轉換的數據)
5.3 RAW類型
用於存儲二進制或字符類型數據,變長二進制數據類型,這說明採用這種數據類型存儲的數據不會發生字符集轉換。這種類型最多能夠存儲2,000字節的信息
六. ROWID & UROWID類型
在數據庫中的每一行都有一個地址。然而,一些錶行的地址不是物理或永久的,或者不是ORACLE數據庫生成的。
例如,索引組織錶行地址存儲在索引的葉子,能夠移動。
例如,外部表的ROWID(如經過網關訪問DB2表)不是標準的ORACLE的rowid。
ORACLE使用通用的ROWID(UROWIDs)的存儲地址的索引組織表和外表。索引組織表有邏輯urowids的,和國外表的外urowids,。UROWID這兩種類型的存儲在ROWID僞(堆組織的表的物理行id)。
建立基於邏輯的rowid在表中的主鍵。邏輯的rowid不會改變,只要主鍵不改變。索引組織表的ROWID僞UROWID數據類型。你能夠訪問這個僞列,你會堆組織表的ROWID僞(即便用一個SELECT ...ROWID語句)。若是你想存儲的rowid索引組織表,那麼你就能夠定義一列的表型UROWID到列檢索值的ROWID僞。