時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)
概述
通過實(shí)例,全面而深入的分析oralce的基本數(shù)據(jù)類型及它們的存儲(chǔ)方式。以ORACLE 10G為基礎(chǔ),介紹oralce 10g引入的新的數(shù)據(jù)類型。讓你對oracle數(shù)據(jù)類型有一個(gè)全新的認(rèn)識。揭示一些不為人知的秘密和被忽略的盲點(diǎn)。從實(shí)用和優(yōu)化的角度出發(fā),討論每種數(shù)據(jù)類型的特點(diǎn)。從這里開始o(jì)racle之旅!
第一部份 字符類型
§1.1 char
定長字符串,會(huì)用空格來填充來達(dá)到其最大長度,最長2000個(gè)字節(jié)。
1. 新建一個(gè)測試表test_char.,只有一個(gè)char類型的列。長度為10
SQL> create table test_char(colA char(10));
Table created
2. 向這個(gè)表中插入一些數(shù)據(jù)。
SQL> insert into test_char values('a');
1 row inserted
SQL> insert into test_char values('aa');
1 row inserted
SQL> insert into test_char values('aaa');
1 row inserted
SQL> insert into test_char values('aaaa');
1 row inserted
SQL> insert into test_char values('aaaaaaaaaa');
1 row inserted
注意:最多只能插入10個(gè)字節(jié)。否是就報(bào)錯(cuò)。
SQL> insert into test_char values('aaaaaaaaaaa');
insert into test_char values('aaaaaaaaaaa')
ORA-12899: value too large for column "PUB_TEST"."TEST_CHAR"."COLA" (actual: 11, maximum: 10)
3. 使用dump函數(shù)可以查看每一行的內(nèi)部存數(shù)結(jié)構(gòu)。
SQL> select colA, dump(colA) from test_char;
COLA DUMP(COLA)
---------- --------------------------------------------------------------------------------
a??? Typ=96 Len=10: 97,32,32,32,32,32,32,32,32,32
aa?? Typ=96 Len=10: 97,97,32,32,32,32,32,32,32,32
aaa? Typ=96 Len=10: 97,97,97,32,32,32,32,32,32,32
aaaa Typ=96 Len=10: 97,97,97,97,32,32,32,32,32,32
aaaaaaaaaa Typ=96 Len=10: 97,97,97,97,97,97,97,97,97,97
注意:Typ=96 表示數(shù)據(jù)類型的ID。Oracle為每一種數(shù)據(jù)類型都進(jìn)行了編號。說明char類型的編號是96.
Len =10 表示所在的內(nèi)部存儲(chǔ)的長度(用字節(jié)表示)。雖然第一例只存了一個(gè)字符’a’,但是它還是占用了10個(gè)字節(jié)的空間。
97,32,32,32,32,32,32,32,32,32 表示內(nèi)部存儲(chǔ)方式??梢妎racle的內(nèi)部存儲(chǔ)是以數(shù)據(jù)庫字符集進(jìn)行存儲(chǔ)的。
97正好是字符a的ASCII碼。
可以使用chr函數(shù)把ASCII碼轉(zhuǎn)成字符。
SQL> select chr(97) from dual;
CHR(97)
-------
a
要想知道一個(gè)字符的ASCII碼,可以使用函數(shù)ascii
SQL> select ascii('a') from dual;
ASCII('A')
----------
97
32正好是空格的ascii碼值。
Char類型是定長類型。它總會(huì)以空格來填充以達(dá)到一個(gè)固定寬度。
使用char類型會(huì)浪費(fèi)存儲(chǔ)空間。
Oracle的數(shù)據(jù)類型的長度單位是字節(jié)。
SQL> select dump('漢') from dual;
DUMP('漢')
---------------------
Typ=96 Len=2: 186,186
可見一個(gè)漢字在oracle中是占用了兩個(gè)字節(jié)的。
英文字母或符號只占用一個(gè)字節(jié)。
Char(10)最多可存放5個(gè)漢字。
§1.2 varchar2
是一種變長的字符類型。最多可占用4000字節(jié)的存儲(chǔ)空間。
1. 創(chuàng)建一個(gè)表,只有一列,類型為varchar2,長度為10
SQL> create table test_varchar( col varchar2(10));
Table created
2. 插入一些數(shù)據(jù)
SQL> insert into test_varchar values('a');
1 row inserted
SQL> insert into test_varchar values('aa');
1 row inserted
SQL> insert into test_varchar values('aaa');
1 row inserted
SQL> insert into test_varchar values('aaaaaaaaaa');
1 row inserted
SQL> insert into test_varchar values('aaaaaaaaaaa');
2. 用dump函數(shù)查看每一行的內(nèi)部存儲(chǔ)結(jié)構(gòu)。
SQL> select col, dump(col) from test_varchar;
COL? DUMP(COL)
---------- --------------------------------------------------------------------------------
a??? Typ=1 Len=1: 97
aa?? Typ=1 Len=2: 97,97
aaa? Typ=1 Len=3: 97,97,97
aaaaaaaaaa Typ=1 Len=10: 97,97,97,97,97,97,97,97,97,97
Typ=1,說明varchar2類型在oracle中的類型編號為1
Len代表了每一行數(shù)據(jù)所占用的字節(jié)數(shù)。
后面是具體的存儲(chǔ)值。
由此可見,varchar2是存多少就占用多少空間。比較節(jié)省空間的。不會(huì)像char那樣用空格填充。
§1.3 byte 和char
在10g中,字符類型的寬度定義時(shí),可以指定單位。
Byte就是字節(jié)。
Char就是字符。
Varchar2(10 byte) 長度為10個(gè)字節(jié)。
Varchar2(10 char) 長度為10個(gè)字符所占的長度。
Char(10 byte)長度為10個(gè)字節(jié)。
Char(10 char) 長度為10個(gè)字符所占的長度。
一個(gè)字符占用多少個(gè)字節(jié),是由當(dāng)前系統(tǒng)采用的字符集來決定的。
#p#副標(biāo)題#e#
如一個(gè)漢字占用兩個(gè)字節(jié)。
查看當(dāng)前系統(tǒng)采用的字符集
SQL> select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';
PARAMETER??? VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_CHARACTERSET?? ZHS16GBK
如果在定義類型時(shí),不指定單位。默認(rèn)是按byte,即以字節(jié)為單位的。
采用char為單位的好處是,使用多字節(jié)的字符集。
比如,在ZHS16GBK字符集中,一個(gè)漢字占用兩個(gè)字節(jié)。
把數(shù)據(jù)表的某一列長度定義為可存放10個(gè)漢字,通過下面的定義就可以了。
Create table test_varchar(col_char varchar2(10 char));
這樣相對簡單一些。在數(shù)據(jù)庫表設(shè)計(jì)時(shí)需要注意。
繼續(xù)實(shí)驗(yàn),新建一個(gè)表,包含兩列。一列采用byte為單位,一列采用char為單位
SQL> create table test_varchar2 (col_char varchar2(10 char),col_byte varchar2(10 byte));
Table created
Col_char列,定義為可存放10個(gè)字符。
Col_byte 列,定義為可存放10個(gè)字節(jié)的字符。
當(dāng)前的系統(tǒng)采用字符集為ZHS16GBK.所以一個(gè)字符占兩個(gè)字節(jié)。
試著在表中插入一些數(shù)據(jù)
SQL> insert into test_varchar2 values('a','a');
1 row inserted
SQL> insert into test_varchar2 values('袁','a');
1 row inserted
SQL> insert into test_varchar2 values('袁袁袁袁袁袁袁袁袁袁','aaaaaaaaaa');
1 row inserted
SQL> insert into test_varchar2 values('袁袁袁袁袁袁袁袁袁袁','袁袁袁袁袁袁袁袁袁袁');
insert into test_varchar2 values('袁袁袁袁袁袁袁袁袁袁','袁袁袁袁袁袁袁袁袁袁')
ORA-12899: value too large for column "PUB_TEST"."TEST_VARCHAR2"."COL_BYTE" (actual: 20, maximum: 10)
第一次, 在兩列中都插入字符a
第二次, 在col_char列插入字符’袁’,在col_byte插入字符a
第三次, 在col_char列中插入10個(gè)中文字符’袁’,在col_byte插入10個(gè)字符a
第四次, 在兩列中都插入中文字符’袁’時(shí),報(bào)錯(cuò)了。第二列長度不夠。
再看看每一行的存儲(chǔ)結(jié)構(gòu)
SQL> select col_char, dump(col_char) from test_varchar2;
COL_CHAR DUMP(COL_CHAR)
-------------------- --------------------------------------------------------------------------------
a???
關(guān)鍵詞標(biāo)簽:Oracle,數(shù)據(jù)類型,存儲(chǔ)
相關(guān)閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法