sql字段类型char与varchar2区别

发布时间:2020-10-06编辑:脚本学堂
本文介绍了sql数据库中字段类型char与varchar2在用法上的区别,如何用好char与varchar字段类型呢,可以参考下本文的例子。

例子,在建表语句中使用char与varchar2字段类型。
 

create table userinfo2 

user_id char(32) not null, 
user_code varchar2(32) not null, 
password char(32) not null, 
user_name varchar2(50) not null 
); 
insert into userinfo2 values('001','aaa','www','eee'); 
insert into userinfo2 values('002','bbb','vvv','sss'); 

下面通过实例测试,来看下char与varchar2的区别。

1)、length长度区别 
 

sql> select length(user_id),length(user_code) from userinfo2; 
 
length(user_id) length(user_code) 
--------------- ----------------- 
             32                 3 
             32                 3 
 

从这可以看到显著的区别,虽然插入的是三个字符,但是char(n)类型还是会填写剩余的固定的内容,而varchar2不会. 
2)、过程测试与自动转换问题 
 

sql> declare 
  2     v_id varchar2(10); 
  3  begin 
  4     v_id:='001'; 
  5     update userinfo2 set user_name='goood' where user_id=v_id; 
  6     commit; 
  7  end; 
  8  / 
pl/sql procedure successfully completed 
sql> select user_id,user_name from userinfo2; 
user_id                          user_name 
-------------------------------- -------------------------------------------------- 
001                              eee 
002                              sss 
-- 

? 为什么结果没有发生变化了? 只能说是没有匹配条件的记录. 
看来应该是这样的,如果变量定义为varchar2,那么最终长度决定了实际的长度,这里是3,但是对于表格userinfo2来说它不存在值为'001'的user_id.数据库中的实际存在的是"001." 
,所以上面的语句实际上等同于:update userinfo2 set user_name='goood' where user_id='001',这样自然无法找到匹配记录. 
但是如果你用的是常量,那么oracle或者某些程序会自动的把它们转换为char类型. 
 
3)、char的自动转换 
 

sql> update userinfo2 set user_name='good' where user_id='001'; 
1 row updated 
sql> select user_name from userinfo2 where user_id='001'; 
user_name 
-------------------------------------------------- 
good 
 

以上语句是在pl/sql developer上执行的,在sqlplus上执行也是一样的. 
所以oracle sql引擎会把常量自动的理解为目标字段的类型来处理的,对于任何类型应该都是一样的. 
 
反过来一个过程执行 
 

declare 
  v_code char(3); 
begin 
  v_code:='aaa'; 
  update userinfo2 set user_name='hapyy' where user_code=v_code; 
  commit; 
end; 
 

结果是会得到正确的修改,应为在这个例子中恰巧user_code存在长度为3的,如果把v_code定义为char(n) n>3,那么结果还是不会变化,因为没有匹配的条件存在. 
  
4)、一些专用于varchar2的函数的说明 
当我们定义了某个字段的类型为varchar2(n)的时候,主要是为了处理中文字符集,这个时候必须有一些专门的函数来处理其中的字符. 
4.1  substrb      
4.2  instrb

5)、总结 
4.1) 使用场合 
一般情况下不要用char(n)来作为字段类型,这样可能在编写过程时要比较小心一些。
而且会占用多余的空间,所以,建议多数场合用varchar2。 

4.2) 速度和效率 
char是定长的,oracle处理这种类型可以花费更少的时间,如果用于存储一些不变长度的信息,其实十分的合适,例如empid,user_id,id之类的东西.
如果系统不大,并发要求不高,则什么类型都不是很关键. 

对于用什么类型存储什么数据还是很讲究的,大家可以深入研究下。