Oracle基本數據類型總結

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 或官方文檔

 

 

一 字符串類型

    字符串數據類型還可以依據存儲空間分爲固定長度類型(CHAR/NCHAR) 和可變長度類型(VARCHAR2/NVARCHAR2)兩種.

    所謂固定長度:是指雖然輸入的字段值小於該字段的限制長度,但是實際存儲數據時,會先自動向右補足空格後,纔將字段值的內容存儲到數據塊中。這種方式雖然比較浪費空間,但是存儲效率較可變長度類型要好。同時還能減少數據行遷移情況發生。

所謂可變長度:是指當輸入的字段值小於該字段的限制長度時,直接將字段值的內容存儲到數據塊中,而不會補上空白,這樣可以節省數據塊空間。

1.1:CHAR類型 CHAR(size [BYTE | CHAR])

CHAR類型,定長字符串,會用空格填充來達到其最大長度。非NULL的CHAR(12)總是包含12字節信息。CHAR字段最多可以存儲2,000字節的信息。如果創建表時,不指定CHAR長度,則默認爲1。另外你可以指定它存儲字節或字符,例如 CHAR(12 BYTYE) CHAR(12 CHAR).一般來說默認是存儲字節,你可以查看數據庫參數

NLS_LENGTH_SEMANTICS的值。

SQL Code

  1. SQL> show parameter nls_length_semantics;
  2.  
  3. NAME                   TYPE           VALUE
  4. ------------------   ----------- -----------------
  5.  
  6. nls_length_semantics   string          BYTE
  7.  
  8. eg:
  9.  
  10. CREATE TABLE TEST
  11.  
  12. (
  13.  
  14. NAME_OLD CHAR(10),
  15.  
  16. NAME_NEW CHAR(10 CHAR)
  17.  
  18. )
  19.  
  20. INSERT INTO TEST
  21.  
  22. ( NAME_OLD, NAME_NEW)
  23.  
  24. SELECT 'ABCDEFGHIJ' , '你清除字節與字符' FROM DUAL;
  25.  
  26. COMMIT;
  27.  
  28. INSERT INTO TEST
  29.  
  30. ( NAME_OLD, NAME_NEW)
  31.  
  32. SELECT '你清除字節與字符' , 'ABCDEFGHIJ' FROM DUAL;
  33.  
  34. ORA-12899: 列 "SYS"."TEST"."NAME_OLD" 的值太大 (實際值: 24, 最大值: 10) 

注意:數據庫的NLS_CHARACTERSET 爲AL32UTF8,即一個漢字佔用三到四個字節。如果NLS_CHARACTERSET爲ZHS16GBK,則一個字符佔用兩個字節。

如果串的長度小於或等於250(0x01~0xFA), Oracle 會使用1 個字節來表示長度。對於所有長度超過250 的串,都會在一個標誌字節0xFE 後跟有兩個字節來表示長度。因此,如果有一個包含“Hello World”的VARCHAR2(80),則在塊中可能如圖12.-1 所示

clip_image002

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(如何查看創建表的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僞。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章