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之类的东西.当然了,如果您的系统不大,并发要求不高,则什么类型都不是很关键. 所以现在有的人对于用什么类型存储什么数据还是很讲究的.少量数据,差别可能不大,多了还是有一定影响的.
char与varchar2的区别
猜你喜欢
转载自newerdragon.iteye.com/blog/1668597
今日推荐
周排行