a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

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

2024-08-29 13:49:50
字體:
供稿:網(wǎng)友
  前一陣看完文檔,對Oracle的基本數(shù)據(jù)類型的存儲格式有了一些了解,最近有做了一些測試進(jìn)行了驗(yàn)證。  打算整理總結(jié)一下,這一篇主要說明字符類型的存儲格式。主要包括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: 0x1f98
hsiz: 0x14
pbl: 0x03421064
bdba: 0x01400020
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fSEO=0x1f82
avsp=0x1f6e
tosp=0x1f6e
0xe:pti[0] nrow=1 offs=0
0x12:PRi[0] offs=0x1f82
block_row_dump:
tab 0, row 0, @0x1f82
tl: 22 fb: --H-FL-- lb: 0x1  cc: 3
col  0: [10]  61 62 63 20 20 20 20 20 20 20
col  1: [ 3]  31 32 33
col  2: [ 3]  2c 66 64
end_of_block_dump
End dump data blocks tsn: 5 file#: 5 minblk 32 maxblk 32
  觀察dump出來的結(jié)果,可以發(fā)現(xiàn)以下幾點(diǎn):
  1.對于每個(gè)字段,除了保存字段的值以外,還會保存當(dāng)前字段中數(shù)據(jù)的長度。而且,oracle顯然沒有把字段的長度定義或類型定義保存在block中,這些信息保存在oracle的數(shù)據(jù)字典里面。
  2. 根據(jù)dump的結(jié)果,可以清楚的看到,字符類型在數(shù)據(jù)庫中是以ascii格式存儲的。
SQL> select chr(to_number('61', 'xx')) from dual;
CH
--
a
  3.char類型為定長格式,存儲的時(shí)候會在字符串后面填補(bǔ)空格,而varchar2和long類型都是變長的。
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,20
SQL> SELECT DUMP(VARCHAR_COL, 16) D_VARCHAR2 FROM TEST_CHAR;
D_VARCHAR2
-------------------------------------------------------------
Typ=1 Len=3: 31,32,33
SQL> 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ù)類型,在以后的例子中,除非必要的情況,否則都會采用DUMP()函數(shù)的方式進(jìn)行說明。
  下面看一下插入中文的情況,首先看一下數(shù)據(jù)庫的字符集
SQL> select name, value$ from sys.props$ where name like '%CHARACTERSET%';
NAME                           VALUE$

------------------------------ ------------------------------
NLS_CHARACTERSET               ZHS16GBK
NLS_NCHAR_CHARACTERSET         AL16UTF16
SQL> insert into test_char values ('定長', '變長', 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,20
Typ=96 Len=10: b6,a8,b3,a4,20,20,20,20,20,20
SQL> SELECT DUMP(VARCHAR_COL, 16) D_VARCHAR2 FROM TEST_CHAR;
D_VARCHAR2
----------------------------------------------------------------
Typ=1 Len=3: 31,32,33
Typ=1 Len=4: b1,e4,b3,a4
  根據(jù)dump結(jié)果,可以清楚的看出,普通英文字符和標(biāo)點(diǎn)用一個(gè)字節(jié)表示,而中文字符或中文標(biāo)點(diǎn)需要兩個(gè)字節(jié)來表示。
下面,對比一下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定長', 'nvarchar變長');
已創(chuàng)建 1 行。
  從這里已經(jīng)可以看出一些不同了,假如按照剛才中文的計(jì)算方法,'nvarchar變長'的長度是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,20
SQL> 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碼存儲,但是nchar使用的AL16UTF16字符集,編碼長度變?yōu)?個(gè)字節(jié)。這樣中文使用兩個(gè)字節(jié),對于可以用一個(gè)字節(jié)就表示的英文字符,采用了高位補(bǔ)0的方式湊足2位,這樣,對于采用AL16UTF16字符集的nchar類型,無論中文還是英文都用2位字符表示。因此'nvarchar變長'的長度是10,并沒有超過數(shù)據(jù)類型的限制。


上一篇:如何收集Oracle進(jìn)程中的sql跟蹤信息

下一篇:關(guān)于Oracle 對 Linux 的策略的FAQ

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 欧美色图亚洲自拍 | 欧美一区二区三区四区视频 | 欧美午夜一区二区三区免费大片 | 亚洲人成中文字幕在线观看 | 日韩国产欧美视频 | 真实国产露脸乱 | 亚洲精品久久久狠狠狠爱 | 亚洲一区亚洲二区 | 美女黄视频网站 | 黄色视屏在线免费观看 | www.com91| 日韩综合一区 | 久久久国产一区二区 | 日韩电影免费在线观看中文字幕 | 97超碰在线免费 | 亚洲综合在 | 亚洲午夜免费视频 | 日韩一区在线观看视频 | 亚洲欧美v国产一区二区 | 欧美黑人巨大久久久精品一区 | 一本大道综合伊人精品热热 | 日韩一级不卡 | 日韩av不卡在线播放 | 91一区二区三区久久国产乱 | 日韩久久久久久 | 国产高清不卡在线 | 国产女人和拘做受在线视频 | 欧美国产日韩在线观看 | 国产精品99视频 | 国产一级特黄aaa大片 | av在线天堂 | av在线影院 | 亚洲精品一区在线观看 | 久久小视频 | 成人影院在线 | 国产在线观看 | 日韩五码在线 | 夜夜夜操操操 | 欧美国产精品一区 | 国产成年人小视频 | 久久激情视频 |