Oracle中2000個byte,並不是2000個字符的意思,1個字符在Oracle中可能是1個byte到4個byte不等,需看數據庫字符集的設置了。
對GBK字符集而言,ASCII碼中128個字符使用1個字節進行存儲,其它字符使用雙字節存儲;對UTF8字符集而言,ASCII碼中128個字符使用1個字節進行存儲,其它采用兩個或三個字節進行存儲,四個字節存儲的是極少使用字符;
數據庫中有一個參數NLS_LENGTH_SEMANTICS,這個參數有兩個取值CHAR和BYTE。當為CHAR時字符類型的長度是按字符個數來計算,而不是按BYTE來計算,這在使用變長字符集(AL32UTF8)的情況下非常有用,因為一個字符所占用的字節數是不定的,就給我們准確估計字段長度(BYTE)帶來不便。
1、CHAR。
CHAR存儲定長數據很方便,CHAR字段上的索引效率級高,比如定義char(10),那么不論你存儲的數據是否達到了10個字節,都要占去10個字節的空間,不足的自動用空格填充。
2、VARCHAR
VARCHAR存儲變長數據,但存儲效率沒有CHAR高。如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。為什么“+1”呢?這一個字節用於保存實際使用了多大的長度。從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際情況找到權衡點。
3、TEXT
TEXT存儲可變長度的非Unicode數據,最大長度為2^31-1(2,147,483,647)個字符。
4、NCHAR、NVARCHAR、NTEXT
這三種從名字上看比前面三種多了個“N”。它表示存儲的是Unicode數據類型的字符。我們知道字符中,英文字符只需要一個字節存儲就足夠了,但漢字眾多,需要兩個字節存儲,英文與漢字同時存在時容易造成混亂,Unicode字符集就是為了解決字符集這種不兼容的問題而產生的,它所有的字符都用兩個字節表示,即英文字符也是用兩個字節表示。
5、字符集與國家字符集
1>字符集
(1)用來存儲CHAR, VARCHAR2, CLOB, LONG等類型數據
(2)用來標示諸如表名、列名以及PL/SQL變量等
(3)用來存儲SQL和PL/SQL程序單元等
2>國家字符集
(1)用以存儲NCHAR, NVARCHAR2, NCLOB等類型數據
(2)國家字符集實質上是為oracle選擇的附加字符集,主要作用是為了增強oracle的字 符處理能力,因為NCHAR數據類型可以提供對亞洲使用定長多字節編碼的支持,而數據 庫字符集則不能。國家字符集在oracle9i中進行了重新定義,只能在unicode編碼中的 AF16UTF16和UTF8中選擇,默認值是AF16UTF16
字段類型 | 中文說明 | 限制條件 | 其它說明 |
CHAR | 固定長度字符串 | 最大長度2000bytes | |
VARCHAR2 | 可變長度的字符串 | 最大長度4000bytes | 可做索引的最大長度749 |
NCHAR | 根據字符集而定的固定長度字符串 | 最大長度2000bytes | |
NVARCHAR2 | 根據字符集而定的可變長度字符串 | 最大長度4000bytes | |
DATE | 日期(日-月-年) | DD-MM-YY(HH-MI-SS) | 經過嚴格測試,無千蟲問題 |
LONG | 超長字符串 | 最大長度2G(231-1) | 足夠存儲大部頭著作 |
RAW | 固定長度的二進制數據 | 最大長度2000bytes | 可存放多媒體圖象聲音等 |
LONG RAW | 可變長度的二進制數據 | 最大長度2G | 同上 |
BLOB | 二進制數據 | 最大長度4G | |
CLOB | 字符數據 | 最大長度4G | |
NCLOB | 根據字符集而定的字符數據 | 最大長度4G | |
BFILE | 存放在數據庫外的二進制數據 | 最大長度4G | |
ROWID | 數據表中記錄的唯一行號 | 10bytes | ********.****.****格式,*為0或1 |
NROWID | 二進制數據表中記錄的唯一行號 | 最大長度4000bytes | |
NUMBER(P S) | 數字類型 | P為整數位,S為小數位 | |
DECIMAL(P S) | 數字類型 | P為整數位,S為小數位 | |
INTEGER | 整數類型 | 小的整數 | |
FLOAT | 浮點數類型 | NUMBER(38),雙精度 | |
REAL | 實數類型 | NUMBER(63),精度更高 |