av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Oracle基本數(shù)據(jù)類型存儲(chǔ)格式淺析:字符類型

瀏覽:3日期:2023-11-20 11:17:39
前一陣看完文檔,對(duì)Oracle的基本數(shù)據(jù)類型的存儲(chǔ)格式有了一些了解,最近有做了一些測(cè)試進(jìn)行了驗(yàn)證。打算整理總結(jié)一下,這一篇主要說明字符類型的存儲(chǔ)格式。主要包括char、varchar2和long等幾種類型。SQL> create table test_char (char_col char(10), varchar_col varchar2(10), long_col long);表已創(chuàng)建。SQL> insert into test_char values ('abc', '123', ',fd');已創(chuàng)建 1 行。SQL> commit;提交完成。SQL> select rowid from test_char;ROWID------------------AAAB3LAAFAAAAAgAAA根據(jù)rowid的定義規(guī)則,第7~9位是表示的是數(shù)據(jù)文件,F(xiàn)表示5,而10~15位表示的是在這個(gè)數(shù)據(jù)文件中的第幾個(gè)BLOCK,g表示32。(rowid編碼相當(dāng)于64進(jìn)制。用A~Z a~z 0~9 + /共64個(gè)字符表示。A表示0,B表示1,……,a表示26,……,0表示52,……,+表示62,/表示63。)我們根據(jù)計(jì)算的結(jié)果去dump這個(gè)block。SQL> ALTER SYSTEM DUMP DATAFILE 5 BLOCK 32;系統(tǒng)已更改。打開產(chǎn)生的trace文件:data_block_dump,data header at 0x3421064===============tsiz: 0x1f98hsiz: 0x14pbl: 0x03421064bdba: 0x01400020 76543210flag=--------ntab=1nrow=1frre=-1fsbo=0x14fseo=0x1f82avsp=0x1f6etosp=0x1f6e0xe:pti[0] nrow=1 offs=00x12:pri[0] offs=0x1f82block_row_dump:tab 0, row 0, @0x1f82tl: 22 fb: --H-FL-- lb: 0x1; cc: 3col; 0: [10]; 61 62 63 20 20 20 20 20 20 20col; 1: [ 3]; 31 32 33col; 2: [ 3]; 2c 66 64end_of_block_dumpEnd dump data blocks tsn: 5 file#: 5 minblk 32 maxblk 32觀察dump出來的結(jié)果,可以發(fā)現(xiàn)以下幾點(diǎn):1.對(duì)于每個(gè)字段,除了保存字段的值以外,還會(huì)保存當(dāng)前字段中數(shù)據(jù)的長(zhǎng)度。而且,oracle顯然沒有把字段的長(zhǎng)度定義或類型定義保存在block中,這些信息保存在oracle的數(shù)據(jù)字典里面。2. 根據(jù)dump的結(jié)果,可以清楚的看到,字符類型在數(shù)據(jù)庫(kù)中是以ascii格式存儲(chǔ)的。SQL> select chr(to_number('61', 'xx')) from dual;CH--a3.char類型為定長(zhǎng)格式,存儲(chǔ)的時(shí)候會(huì)在字符串后面填補(bǔ)空格,而varchar2和long類型都是變長(zhǎng)的。SQL> SELECT DUMP(CHAR_COL, 16) D_CHAR FROM TEST_CHAR;D_CHAR-------------------------------------------------------------Typ=96 Len=10: 61,62,63,20,20,20,20,20,20,20SQL> SELECT DUMP(VARCHAR_COL, 16) D_VARCHAR2 FROM TEST_CHAR;D_VARCHAR2-------------------------------------------------------------Typ=1 Len=3: 31,32,33SQL> SELECT DUMP(LONG_COL, 16) D_VARCHAR2 FROM TEST_CHAR;SELECT DUMP(LONG_COL, 16) D_VARCHAR2 FROM TEST_CHAR *ERROR 位于第 1 行:ORA-00997: 非法使用 LONG 數(shù)據(jù)類型由于DUMP不支持LONG類型,因此我們使用了alter system dump block的方式,通過比較兩種方式得到的結(jié)果,發(fā)現(xiàn)DUMP()函數(shù)不但方便,結(jié)果清楚,而且指出了進(jìn)行DUMP的數(shù)據(jù)類型,在以后的例子中,除非必要的情況,否則都會(huì)采用DUMP()函數(shù)的方式進(jìn)行說明。下面看一下插入中文的情況,首先看一下數(shù)據(jù)庫(kù)的字符集SQL> select name, value$ from sys.props$ where name like '%CHARACTERSET%';NAMEVALUE$ ------------------------------ ------------------------------NLS_CHARACTERSET;;;;ZHS16GBKNLS_NCHAR_CHARACTERSET AL16UTF16SQL> insert into test_char values ('定長(zhǎng)', '變長(zhǎng)', null);已創(chuàng)建 1 行。SQL> SELECT DUMP(CHAR_COL, 16) D_CHAR FROM TEST_CHAR;D_CHAR----------------------------------------------------------------Typ=96 Len=10: 61,62,63,20,20,20,20,20,20,20Typ=96 Len=10: b6,a8,b3,a4,20,20,20,20,20,20SQL> SELECT DUMP(VARCHAR_COL, 16) D_VARCHAR2 FROM TEST_CHAR;D_VARCHAR2----------------------------------------------------------------Typ=1 Len=3: 31,32,33Typ=1 Len=4: b1,e4,b3,a4根據(jù)dump結(jié)果,可以清楚的看出,普通英文字符和標(biāo)點(diǎn)用一個(gè)字節(jié)表示,而中文字符或中文標(biāo)點(diǎn)需要兩個(gè)字節(jié)來表示。下面,對(duì)比一下nchar和nvarchar2與char、varchar2類型有什么不同。SQL> create table test_nchar (nchar_col nchar(10), nvarchar_col nvarchar2(10));表已創(chuàng)建。SQL> insert into test_nchar values ('nchar定長(zhǎng)', 'nvarchar變長(zhǎng)');已創(chuàng)建 1 行。從這里已經(jīng)可以看出一些不同了,假如按照剛才中文的計(jì)算方法,'nvarchar變長(zhǎng)'的長(zhǎng)度是8+2*2=12已經(jīng)超過了數(shù)據(jù)類型定義的大小,可是為什么插入成功了?還是dump一下看看結(jié)果吧。SQL> select dump(nchar_col, 16) from test_nchar;DUMP(NCHAR_COL,16)--------------------------------------------------------------Typ=96 Len=20: 0,6e,0,63,0,68,0,61,0,72,5b,9a,95,7f,0,20,0,20,0,20SQL> select dump(nvarchar_col, 16) from test_nchar;DUMP(NVARCHAR_COL,16)--------------------------------------------------------------Typ=1 Len=20: 0,6e,0,76,0,61,0,72,0,63,0,68,0,61,0,72,53,d8,95,7f這下就明白了,雖然仍然是采用ascii碼存儲(chǔ),但是nchar使用的AL16UTF16字符集,編碼長(zhǎng)度變?yōu)?個(gè)字節(jié)。這樣中文使用兩個(gè)字節(jié),對(duì)于可以用一個(gè)字節(jié)就表示的英文字符,采用了高位補(bǔ)0的方式湊足2位,這樣,對(duì)于采用AL16UTF16字符集的nchar類型,無論中文還是英文都用2位字符表示。因此'nvarchar變長(zhǎng)'的長(zhǎng)度是10,并沒有超過數(shù)據(jù)類型的限制。
主站蜘蛛池模板: 中文字幕国产 | 黄色网免费 | 午夜久久久久久久 | 国产一区二区免费看 | 蜜桃久久久 | 狠狠艹狠狠干 | 亚洲综合在线视频 | 成人黄色小视频 | 国产免费91| 欧美日韩二区三区 | 中文字幕不卡视频 | 国产成人精品一区二区三区视频 | 久久成人免费视频 | 久久久国产视频 | 精品小视频 | 亚洲无av在线中文字幕 | 久久久久久国产 | a级片在线观看 | 草草免费视频 | 黄色av观看 | 精品视频网站 | 欧美视频在线一区 | 色哟哟一区二区三区 | 国产精品福利在线 | 成人蜜桃视频 | 国产精品911| 一区二区黄色 | 精品一区二区三区视频 | 午夜理伦三级理论 | 91女人18毛片水多国产 | 欧美在线中文字幕 | 91久久国产综合久久 | 激情婷婷网| 欧美激情视频一区二区三区 | 国产精品久久久国产盗摄 | 日韩成人精品一区二区 | 色一情一乱一乱一区91av | 国产免费一区 | 一区二区三区在线免费观看 | 国产乱码精品一区二区三 | 亚洲九九九 |