City CHAR(10),
Street VARCHAR(10)
我明白的一件事就是varchar的長度是可變的。但在上述情況下 - 如果街道的名稱超過10個字符 - 那麼默認情況下它會再次增加10個單位的大小? 。請澄清一下。確實VARCHAR增加了分配給它的變量的容量嗎?
City CHAR(10),
Street VARCHAR(10)
我明白的一件事就是varchar的長度是可變的。但在上述情況下 - 如果街道的名稱超過10個字符 - 那麼默認情況下它會再次增加10個單位的大小? 。請澄清一下。確實VARCHAR增加了分配給它的變量的容量嗎?
不,這不是它的工作原理。 CHAR
是一個固定的字符串:所以如果你減少那個長度,它被填充,大概是空格;如果放多了,它將被截斷會引發錯誤。 VARCHAR
(和Oracle中的VARCHAR2
)分配最大長度,但如果不符合該長度,則不會向該字符串添加填充;然而,再次,您的輸入將被截斷如果它太大(該字段不會自動增長),您將得到一個錯誤。
對於任意文本輸入,您可以使用BLOB
或CLOB
類型。要麼,要麼將文本存儲在文件系統中某處,並指向其在數據庫中的路徑。
「*您的輸入將被截斷,如果它太大*」 - 這是錯誤的。如果您嘗試分配一個大於其最大值的值,則會引發錯誤。 –
你是對的:我糾正了......一段時間以來,我做了任何嚴重的SQL!編輯 – Xophmeister
不,你會得到一個錯誤,如果你試圖插入一個更大的字符串。
Database SQL Language Reference:
VARCHAR2數據類型
VARCHAR2數據類型規定一個可變長度的字符串。當你創建一個VARCHAR2列時,你提供了它可以容納的最大字節數或字節數。 Oracle隨後按照您指定的方式將每個值存儲在列中,只要該值不超過列的最大長度。如果嘗試插入超過指定長度的值,則Oracle返回錯誤。
可以很容易地創建一個測試案例,看看它是如何工作的:
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;
還要注意的是,容量有可能以字節爲單位,而不是以字符(例如,你可能不能夠適應10表情符號中) 。 – Thilo