日期:2014-05-16  浏览次数:20375 次

Oracle 基本数据类型---(字符串)

Oracle 字符串格式

首先介绍:char(N) 和Varchar2(N)格式

create table TEST_CHAR
(
CHAR_COL??? CHAR(10),
VARCHAR_COL VARCHAR2(10),
);

SQL> insert into test_char(char_col, varchar_col ) values ('123','123');

SQL> commit;

SQL> select char_col,dump(char_col,16) as d_char_col ,? varchar_col,dump(varchar_col,16) as d_varchar_col from test_char;
?
CHAR_COL?? D_CHAR_COL????????????????????????????????????????????????? ?VARCHAR_COL???????? D_VARCHAR_COL
---------- -------------------------------------------- ----------- --------------------------------------------
123??????? Typ=96 Len=10: 31,32,33,20,20,20,20,20,20,20??????????? 123???????????? Typ=1 Len=3: 31,32,33
?

可以看到:char 类型,若是长度不够,则自动在后面填补空格;varchar类型,则只是存储‘123’。

SQL> select to_number('31','xx') from dual;
?
TO_NUMBER('31','XX')
--------------------
????????????????? 49

?----首先将16进制的数据转化为10进制。

SQL> select chr(49) from dual;
?
CHR(49)
-------
1

取得了 49 对应的 字符。

总结如下:oracle 存储字符,是将字符转化为对应的ASCII码进行相应的存储。

?

SQL> insert into test_char(char_col , varchar_col) values( '神奇的国家','神奇的国家');

SQL> commit;

?

Commit complete

?

SQL> select char_col,dump(char_col,16) as d_char_col ,? varchar_col,dump(varchar_col,16) as d_varchar_col from test_char;
?
CHAR_COL?? D_CHAR_COL?????????????????????????????????????????????????????????????????????? VARCHAR_COL D_VARCHAR_COL
---------- -------------------------------------------- ----------- --------------------------------------------
123??????? Typ=96 Len=10: 31,32,33,20,20,20,20,20,20,20??????? 123??? Typ=1 Len=3: 31,32,33
神奇的国家 Typ=96 Len=10: c9,f1,c6,e6,b5,c4,b9,fa,bc,d2????神奇的国家? Typ=1 Len=10: c9,f1,c6,e6,b5,c4,b9,fa,bc,d2

可以看到中文字符?是按两个字节进行存储的。

?

接下来进行介绍的是:NChar(N),NVarchar2(N)。

?

create table TEST_NCHAR
(
? CHAR_COL??? NCHAR(10),
? VARCHAR_COL NVARCHAR2(10)
);

?

?
SQL> insert into test_nchar (char_col , VARCHAR_COL) values('123','123');
?
1 row inserted
?
SQL> commit;
?
Commit complete
?
SQL> select char_col , dump(char_col , 16) as d_char_col , VARCHAR_COL ,? dump(VARCHAR_COL, 16) as d_VARCHAR_COL from test_nchar;
?
CHAR_COL???????????? D_CHAR_COL??????????? VARCHAR_COL????????? D_VARCHAR_COL
-------------------- -------------------------------------------- -------------------- --------------------------------------------
123????????????????? Typ=96 Len=20: 0,31,0,32,0,33,0,20,0,20,0,20,0,20,0,20,0,20,0,20???????????????? 123????????????????? Typ=1 Len=6: 0,31,0,32,0,33
?

可以清楚的看到,同时插入了字符串‘123’,但是NChar的为 0,31,0,32,0,33,就是说:高位用0补充,补足两个字节。

总结如下:NChar,Nvarchar2 存储的所有字符都是按两个字节进行存储。

上述四种类型的共同点是:英文字符和数字都是按照ASCII码进行存储。

可以查看oracle的字符集:

SQL> select * from sys.props$? where name like '%CHARACTERSET%' ;
?
NAME?????????????????????????? VALUE$?????????????????????????????????????????????????????????????????????????? COMMENT$
------------------------------ -------------------------------------------- --------------------------------------------
NLS_CHARACTERSET??????????????   ZHS16GBK??????????????????????????????????????????????? Character set
NLS_NCHAR_CHARACTERSET???????? AL16UTF16????????????????????????????????????????????? NCHAR Character set
?

?