日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

oracle 创建nchar类型,nchar类型的用法!

發(fā)布時(shí)間:2024/9/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 创建nchar类型,nchar类型的用法! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

字符類型。主要包括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

按照rowid的定義規(guī)則,我們根據(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

0xeti[0] nrow=1 offs=0

0x12ri[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.對(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ǔ)的。

3.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,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ù)類型,在以后的例子中,除非必要的情況,否則都會(huì)采用DUMP()函數(shù)的方式進(jìn)行說明。

下面看一下插入中文的情況,首先看一下數(shù)據(jù)庫(kù)的字符集。

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 ('定長(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,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é)來表示。下面,對(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,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碼存儲(chǔ),但是nchar使用的AL16UTF16字符集,編碼長(zhǎng)度變?yōu)?個(gè)字節(jié)。這樣中文使用兩個(gè)字節(jié),對(duì)于可以用一個(gè)字節(jié)就表示的英文字符,采用了高位補(bǔ)0的方式湊足2位,這樣,對(duì)于采用AL16UTF16字符集的nchar類型,無(wú)論中文還是英文都用2位字符表示。因此'nvarchar變長(zhǎng)'的長(zhǎng)度是10,并沒有超過數(shù)據(jù)類型的限制。

總結(jié)

以上是生活随笔為你收集整理的oracle 创建nchar类型,nchar类型的用法!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。