City CHAR(10),
Street VARCHAR(10)
我理解的一件事是varchar具有可变长度。但是在上面的例子中 - 如果街道名称超过10个字符 - 那么它默认会再增加10个单位吗? 。请澄清一下。
答案 0 :(得分:2)
不,如果您尝试插入更大的字符串,则会收到错误。
Database SQL Language Reference:
VARCHAR2数据类型
VARCHAR2数据类型指定可变长度字符串。创建VARCHAR2列时,提供它可以容纳的最大字节数或字符数。 Oracle随后将列中的每个值完全按照您指定的方式存储,前提是该值不超过列的最大长度。如果您尝试插入超过指定长度的值,则Oracle会返回错误。
答案 1 :(得分:1)
不,那不是它的运作方式。 CHAR
是一个用字符串固定的:所以如果你把那个长度减去,那么就用空格填充它;如果你输入更多,被截断会引发错误。 VARCHAR
(以及Oracle中的VARCHAR2
)分配最大长度,但如果您不满足该长度,则不会向字符串添加填充;然而,再次,您的输入将被截断如果它太大(该字段不会自动增长),您将收到错误。
对于任意文字输入,您使用BLOB
或CLOB
类型。要么是这样,要么将文本存储在某个文件系统中并指向它在数据库中的路径。
答案 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;