В чем разница между 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 года ничего не изменилось в отношении функциональности, описанной в принято отвечать:-

  1. rextester демо для Oracle 11g: Пустые строки вставляются как NULLs для обоих VARCHAR и VARCHAR2.
  2. LiveSQL демо для Oracle 12c: те же результаты.

в историческая причина этих двух ключевых слов хорошо объясняется в ответ на другой вопрос.


в настоящее время они одинаковы. но раньше

  1. где-то в сети, я читал, что,

VARCHAR зарезервирован Oracle для поддержки различия между NULL и пустая строка в будущем, как предписывает стандарт ANSI.

VARCHAR2 не различает NULL и пустая строка, и никогда не будет.

  1. и

Emp_name varchar(10) - если вы вводите значение менее 10 цифр, то остальные пространство нельзя удалить. он использовал всего 10 мест.

Emp_name varchar2(10) - если вы вводите значение менее 10 цифр, то оставшееся пространство автоматически удаляется


VARCHAR2

используется для хранения строк символов переменной длины. Длина строкового значения будет храниться на диске вместе с самим значением.

variable x varchar2(10)
begin
 :x := 'hullo';
end;
/

тип varchar

ведет себя точно так же, как VARCHAR2. Однако этот тип не следует использовать, поскольку он зарезервирован для будущего использования


  1. VARCHAR может хранить до 2000 байт символов, в то время как VARCHAR2 может хранить до 4000 байт символов.

  2. если мы объявим тип данных как 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 оба переменных характер.

источник