渐行渐远这个网名,用了好多年了, 非常喜欢. 童年远了. 梦想远了.

char 和 varchar2的故事

上一篇 / 下一篇  2007-12-26 20:59:41 / 个人分类:SQL.开发.函数

SQL> conn test/test
4?S'Y~'Og2P0已连接。
Bh%?aJ1[*@m)B3L0SQL> 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';ITPUB个人空间@/B1v^ p6f'U_i H,E#t
A       B          C ITPUB个人空间 c^ L+K)[8`/b:K+yQy-T,@
------ ----------  -------                                                                           ITPUB个人空间u#Vf{1E$wk7A[
abc     abc         abcITPUB个人空间 M7qk7e)J&eu*k.T5P?7\
                                                                               ITPUB个人空间h7dy&ro
SQL> set linesize 200ITPUB个人空间&j({6?$W2Sw'X Ol
SQL> select * from t1 where b='abc';ITPUB个人空间q,ovNh+g,M d[
A        B         C ITPUB个人空间h#SzE$@|BT5uL
-------  --------  ----------                                                                                                                ITPUB个人空间N;X Smm_^E}o^J
abc      abc       abc

SQL> select * from t1 where a=b;

未选定行

SQL> select * from t1 where b=c;ITPUB个人空间/@&FgB1P5x*j
A          B          C
4d.a'l2t,d#LD7?k0-------  ---------  ----------                                                                                                             ITPUB个人空间Uu?a;k.A2P
abc      abc        abc

SQL> var str varchar2(20);
[g\p.A j/e[ p0SQL> exec :str :='abc';

PL/SQL 过程已成功完成。

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

未选定行

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

A         B            CITPUB个人空间%Q/j*_B\a HQ
-------  --------  ---------                                                                                                             ITPUB个人空间+i0q3Zbr@8`$y,B
abc      abc       abc 

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

已创建 1 行。

SQL> insert into t1 values('中化人民广播电台体育频道','中化人民广播电台体育频道','中化人民广播电台体育频道');
1lt]^B*g#T3wmrG0insert into t1 values('中化人民广播电台体育频道','中化人民广播电台体育频道','中化人民广播电台体育频道')ITPUB个人空间_7k(LY~ U\
                      *
r`0~ i)w~e0第 1 行出现错误:ITPUB个人空间f Ez'v?6n _ sc
ORA-12899: 列 "TEST"."T1"."A" 的值太大 (实际值: 24, 最大值: 20)

SQL> insert into t1 values('中化人民广播电台体','中化人民广播电台体育频道','中化人民广播电台体育频道');ITPUB个人空间$`X'k&[ U)qj
insert into t1 values('中化人民广播电台体','中化人民广播电台体育频道','中化人民广播电台体育频道')ITPUB个人空间2N%GD:F t8Qt2x
                                           *ITPUB个人空间'YKL z Q'e'Q
第 1 行出现错误:
z"`*| Xh4Bj0ORA-12899: 列 "TEST"."T1"."B" 的值太大 (实际值: 24, 最大值: 20)

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

已创建 1 行。

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

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

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

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


TAG:

xpureland的个人空间 引用 删除 xpureland   /   2007-12-27 17:18:38
老大 以后就拷贝你的日志了
xpureland的个人空间 引用 删除 xpureland   /   2007-12-27 17:17:44
5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-07-20  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 1360
  • 日志数: 18
  • 图片数: 2
  • 文件数: 2
  • 建立时间: 2007-12-12
  • 更新时间: 2008-06-12

RSS订阅

Open Toolbar