`
phoenix007
  • 浏览: 430320 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle中的CHAR和VARCHAR2的区别

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

 

 

 

分享到:
评论

相关推荐

    浅析Oracle中char和varchar2的区别 电脑资料.docx

    浅析Oracle中char和varchar2的区别 电脑资料.docx

    oracle char,varchar,varchar2的区别和使用方法

    oracle char,varchar,varchar2的区别和使用方法 非本人总结,但是说的挺好的! 欢迎下载

    oracle中varchar2(byte)和varchar2(char).doc

    oracle中varchar2(byte)和varchar2(char) 细节决定成败,大家在设计数据库建表的时候一定要注意。

    浅析Oracle中char和varchar2的区别

    char是定长的 char(10) varchar2(10) 同样存 a ,char占用了10个字符,varchar2 ... 您可能感兴趣的文章:oracle to_char函数将number转成stringOracle to_char函数的使用方法SQL中Charindex和Oracle中对应的函数Instr

    ORACLE中的数据类型.doc

    NCHAR() 和 NVARCHAR2() NCHAR() 和 NVARCHAR2()数据类型分别与CHAR() 和 VARCHAR2()类型是相同的,只不过它们用来存储NLS(National Language Support)数据。 LONG LONG 数据类型是一个遗留下来的而且在将来不会...

    Oracle接收长度大于4000的字符串

    Oracle接收长度大于4000的字符串 Oracle接收长度大于4000的字符串

    Oracle P/L SQL实现FTP上传、下载功能

    AccountInfo VarChar2(1000), TransferMethod Char(1), --A: ASCII, E: EBCDIC, I: IMAGE TransferOption Char(1), LocalDirectory VarChar2(30), LastReply VarChar2(32767 ) ); ...

    Oracle 数据类型

    Oracle的数据类型: 1、CHAR数据类型,该类型是固定长度的字符串,如果没指定大小,则默认占用一字节,如果输入的值小于... 8、ORACLE其实也支持INTEGER,FLOAT,DOUBLE,VARCHAR,最好用ORACLE自身的NUMBER 和 VARCHAR2

    Oracle常用字符串处理函数

    、string是数据库中类型为CHAR或VARCHAR2的列名(或常量串); <2>、set是要截断的字符,set必须用单引号括起,方括号表示set(加上前面的逗号)是可选的。 如果没有字符,函数则缺省自动截断空格;

    北大青鸟Oracle教程集2

    Oracle主要 Oracle主要 数据类型 4-1 Character 数据类型 Number 数据类型 Date 数据类型 Raw 和 Long Raw 数据类型 LOB 数据类型 Oracle 主要数据类型 4-2 Character 数据类型 ― Char ― Varchar2 ― Long Number ...

    ORACLE多表关联的update语句

    city_name varchar2(10) not null, -- 所在城市 customer_type char(2) not null, -- 客户类型 ... ) create unique index PK_customers on customers (customer_id) 由于某些原因,客户所在城市这个信息并...

    05.Oracle数据类型1

    2、变长度的字符串变长度字符串用varchar2表示,与char类型不同,Oracle不会在数据内容后面填充任何内容 3、char和varchar2的比较cha

    oracle-char-query:如何使用Oracle jdbc驱动程序fixedString属性?

    默认情况下,没有空白填充,因此,例如,CHAR(4)中的“ a”不等于“ a”。 如果为真,则这两个将相等。 如何使用? 添加Maven依赖项 < groupId>org.shenjia < artifactId>oracle-char-query < version>1.0.0...

    Oracle内置SQL函数-分类整理大全

    字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的,比如: VARCHAR2数值被限制为2000字符(ORACLE 8中为4000字符),而CHAR数值被限制为255字符(在ORACLE8中是2000).当在过程性语句中使用时,它们可以被...

    MySQL中把varchar类型转为date类型方法详解

    下面接着看下oracle中varchar类型的日期格式转换date类型 oracle中varchar类型的日期格式转换date类型 SELECT to_char(to_date(m.ma_datetime,'yyyy-MM-dd hh24:mi:ss'), 'yyyyMMdd') FROM my_task m; m.ma_datet

    ORACLE实现自定义序列号生成

    pk1 VARCHAR2(32) primary key, atype VARCHAR2(20) not null, owner VARCHAR2(10) not null, initcycle CHAR(1) not null, cur_sernum VARCHAR2(50) not null, zero_flg VARCH

    Oracle数据类型说明

    Oracle数据类型说明,CHAR VARCHAR2 NCHAR NVARCHAR2 等

    北大青鸟Oracle教程集1

    Oracle主要 Oracle主要 数据类型 4-1 Character 数据类型 Number 数据类型 Date 数据类型 Raw 和 Long Raw 数据类型 LOB 数据类型 Oracle 主要数据类型 4-2 Character 数据类型 ― Char ― Varchar2 ― Long Number ...

Global site tag (gtag.js) - Google Analytics