Ответы:
На данный момент они являются синонимами.
VARCHAR
зарезервировано Oracle
для поддержки различий между NULL
пустой строкой в будущем, как это ANSI
предусмотрено стандартом.
VARCHAR2
не различает NULL
пустую строку и никогда не будет.
Если вы полагаетесь на пустую строку и NULL
то же самое, вы должны использовать VARCHAR2
.
VARCHAR2
потому что в настоящее время нет типа, который ведет себя как VARCHAR
следует. На самом деле, вы не должны использовать VARCHAR
вообще, пока это не реализовано должным образом.
where x is NULL
возвращает различные результаты where x = ''
вовсе не означает , что NULL
и ''
в любом случае различны. Различное поведение связано с =
оператором.
В настоящее время VARCHAR ведет себя точно так же, как VARCHAR2. Однако тип VARCHAR
не должен использоваться, поскольку он зарезервирован для использования в будущем.
Взято из: Разница между CHAR, VARCHAR, VARCHAR2
VARCHAR
не должен использоваться. Я отредактировал его
Взято из последней стабильной рабочей версии Oracle 12.2: Типы данных
Основное различие заключается в том , что VARCHAR2
это внутренний тип данных и VARCHAR
представляет собой внешний тип данных . Итак, нам нужно понять разницу между внутренним и внешним типом данных ...
Внутри базы данных значения хранятся в виде столбцов в таблицах. Внутренне Oracle представляет данные в определенных форматах, известных как внутренние типы данных .
В общем, приложения OCI (Oracle Call Interface) не работают с внутренними представлениями типов данных, но с типами данных на языке хоста, которые предопределены языком, на котором они написаны. Когда данные передаются между клиентским приложением OCI и таблицей базы данных, библиотеки OCI преобразуют данные между внутренними типами данных и внешними типами данных.
Внешние типы обеспечивают программисту удобство, позволяя работать с типами основного языка вместо проприетарных форматов данных. OCI может выполнять широкий спектр преобразований типов данных при передаче данных между базой данных Oracle и приложением OCI. Существует больше внешних типов данных OCI, чем внутренних типов данных Oracle.
Тип VARCHAR2
данных - это строка символов переменной длины с максимальной длиной 4000 байтов. Если параметр init.ora max_string_size является значением по умолчанию, максимальная длина a VARCHAR2
может быть 4000 байтов. Если параметр init.ora max_string_size = extended, максимальная длина a VARCHAR2
может составлять 32767 байт.
Тип VARCHAR
данных хранит строки символов различной длины. Первые 2 байта содержат длину строки символов, а остальные байты содержат строку. Указанная длина строки в привязке или вызове 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
прекомпилятора ProC / C ++. Для программистов, которые заинтересованы, ссылка на: Pro * C / C ++ Руководство программиста
После некоторых экспериментов (см. Ниже) я могу подтвердить, что по состоянию на сентябрь 2017 года ничего не изменилось в отношении функциональности, описанной в принятом ответе : -
NULL
s для обоихVARCHAR
иVARCHAR2
.Историческая причина этих двух ключевых слов хорошо объясняется в ответе на другой вопрос .
VARCHAR может хранить до 2000 байтов символов, тогда как VARCHAR2 может хранить до 4000 байтов символов.
Если мы объявим тип данных как VARCHAR, он будет занимать пространство для значений NULL. В случае типа данных VARCHAR2 он не будет занимать место для значений NULL. например,
name varchar(10)
зарезервирует 6 байтов памяти, даже если имя «Ravi__», тогда как
name varchar2(10)
зарезервирует место в соответствии с длиной входной строки. например, 4 байта памяти для 'Ravi__'.
Здесь _ представляет NULL.
ПРИМЕЧАНИЕ: varchar зарезервирует пространство для нулевых значений, а varchar2 не зарезервирует пространство для нулевых значений.
VARCHAR
с толку CHAR
.
В настоящее время они одинаковы. но ранее
VARCHAR
зарезервировано Oracle для поддержки различий между NULL
пустой строкой и в будущем, как предписывает стандарт ANSI.
VARCHAR2
не различает NULL
пустую строку и никогда не будет.
Emp_name varchar(10)
- если вы введете значение менее 10 цифр, оставшееся пространство не может быть удалено. он использовал всего 10 пробелов.
Emp_name varchar2(10)
- если вы введете значение менее 10 цифр, оставшееся пространство будет автоматически удалено
create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;