В чем разница между varchar и varchar2?
В чем разница между varchar и varchar2 в Oracle?
Ответ 1
На данный момент они являются синонимами.
 VARCHAR зарезервирован Oracle, чтобы поддерживать различие между NULL и пустой строкой в будущем, как указано в стандарте ANSI.
 VARCHAR2 не различает a NULL и пустую строку и никогда не будет.
Если вы полагаетесь на пустую строку и NULL на то же самое, вы должны использовать VARCHAR2.
Ответ 2
 В настоящее время VARCHAR ведет себя точно так же, как и VARCHAR2. Однако тип VARCHAR не должен использоваться, поскольку он зарезервирован для будущего использования.
Взято из: Разница между CHAR, VARCHAR, VARCHAR2
Ответ 3
Взято из последней стабильной версии 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, максимальная длина 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 для ProC/C++ Precompiler. Для программистов, которые заинтересованы, ссылка находится по адресу: Pro * C/C++ Programmer Guide
Ответ 4
После некоторых экспериментов (см. ниже) я могу подтвердить, что с сентября 2017 года ничего не изменилось в отношении функциональности, описанной в принятом ответе: -
-   Демо-версия реестров для Oracle 11g:
Пустые строки вставляются как NULLдляVARCHARиVARCHAR2.
- Демо-версия LiveSQL для Oracle 12c: Те же результаты.
Историческая причина этих двух ключевых слов хорошо объясняется в ответе на другой вопрос.
Ответ 5
В настоящее время они одинаковы. но ранее
- Где-то в сети, я читал это,
 VARCHAR зарезервирован Oracle для поддержки различия между NULL и пустой строкой в будущем, как это предписывает стандарт ANSI.
 VARCHAR2 не различает NULL и пустую строку и никогда не будет.
- Также,
 Emp_name varchar(10) - если вы вводите значение менее 10 цифр, то оставшееся пространство не может быть удалено. он использовал всего 10 пробелов.
 Emp_name varchar2(10) - если вы вводите значение менее 10 цифр, то оставшееся пространство автоматически удаляется
Ответ 6
VARCHAR2
используется для хранения строк символов переменной длины. Строковая длина будет сохранена на диске с самим значением.
variable x varchar2(10)
begin
 :x := 'hullo';
end;
/
VARCHAR
ведет себя точно так же, как VARCHAR2. Однако этот тип не должен использоваться, поскольку он зарезервирован для будущего использования.
Ответ 7
-  VARCHAR может хранить до 2000 байт символов, в то время как VARCHAR2 может хранить до 4000 байтов символов. 
-  Если мы объявим тип данных как VARCHAR, тогда он займет место для значений NULL. В случае типа данных VARCHAR2 он не будет занимать места для значений NULL. например. name varchar(10)
зарезервирует 6 байтов памяти, даже если имя "Ravi__", тогда как
name varchar2(10) 
зарезервирует место в соответствии с длиной входной строки. например, 4 байта памяти для "Ravi __".
Здесь _ представляет NULL.
ПРИМЕЧАНИЕ. varchar зарезервирует пространство для нулевых значений, и varchar2 не зарезервирует места для нулевых значений.
Ответ 8
Разница:
-  VARCHARможет хранить до 2000 байтов символов, в то время какVARCHAR2может хранить до 4000 байтов символов.
-  Если мы объявим тип данных как VARCHARтогда он будет занимать пространство для значенийNULLВ случае типа данныхVARCHAR2он не займет какое-либо пространство.
Сходство:
-  VARCHARиVARCHAR2имеют переменный характер.
