ITPub博客

char 和 varchar2的故事

原创 Linux操作系统 作者:zhaoqh 时间:2007-12-26 20:59:41 0 删除 编辑

SQL> conn test/test
已连接。
SQL> create table t1 (a char(20),b varchar2(20),c varchar2(20 char));

表已创建。

SQL> insert into t1 values('abc','abc','abc');

已创建 1 行。

SQL> select * from t1 where a='abc';
A       B          C 
------ ----------  -------                                                                           
abc     abc         abc
                                                                               
SQL> set linesize 200
SQL> select * from t1 where b='abc';
A        B         C 
-------  --------  ----------                                                                                                                
abc      abc       abc

SQL> select * from t1 where a=b;

未选定行

SQL> select * from t1 where b=c;
A          B          C
-------  ---------  ----------                                                                                                             
abc      abc        abc

SQL> var str varchar2(20);
SQL> exec :str :='abc';

PL/SQL 过程已成功完成。

SQL> select * from t1 where a = :str;

未选定行

SQL>  select * from t1 where b= :str;

A         B            C
-------  --------  ---------                                                                                                             
abc      abc       abc 

SQL> insert into t1 values('中化人民广播电台','中化人民广播电台','中化人民广播电台');

已创建 1 行。

SQL> insert into t1 values('中化人民广播电台体育频道','中化人民广播电台体育频道','中化人民广播电台体育频道');
insert into t1 values('中化人民广播电台体育频道','中化人民广播电台体育频道','中化人民广播电台体育频道')
                      *
第 1 行出现错误:
ORA-12899: 列 "TEST"."T1"."A" 的值太大 (实际值: 24, 最大值: 20)

SQL> insert into t1 values('中化人民广播电台体','中化人民广播电台体育频道','中化人民广播电台体育频道');
insert into t1 values('中化人民广播电台体','中化人民广播电台体育频道','中化人民广播电台体育频道')
                                           *
第 1 行出现错误:
ORA-12899: 列 "TEST"."T1"."B" 的值太大 (实际值: 24, 最大值: 20)

SQL>  insert into t1 values('中化人民广播电台体','中化人民广播电台体','中化人民广播电台体育频道');

已创建 1 行。

这个故事告诉我们三个道理:

1。char是变长字符串,在insert的时候如果你插入的值长度比字段定义的长度短,oracle会以空格补足。当你用where a='abc'这种普通方式查询的时候,oracle会在等号两边做trim然后再比较。如果你绑定变量查询,oracle则不做trim.
   varchar2是变长字符串,在insert的时候如果你插入的值长度比字段定义的长度短,oracle不会补足。所以绑定变量查询与普通查询完全一样。

2。字符串定义有两种可选方式:varchar2(20 byte)或varchar2(20 char).byte代表在数据库中实际占多少字节。char代表实际存储了多少字符。如果使用varchar2(20 char)这种方式来定义字符串,根据数据库字符集的不同,在数据库中存储的长度也不同。比如在zhs16gbk的数据库中,如果使用varchar2(20 char)来定义字符串,则实际能存储20个字符,占40个字节。

3。这个故事还告诉我们:实践出真知。

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

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

注册时间:2007-12-12

  • 博文量
    27
  • 访问量
    59792