oracle中字符串(摘抄)

关于Oracle中字符串的说明

字符串

Oracle中有四种基本的字符串类型,分别是char、varchar2、nchar和nvarchar2。在Oracle中,所有串都以同样的格式存储。在数据块有一个1~3字节的长度字段,其后才是数据,如果数据位NULL,长度字段则表示为一个单字节值0xFF.

如果串的长度小于或等于250(0x01~0xFA),Oracle会使用1个字节来表示长度。对于所有长度超过250的串,都会在一个标志字节0xFE后跟有两个字节来表示长度。因此,如果有个包含“Hello Word”的varchar2(80),则在块中可能是:[11][H][e][l][l][o][][W][o][r][l][d]

如果在一个char(80)中存储同样的数据,则可能是:[80][H][e][l][l][o][][W][o][r][l][d][68][].....[][0]

例子:

ops$tkyte@ORA10G>create table t

2 (car_column     char(20))

3  varchar2_column varchar2(20)

4 )

5 /

Table created.

ops$tkyte@ORA10G>insert into t values('Hello World','Hello World');

1 row created.

ops$tkyte@ORA10G> select * from t;

CHAR_COLUMN              VARHCAR2_COLUMN

--------------------------------------------

Hello World              Hello World

ops$tkyte@ORA10G> select * from t where char_column='Hello World';

CHAR_COLUMN              VARHCAR2_COLUMN

--------------------------------------------

Hello World              Hello World

ops$tkyte@ORA10G>select * from t where varchar2_column='Hello World';

CHAR_COLUMN              VARHCAR2_COLUMN

--------------------------------------------

Hello World              Hello World

以上的操作看不出什么效果对吧,继续看下面的内容:

ops$tkyte@ORA10G>select * from t where cahr_column=varchar2_column;

no rows selected

原因是在char列比较时,char(11)直接量('Hello World')已经提升为一个char(20),并在其中填充了空格。这种转换肯定已经发生了,因为Hello World......与没有尾部空格的Hello World 并不相同。

 

要么必须用空格填充varchar2_column列,使其长度达到20字节,要么必须从char_column列截去尾部的空格:

ops$tkyte@ORA10G>select * from t where trim(char_column)=varchar2_column;

CHAR_COLUMN              VARHCAR2_COLUMN

--------------------------------------------

Hello World              Hello World

ops$tkyte@ORA10G>select * from t where char_column=rpad(varchar2_column,20);

CHAR_COLUMN              VARHCAR2_COLUMN

--------------------------------------------

Hello World              Hello World

 

以上内容是摘抄,原文见(Oracle9i&10g编程艺术-深入数据库体系结构)P494

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值