ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Reference-PL/SQL数据类型-SQL数据类型-CHAR和VARCHAR2变量

PLSQL Language Reference-PL/SQL数据类型-SQL数据类型-CHAR和VARCHAR2变量

原创 Oracle 作者:LuiseDalian 时间:2014-03-09 17:18:56 0 删除 编辑

0.1.1 CHAR和VARCHAR2变量

(1)   赋予和插入太长的值

--给字符变量赋值,超出了它的最大大小

DECLARE

  c VARCHAR2(3 CHAR);

BEGIN

  c := 'abc  ';

END;

/

 

 

--将字符变量插入到列中,它的值超出了列的大小

DROP TABLE t;

CREATE TABLE t (c CHAR(3 CHAR));

 

DECLARE

  s VARCHAR2(5 CHAR) := 'abc  ';

BEGIN

  INSERT INTO t(c) VALUES(s);

END;

/

 

--在将字符串插入到列中之前,使用RTRIM函数去除尾部空格

DECLARE

  c VARCHAR2(3 CHAR);

BEGIN

  c := RTRIM('abc  ');

  INSERT INTO t(c) VALUES(RTRIM('abc  '));

END;

/

(2)对多字节字符声明变量

CHAR和VARCHAR2变量的最大值是32767字节,不管你是以字符还是字节指定最大值。在变量中存储的最大字符数取决于字符集,有时也依赖于字符本身。

单字节字符集

32767

n字节定宽字符集

FLOOR(32, 767/n)

n字节变宽字符集

FLOOR(32, 767/n)~32767

当声明CHAR和VARCHAR2变量时,为了确保在任何字符集下都能存储n个字符,要以字符的形式来指定它的大小CHAR(n CHAR), VARCHAR2(n CHAR),n不要超过FLOOR(32767/4) = 8191

(3)CHAR和VARCHAR2的区别

I 预定义的子类型

CHARACTER<-CHAR

VARCHAR(SQL,  PL/SQL),  STRING(PL/SQL) <- VARCHAR2

II 内存分配

CHAR在编译时分配的内存为最大值。

VARCHAR2内存分配依赖于最大值:如果最大值 < 4000字节,在编译时根据最大值分配内存;如果是大值 >= 4000字节,根据实际值分配内存。

a VARCHAR2(3999);

b VARCHAR2(4000);

--如果将一个500字节的值赋值给a和b,在编译时给a分配3999字节

--b分配500字节

即PL/SQL对小的VARCHAR2进行性能优化,对大的VARCHAR2进行有效内存使用方面的优化。

III 空白填充

当赋给变量的值比变量的最大值小,当插入到列中的值比例的宽度小,当从列获取的值比变量的最大值小,如果接收者类型为CHAR,则使用空格填充到最大值,原来的尾部空白信息丢失;如果接收者类型为VARCHAR2,则不填充,没有信息丢失。

DECLARE

    first_name  CHAR(10 CHAR);

    last_name   VARCHAR2(10 CHAR);

BEGIN

    first_name := 'John ';

    last_name  := 'Chen ';

 

    DBMS_OUTPUT.PUT_LINE('*' || first_name || '*');

    DBMS_OUTPUT.PUT_LINE('*' || last_name || '*');

END;

IV 值比较

SQL的字符比较规则适用于PL/SQL字符比较。当2个比较的字符有1个或2个为VARCHAR2或NVARCHAR2类型,则采用无填充比较语义,否则采用空白填充比较语义。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1104099/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    6043830