В чем разница между varchar и varchar2 в Oracle?
в чем разница между varchar и varchar2?
8 ответов
на данный момент они являются синонимами.
VARCHAR
зарезервирован Oracle
для поддержки различия между NULL
и пустая строка в будущем, как ANSI
стандарт предписывает.
VARCHAR2
не различает NULL
и пустая строка, и никогда не будет.
если вы полагаетесь на пустую строку и NULL
будучи тем же самым, вы должны использовать VARCHAR2
.
В настоящее время VARCHAR ведет себя точно так же, как VARCHAR2. Однако этот тип не следует использовать, поскольку он зарезервирован для будущего использования.
взято из: разница между CHAR, VARCHAR, VARCHAR2
взято из последней стабильной версии Oracle 12.2: Типы Данных
главное отличие в том, что VARCHAR2
это внутренний тип данных и VARCHAR
это внешний тип данных. Поэтому нам нужно понять разницу между внутренним и внешним типом данных...
внутри базы данных, значения хранятся в Столбцах в таблицах. Внутри Oracle представляет данные в определенных форматах, известных как внутренние типы данных.
В общем случае приложения OCI (Oracle Call Interface) работают не с внутренними представлениями типа данных, а с типами данных языка хоста, которые предопределены языком, на котором они написаны. При передаче данных между клиентским приложением OCI и таблицей базы данных библиотеки OCI преобразуют данные между внутренними и внешними типами данных.
внешние типы обеспечивают удобство для программист путем делать его возможным работать с типами языка хозяина вместо собственнических форматов данных. OCI может выполнять широкий спектр преобразований типов данных при передаче данных между базой данных Oracle и приложением OCI. Внешних типов данных OCI больше, чем внутренних типов данных Oracle.
на VARCHAR2
тип данных представляет собой строку символов переменной длины с максимальной длиной 4000 байт. Если init.параметр Ora max_string_size по умолчанию, максимальный длина VARCHAR2
может быть 4000 байт. Если init.параметр Ora max_string_size = extended, максимальная длина a VARCHAR2
может быть 32767 байт
на VARCHAR
тип данных хранит символьные строки различной длины. Первые 2 байта содержат длину символьной строки, а остальные байты содержат строку. Указанная длина строки в вызове bind или define должна включать два байта длины, поэтому самый большой VARCHAR
строка, которую можно получить или отправить 65533 байт, а не 65535.
быстрый тест в базе данных 12.2 предполагает, что в качестве внутренний тип данных, Oracle по-прежнему лечит VARCHAR
как псевдотип на VARCHAR2
. Это не SYNONYM
который является фактическим типом объекта в Oracle.
SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> create table test (my_char varchar(20));
Table created.
SQL> desc test
Name Null? Type
MY_CHAR VARCHAR2(20)
есть также некоторые последствия VARCHAR
для параметров Precompiler ProC / C++. Для интересующихся программистов ссылка находится по адресу:Pro*C/C++ руководство программиста
после некоторых экспериментов (см. Ниже) я могу подтвердить, что по состоянию на сентябрь 2017 года ничего не изменилось в отношении функциональности, описанной в принято отвечать:-
-
rextester демо для Oracle 11g:
Пустые строки вставляются как
NULL
s для обоихVARCHAR
иVARCHAR2
. - LiveSQL демо для Oracle 12c: те же результаты.
в историческая причина этих двух ключевых слов хорошо объясняется в ответ на другой вопрос.
в настоящее время они одинаковы. но раньше
- где-то в сети, я читал, что,
VARCHAR
зарезервирован Oracle для поддержки различия между NULL
и пустая строка в будущем, как предписывает стандарт ANSI.
VARCHAR2
не различает NULL
и пустая строка, и никогда не будет.
- и
Emp_name varchar(10)
- если вы вводите значение менее 10 цифр, то остальные пространство нельзя удалить. он использовал всего 10 мест.
Emp_name varchar2(10)
- если вы вводите значение менее 10 цифр, то оставшееся пространство автоматически удаляется
VARCHAR2
используется для хранения строк символов переменной длины. Длина строкового значения будет храниться на диске вместе с самим значением.
variable x varchar2(10)
begin
:x := 'hullo';
end;
/
тип varchar
ведет себя точно так же, как VARCHAR2. Однако этот тип не следует использовать, поскольку он зарезервирован для будущего использования
VARCHAR может хранить до 2000 байт символов, в то время как VARCHAR2 может хранить до 4000 байт символов.
-
если мы объявим тип данных как VARCHAR, он будет занимать место для значений NULL. В случае типа данных VARCHAR2 он не будет занимать места для значений NULL. например,
name varchar(10)
зарезервирует 6 байт памяти, даже если имя " Ravi__", тогда как
name varchar2(10)
оставляем пробел в соответствии с длиной входной строки. например, 4 байта памяти для ' Ravi__'.
здесь _ представляет NULL.
Примечание: varchar зарезервирует место для нулевых значений, а varchar2 не зарезервирует место для нулевых значений.
отличия:
-
VARCHAR
может хранить до 2000 байт символов, в то время какVARCHAR2
может хранить до 4000 байт символов. - если мы объявим тип данных как
VARCHAR
тогда он будет занимать место дляNULL
значения, в случаеVARCHAR2
тип данных он не будет занимать никакого места.
сходство:
-
VARCHAR
иVARCHAR2
оба переменных характер.