1. 程式人生 > >ORACLE基本資料型別總結

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. NAME                   TYPE           VALUE
  3. ------------------   ----------- -----------------
  4. nls_length_semantics   string          BYTE
  5. eg:
  6. CREATE TABLE TEST
  7. (
  8. NAME_OLD CHAR(10),
  9. NAME_NEW CHAR(10 CHAR)
  10. )
  11. INSERT INTO TEST
  12. ( NAME_OLD, NAME_NEW)
  13. SELECT 'ABCDEFGHIJ' , '你清除位元組與字元' FROM DUAL;
  14. COMMIT;
  15. INSERT INTO TEST
  16. ( NAME_OLD, NAME_NEW)
  17. SELECT '你清除位元組與字元' , 'ABCDEFGHIJ' FROM DUAL;
  18. 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定義如下所示

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偽。