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

Одна вещь, которую я понял, это varchar, имеющий переменную длину. но что в приведенном выше случае - если название улицы больше 10 символов, - то по умолчанию он увеличивает его размер на 10 единиц? , Просьба уточнить.ли VARCHAR увеличивает емкость переменной, назначенной ему?

+2

Также обратите внимание, что емкость может быть в байтах, а не символы (т.е. вы не можете быть в состоянии соответствовать 10 смайликов) , – Thilo

ответ

1

Нет, это не так, как это работает. CHAR является фиксированной строкой: так что если вы помещаете меньше этой длины, она дополняется, предположительно, пробелами; если вы положили больше, то он усечен выдает сообщение об ошибке. VARCHARVARCHAR2 в Oracle) выделяет максимальную длину, но никакая добавка не будет добавлена ​​к строке, если вы не соответствуете этой длине; опять же, Ваш ввод будет усечен, вы получите сообщение об ошибке, если оно слишком велико (поле не будет расти автоматически).

Для произвольного ввода текста вы должны использовать тип BLOB или CLOB. Либо это, либо где-то сохраните текст в файловой системе и укажите его путь в вашей БД.

+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; 
Смежные вопросы