Oracle基本數據類型存儲格式研究(一)—字符類型

1.char

char是定長字符型,內部代碼是:96,最多可以存儲2000個字節,其中在char字符變量中,字節長度無法滿足申請長度的則自動以空格變量補足,空格變量ASCII碼爲32;

2.varchar2

varchar2是變長字符型,內部代碼是:1,最多可以存儲4000個字符

實驗如下:

 

SYS@huiche> create table test_char (char_col char(10), varchar_col varchar2(10));

表已創建。

SYS@huiche>insert into test_char values ('abc','abc');

已創建 1 行。

SYS@huiche>insert into test_char values ('testchar12','testchar12');

已創建 1 行。

SYS@huiche>insert into test_char values ('中國','中國');

已創建 1 行。

SYS@huiche>commit;

提交完成。
SYS@huiche>select dbms_rowid.rowid_object(rowid) object_id, dbms_rowid.rowid_relative_fno(rowid) file_id,
  2  dbms_rowid.rowid_block_number(rowid) block_id ,dbms_rowid.rowid_row_number(rowid) num from test_char;

 OBJECT_ID    FILE_ID   BLOCK_ID        NUM
---------- ---------- ---------- ----------
     63183          1      86858          0
     63183          1      86858          1
     63183          1      86858          2

SYS@huiche>alter system dump datafile 1 block 86858;

系統已更改。

SYS@huiche>

 其中dump文件內容爲:

 

data_block_dump,data header at 0x524845c
===============
tsiz: 0x1fa0
hsiz: 0x18
pbl: 0x0524845c
bdba: 0x0041534a
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f60
avsp=0x1f48
tosp=0x1f48
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1f8e
0x14:pri[1] offs=0x1f75
0x16:pri[2] offs=0x1f60
block_row_dump:
tab 0, row 0, @0x1f8e
tl: 18 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [10]  61 62 63 20 20 20 20 20 20 20
col  1: [ 3]  61 62 63
tab 0, row 1, @0x1f75
tl: 25 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [10]  74 65 73 74 63 68 61 72 31 32
col  1: [10]  74 65 73 74 63 68 61 72 31 32
tab 0, row 2, @0x1f60
tl: 21 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [10]  e4 b8 ad e5 9b bd 20 20 20 20
col  1: [ 6]  e4 b8 ad e5 9b bd
end_of_block_dump

End dump data blocks tsn: 0 file#: 1 minblk 86858 maxblk 86858

 

 其中也可以用dump函數:

SYS@huiche>select char_col,dump(char_col,16) from test_char;

CHAR_COL             DUMP(CHAR_COL,16)
-------------------- --------------------------------------------------
abc                    Typ=96 Len=10: 61,62,63,20,20,20,20,20,20,20
testchar12         Typ=96 Len=10: 74,65,73,74,63,68,61,72,31,32
中國             Typ=96 Len=10: e4,b8,ad,e5,9b,bd,20,20,20,20

SYS@huiche>select varchar_col,dump(varchar_col,16) from test_char;

VARCHAR_COL          DUMP(VARCHAR_COL,16)
-------------------- --------------------------------------------------
abc                     Typ=1 Len=3: 61,62,63
testchar12          Typ=1 Len=10: 74,65,73,74,63,68,61,72,31,32
中國              Typ=1 Len=6: e4,b8,ad,e5,9b,bd

SYS@huiche>SYS@huiche>select * from nls_database_parameters where parameter like '%CHARACTERSET%';

PARAMETER                                                    VALUE
------------------------------------------------------------ ----------------------------
NLS_CHARACTERSET                                             AL32UTF8
NLS_NCHAR_CHARACTERSET                                       UTF8

 

 根據dump文件和dump函數的比較可以說明:字符類型在oracle數據庫底層是以16進制的ASCII碼存儲,漢字根據數據庫字符集不同,在GBK字符集中佔用2字節,在UTF8字符集中佔用3個字節。

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