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

字符串类型
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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11980046/viewspace-736676/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值