char 和 varchar2的故事

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

转载于:http://blog.itpub.net/226801/viewspace-6438/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值