2016-01-21 42 views
0
City CHAR(10), 
Street VARCHAR(10) 

我明白的一件事就是varchar的長度是可變的。但在上述情況下 - 如果街道的名稱超過10個字符 - 那麼默認情況下它會再次增加10個單位的大小? 。請澄清一下。確實VARCHAR增加了分配給它的變量的容量嗎?

+2

還要注意的是,容量有可能以字節爲單位,而不是以字符(例如,你可能不能夠適應10表情符號中) 。 – Thilo

回答

1

不,這不是它的工作原理。 CHAR是一個固定的字符串:所以如果你減少那個長度,它被填充,大概是空格;如果放多了,它將被截斷會引發錯誤。 VARCHAR(和Oracle中的VARCHAR2)分配最大長度,但如果不符合該長度,則不會向該字符串添加填充;然而,再次,您的輸入將被截斷如果它太大(該字段不會自動增長),您將得到一個錯誤。

對於任意文本輸入,您可以使用BLOBCLOB類型。要麼,要麼將文本存儲在文件系統中某處,並指向其在數據庫中的路徑。

+4

「*您的輸入將被截斷,如果它太大*」 - 這是錯誤的。如果您嘗試分配一個大於其最大值的值,則會引發錯誤。 –

+0

你是對的:我糾正了......一段時間以來,我做了任何嚴重的SQL!編輯 – Xophmeister

2

不,你會得到一個錯誤,如果你試圖插入一個更大的字符串。

Database SQL Language Reference

VARCHAR2數據類型
VARCHAR2數據類型規定一個可變長度的字符串。當你創建一個VARCHAR2列時,你提供了它可以容納的最大字節數或字節數。 Oracle隨後按照您指定的方式將每個值存儲在列中,只要該值不超過列的最大長度。如果嘗試插入超過指定長度的值,則Oracle返回錯誤。

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;