Oracle varchar2或char类型的byte和char的区别(2)

这个INSERT成功了,而且可以看到,所有插入数据的长度(LENGTH)就是一个字符,所有字符串函数都以字符为单位工作。LENGTHB函数(字节长度)显示出这个字段占用了2字节的存储空间,另外DUMP函数显示了这些字节到底是什么。这个例子展示了VARCHAR2(N)并不一定存储N个字符,而只是存储N个字节。
下面测试VARCHAR2(4000)可能存储不了4000个字符
linuxidc@ORCL>declare
  2  l_date varchar2(4000 char);
  3  l_ch  varchar2(1 char) := unistr('\00d6');
  4  begin
  5  l_date:=rpad(l_ch,4000,l_ch);
  6  insert into t(c) values(l_date);
  7  end;
  8  /
declare
*
ERROR at line 1:
ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at line 6

在此显示出,一个4000字符的实际上长度为8000字节,这样一个字符串无法永久地存储在一个VARCHAR(4000 char)字段中,这个字符串能放在PL/SQL变量中,因为在PL/SQL中VARCHAR2最大可以达到32K。不过,存储在表中,VARCHAR2则被硬性限制为最多只能存放4000字节。我们可以成功地存储其中2000个字符:
linuxidc@ORCL>declare
  2  l_date varchar2(4000 char);
  3  l_ch  varchar2(1 char) := unistr('\00d6');
  4  begin
  5  l_date:=rpad(l_ch,2000,l_ch);
  6  insert into t(c) values(l_date);
  7  end;
  8  /
 
PL/SQL procedure successfully completed. 
 
linuxidc@ORCL>
zx@ORCL>select length(c),lengthb(c) from t where c is not null;
 
 LENGTH(C) LENGTHB(C)
---------- ----------
      2000      4000

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fc856a514a6f792e169415bdd550951d.html