VARCHAR会增加分配给它的变量的容量吗?

时间:2016-01-21 10:26:43

标签: plsql oracle11g

City CHAR(10),
Street VARCHAR(10)

我理解的一件事是varchar具有可变长度。但是在上面的例子中 - 如果街道名称超过10个字符 - 那么它默认会再增加10个单位吗? 。请澄清一下。

3 个答案:

答案 0 :(得分:2)

不,如果您尝试插入更大的字符串,则会收到错误。

Database SQL Language Reference

  

VARCHAR2数据类型
  VARCHAR2数据类型指定可变长度字符串。创建VARCHAR2列时,提供它可以容纳的最大字节数或字符数。 Oracle随后将列中的每个值完全按照您指定的方式存储,前提是该值不超过列的最大长度。如果您尝试插入超过指定长度的值,则Oracle会返回错误。

答案 1 :(得分:1)

不,那不是它的运作方式。 CHAR是一个用字符串固定的:所以如果你把那个长度减去,那么就用空格填充它;如果你输入更多,被截断会引发错误。 VARCHAR(以及Oracle中的VARCHAR2)分配最大长度,但如果您不满足该长度,则不会向字符串添加填充;然而,再次,您的输入将被截断如果它太大(该字段不会自动增长),您将收到错误。

对于任意文字输入,您使用BLOBCLOB类型。要么是这样,要么将文本存储在某个文件系统中并指向它在数据库中的路径。

答案 2 :(得分:1)

创建测试用例很容易,看看它是如何工作的:

create table test1 (col1 char(10),
                    col2 varchar(10));

-- create data with varying lengths
insert into test1 (col1, col2)
select lpad('a', level, 'a') col1,
       lpad('a', level, 'a') col2
from   dual
connect by level <= 10;

-- see the length of the stored values for each row
select col1, col2, length(col1), length(col2)
from   test1
order by col1, col2;

COL1       COL2       LENGTH(COL1) LENGTH(COL2)
---------- ---------- ------------ ------------
a          a                    10            1
aa         aa                   10            2
aaa        aaa                  10            3
aaaa       aaaa                 10            4
aaaaa      aaaaa                10            5
aaaaaa     aaaaaa               10            6
aaaaaaa    aaaaaaa              10            7
aaaaaaaa   aaaaaaaa             10            8
aaaaaaaaa  aaaaaaaaa            10            9
aaaaaaaaaa aaaaaaaaaa           10           10

-- insert 11 characters into col1
insert into test1 (col1, col2)
values ('12345678901', null);

ORA-12899: value too large for column "SCHEMA"."TEST1"."COL1" (actual: 11, maximum: 10)

-- insert 11 characters into col2
insert into test1 (col1, col2)
values (null, '12345678901');

ORA-12899: value too large for column "SCHEMA"."TEST1"."COL2" (actual: 11, maximum: 10)

commit;

drop table test1;