设为首页 收藏本站
查看: 685|回复: 0

[经验分享] Oracle中的CHAR和VARCHAR2的区别

[复制链接]

尚未签到

发表于 2016-7-25 06:53:00 | 显示全部楼层 |阅读模式
       严格来说CHAR和VARCHAR2是不一样的.
       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');



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之类的东西.当然了,如果您的系统不大,并发要求不高,则什么类型都不是很关键.
   所以现在有的人对于用什么类型存储什么数据还是很讲究的.少量数据,差别可能不大,多了还是有一定影响的.



  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248826-1-1.html 上篇帖子: Oracle数据库临时表管理心得 下篇帖子: Oracle数据库触发器小结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表