oracle 创建nchar类型,nchar类型的用法!
字符類型。主要包括char、varchar2和long等幾種類型。
SQL> create table test_char (
char_col char(10),
varchar_col varchar2(10),
long_col long
);
表已創建。
SQL> insert into test_char values ('abc', '123', ',fd');
已創建 1 行。
SQL> commit;
提交完成。
SQL> select rowid from test_char;
ROWID
------------------
AAAB3LAAFAAAAAgAAA
按照rowid的定義規則,我們根據計算的結果去dump這個block。
SQL> ALTER SYSTEM DUMP DATAFILE 5 BLOCK 32;
系統已更改。
打開產生的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出來的結果,可以發現以下幾點:
1.對于每個字段,除了保存字段的值以外,還會保存當前字段中數據的長度。而且,oracle顯然沒有把字段的長度定義或類型定義保存在block中,這些信息保存在oracle的數據字典里面。
2.根據dump的結果,可以清楚的看到,字符類型在數據庫中是以ascii格式存儲的。
3.char類型為定長格式,存儲的時候會在字符串后面填補空格,而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 數據類型
由于DUMP不支持LONG類型,因此我們使用了alter system dump block的方式,通過比較兩種方式得到的結果,發現DUMP()函數不但方便,結果清晰,而且指出了進行DUMP的數據類型,在以后的例子中,除非必要的情況,否則都會采用DUMP()函數的方式進行說明。
下面看一下插入中文的情況,首先看一下數據庫的字符集。
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);
已創建 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
根據dump結果,可以清楚的看出,普通英文字符和標點用一個字節表示,而中文字符或中文標點需要兩個字節來表示。下面,對比一下nchar和nvarchar2與char、varchar2類型有什么不同。
SQL> create table test_nchar (nchar_col nchar(10), nvarchar_col nvarchar2(10));
表已創建。
SQL> insert into test_nchar values ('nchar定長', 'nvarchar變長');
已創建 1 行。
從這里已經可以看出一些不同了,如果按照剛才中文的計算方法,'nvarchar變長'的長度是8+2*2=12已經超過了數據類型定義的大小,可是為什么插入成功了?還是dump一下看看結果吧。
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字符集,編碼長度變為2個字節。這樣中文使用兩個字節,對于可以用一個字節就表示的英文字符,采用了高位補0的方式湊足2位,這樣,對于采用AL16UTF16字符集的nchar類型,無論中文還是英文都用2位字符表示。因此'nvarchar變長'的長度是10,并沒有超過數據類型的限制。
總結
以上是生活随笔為你收集整理的oracle 创建nchar类型,nchar类型的用法!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php试卷分析,试卷分析失分原因和改进措
- 下一篇: plsql连接oracle未找到oci,