关于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(