ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 《Oracle编程艺术》学习笔记(34)-数据类型-字符串和二进制串 .

《Oracle编程艺术》学习笔记(34)-数据类型-字符串和二进制串 .

原创 Linux操作系统 作者:xiaoweisos 时间:2012-07-25 23:50:47 0 删除 编辑
字符串类型
Oracle 中有4 种基本的字符串类型,分别是CHAR、VARCHAR2、NCHAR 和NVARCHAR2。
在Oracle 中,所有串都以同样的格式存储。在数据库块上,最全面都有一个1~3 字节的长度字段,其后是数据。

1) CHAR():定长字符串,会用空格填充来达到其最大长度。最多可以存储2,000字节的信息。
2) NCHAR():包含UNICODE格式数据的定长字符串。最多可以存储2,000字节的信息。
3) VARCHAR2:VARCHAR 的同义词。变长字符串,不会用空格填充至最大长度。最多可以存储4,000 字节的信息。
4) NVARCHAR2():包含UNICODE 格式数据的变长字符串。最多可以存储4,000 字节的信息。

VARCHAR2和CHAR类型支持两种指定长度的方法:
1) 用字节指定,例如VARCHAR2(10 BYTE),支持最多10字节的数据。
2) 用字符指定,例如VARCHAR2(10 CHAR)。这将支持最多10字符的数据,但是最大程度仍然是4000字节,所以即使指定VARCHAR2(4000 CHAR),可能并不能放下4000个字符。
VARCHAR2和CHAR类型存储的字符串按照数据库字符集编码。
可以通过NLS_CHARACTERSET参数察看当前的数据库字符集。
所以如果数据库字符集使用多字节字符集,例如UTF8,那么应该使用CHAR来指定长度。
如果不指定BYTE|CHAR,默认是BYTE。可以使用参数NLS_LENGTH_SEMANTICS在会话或系统级别来修改默认行为。

NVARCHAR2和NCHAR总是使用字符数来指定长度。
NVARCHAR2和NCHAR类型存储的字符串可以使用UTF8 or AL16UTF16作为字符集,默认为AL16UTF16。
可以通过NLS_NCHAR_CHARACTERSET参数来查看当前的NCHAR字符集。

字符串的存储和NLS关系密切,NLS(National Language Support)->http://blog.csdn.net/fw0124/article/details/6655381
查看数据库字符集和NCHAR字符集的方法:select * from v$nls_parameters;


CHAR/NCHAR 实际上只是伪装的VARCHAR2/NVARCHAR2,其实只需要考虑两种字符串类型:VARCHAR和NVARCHAR2。CHAR类型总是会用空格填充得到的串,使之达到一个固定宽度,这会导致占用更多的存储空间。
另外,如果使用CHAR/NCHAR 类型,在执行字符串比较的时候,特别是使用绑定变量的时候,会遇到问题,例如:

tony@MYTEST2> create table t (char_col char(20), varchar2_col varchar2(20));
Table created.

tony@MYTEST2> insert into t values('hello', 'hello');
1 row created.

tony@MYTEST2> select * from t where char_col = 'hello';
CHAR_COL             VARCHAR2_COL
-------------------- --------------------
hello                hello

tony@MYTEST2> select * from t where varchar2_col = 'hello';
CHAR_COL             VARCHAR2_COL
-------------------- --------------------
hello                hello

tony@MYTEST2> declare
  2      l_str varchar2(20) := 'hello';
  3      l_rec t%rowtype;
  4  begin
  5      select * into l_rec from t where char_col = l_str;
  6  end;
  7  /
declare
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 5

以上执行select * from t where char_col = 'hello';的时候,实际上发生了隐式转换,’hello’已经提升为一个CHAR(20),并在其中填充了空格。
但是使用绑定变量的时候,不会发生隐式转换,所以查询会失败。
因此,一般来讲,应该总是使用变长字符串。


二进制串类型
RAW():RAW类型是变长二进制数据类型,采用这种数据类型存储的数据不会发生字符集转换。最多可以存储2,000 字节的信息。
诸如SQL*Plus之类工具处理RAW数据时,会把它被隐式地转换为一个VARCHAR2类型。例如:

tony@MYTEST2> select sys_guid() from dual;
SYS_GUID()
--------------------------------
8CB01E29329F4F35B9CE989AE0E64233

推荐使用显示转换,可以使用以下内置函数:
1)HEXTORAW:将十六进制字符串转换为RAW类型
2)RAWTOHEX:将RAW串转换为十六进制串

tony@MYTEST2> create table t(col raw(16));
Table created.

tony@MYTEST2> insert into t values(hextoraw('8CB01E29329F4F35B9CE989AE0E64233'));
1 row created.

tony@MYTEST2> select rawtohex(col), dump(col, 16) from t;
RAWTOHEX(COL)                     DUMP(COL,16)
------------------------------------------------------------------------------------------------
8CB01E29329F4F35B9CE989AE0E64233  Typ=23 Len=16: 8c,b0,1e,29,32,9f,4f,35,b9,ce,98,9a,e0,e6,42,33

LONG类型
1) LONG:能存储最多2G字节的字符数据。与VARCHAR2或CHAR 类型一样,存储在LONG类型中的文本要进行字符集转换。
2) LONG RAW:能存储多达2GB的二进制信息。

LONG类型有许多限制,提供LONG类型只是为了保证向后兼容性。
不要使用LONG类型,使用CLOB/NCLOB类型;不要使用LONG RAW类型,使用BLOB类型。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11980046/viewspace-736676/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-03-08

  • 博文量
    39
  • 访问量
    10470