В чем разница между varchar и varchar2 в Oracle?

209

В чем разница между varchar и varchar2?

Теги:
sqldatatypes

8 ответов

264
Лучший ответ

На данный момент они являются синонимами.

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

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

Если вы полагаетесь на пустую строку и NULL на то же самое, вы должны использовать VARCHAR2.

  • 33
    Не слышал этого обоснования раньше, это полезно. Благодарю. Для справки, все еще совершенно нелепо, что основным типом персонажа в Oracle является «varchar2». Разве это не поражает кого-то еще как ужасный клудж? Похоже, я бы решил какую-то проблему на первой неделе обучения программированию.
  • 7
    @Ian: основным типом является VARCHAR2 потому что в настоящее время нет типа, который ведет себя так, как должен VARCHAR . На самом деле, вы не должны использовать VARCHAR вообще, пока он не будет реализован должным образом.
Показать ещё 18 комментариев
34

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

Взято из: Разница между CHAR, VARCHAR, VARCHAR2

  • 2
    это все еще точный / правильный ответ?
  • 0
    @PhilipRego VARCHAR не должен использоваться. Я редактировал это
17

Взято из последней стабильной версии 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

  • 0
    значит ли это, что VARCHAR прежнему обрабатывает '' == null ?
  • 1
    Да. Обсуждение внутренних и внешних типов выше взято из ссылки OCI. Справочник по языку 12.2 SQL по- прежнему содержит тот же оператор «не использовать», который он всегда имел для VARCHAR.
Показать ещё 2 комментария
2

После некоторых экспериментов (см. ниже) я могу подтвердить, что с сентября 2017 года ничего не изменилось в отношении функциональности, описанной в принятом ответе: -

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

1

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

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

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

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

  1. Также,

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

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

0

VARCHAR2

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

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

VARCHAR

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

-1

Разница:

  • VARCHAR может хранить до 2000 байтов символов, в то время как VARCHAR2 может хранить до 4000 байтов символов.
  • Если мы объявим тип данных как VARCHAR тогда он будет занимать пространство для значений NULL В случае типа данных VARCHAR2 он не займет какое-либо пространство.

Сходство:

  • VARCHAR и VARCHAR2 имеют переменный характер.

источник

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

  • Если мы объявим тип данных как VARCHAR, тогда он займет место для значений NULL. В случае типа данных VARCHAR2 он не будет занимать места для значений NULL. например.

    name varchar(10)

зарезервирует 6 байтов памяти, даже если имя "Ravi__", тогда как

name varchar2(10) 

зарезервирует место в соответствии с длиной входной строки. например, 4 байта памяти для "Ravi __".

Здесь _ представляет NULL.

ПРИМЕЧАНИЕ. varchar зарезервирует пространство для нулевых значений, и varchar2 не зарезервирует места для нулевых значений.

  • 1
    Я думаю, что этот ответ путает VARCHAR с CHAR .
  • 0
    я отредактировал ответ сейчас

Ещё вопросы

Сообщество Overcoder
Наверх
Меню