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/