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'XOl
SQL> select * from t1 where b='abc';ITPUB个人空间q,ovNh+g,M d[
A B C ITPUB个人空间h#SzE$@|BT5u L
------- -------- ---------- 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个人空间fEz'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 zQ'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。这个故事还告诉我们:实践出真知。