В чем разница между 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
имеют переменный характер.