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

char 和 varchar2的故事

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

SQL> conn test/testITPUB个人空间 s/Sa_Z"?
已连接。ITPUB个人空间)W[k1u,IB
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 Hf-U,k'}"`Ow.BX7590422A       B          C 
\r1]9G"Z~5C'v7590422------ ----------  -------                                                                           
H/v(e9lU7590422abc     abc         abcITPUB个人空间)t&N!Vngu P }vm0e
                                                                               ITPUB个人空间BH7T2ne bo
SQL> set linesize 200
U\|1uA p7590422SQL> select * from t1 where b='abc';
t*WS G&b Gt5Y3x7590422A        B         C ITPUB个人空间 Qu[X6L|
-------  --------  ----------                                                                                                                ITPUB个人空间IAY7A9^D![
abc      abc       abc

SQL> select * from t1 where a=b;

未选定行

SQL> select * from t1 where b=c;ITPUB个人空间5GQd'fd)N!m(Q
A          B          C
4Qo'l+Ec }2HI!s7590422-------  ---------  ----------                                                                                                             
x*| Kk&}PT7590422abc      abc        abc

SQL> var str varchar2(20);ITPUB个人空间_s.P%EMh
SQL> exec :str :='abc';

PL/SQL 过程已成功完成。

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

未选定行

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

A         B            CITPUB个人空间&X_7` K,^x#J
-------  --------  ---------                                                                                                             
c|!No"y)\r7590422abc      abc       abc 

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

已创建 1 行。

SQL> insert into t1 values('中化人民广播电台体育频道','中化人民广播电台体育频道','中化人民广播电台体育频道');
'Cc(r!s!a5L^DFc7590422insert into t1 values('中化人民广播电台体育频道','中化人民广播电台体育频道','中化人民广播电台体育频道')
eS6g!Ep"iY.mpI&L7590422                      *ITPUB个人空间rCeX,]b2wK} p
第 1 行出现错误:
r6ql3L0j5{s }7590422ORA-12899: 列 "TEST"."T1"."A" 的值太大 (实际值: 24, 最大值: 20)

SQL> insert into t1 values('中化人民广播电台体','中化人民广播电台体育频道','中化人民广播电台体育频道');ITPUB个人空间4Efqxt
insert into t1 values('中化人民广播电台体','中化人民广播电台体育频道','中化人民广播电台体育频道')ITPUB个人空间%c&}-jS4Fi5h4M q(h q
                                           *
O7x ]BD+i:J}!N&B7590422第 1 行出现错误:ITPUB个人空间F!Z[/rr9h
ORA-12899: 列 "TEST"."T1"."B" 的值太大 (实际值: 24, 最大值: 20)

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

已创建 1 行。

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

1。char是变长字符串,在insert的时候如果你插入的值长度比字段定义的长度短,oracle会以空格补足。当你用where a='abc'这种普通方式查询的时候,oracle会在等号两边做trim然后再比较。如果你绑定变量查询,oracle则不做trim.ITPUB个人空间+JI4eC!f/m
   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-01-25  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 541
  • 日志数: 11
  • 图片数: 2
  • 文件数: 1
  • 建立时间: 2007-12-12
  • 更新时间: 2008-01-24

RSS订阅

Open Toolbar