В чем разница между varchar и varchar2?
oracle
sqldatatypes
hrishi
источник
источник
Ответы:
На данный момент они являются синонимами.
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 является значением по умолчанию, максимальная длина aVARCHAR2
может быть 4000 байтов. Если параметр init.ora max_string_size = extended, максимальная длина aVARCHAR2
может составлять 32767 байт.Тип
VARCHAR
данных хранит строки символов различной длины. Первые 2 байта содержат длину строки символов, а остальные байты содержат строку. Указанная длина строки в привязке или вызове define должна включать два байта длины, поэтому наибольшаяVARCHAR
строка, которую можно получить или отправить, имеет длину 65533 байта, а не 65535.Быстрый тест в базе данных 12.2 предполагает , что в качестве внутреннего типа данных , Oracle все еще лечит
VARCHAR
как псевдотип дляVARCHAR2
. Это НЕSYNONYM
фактический тип объекта в Oracle.Существуют также некоторые значения параметров
VARCHAR
прекомпилятора ProC / C ++. Для программистов, которые заинтересованы, ссылка на: Pro * C / C ++ Руководство программистаисточник
VARCHAR
все еще лечит'' == null
?После некоторых экспериментов (см. Ниже) я могу подтвердить, что по состоянию на сентябрь 2017 года ничего не изменилось в отношении функциональности, описанной в принятом ответе : -
NULL
s для обоихVARCHAR
иVARCHAR2
.Историческая причина этих двух ключевых слов хорошо объясняется в ответе на другой вопрос .
источник
VARCHAR может хранить до 2000 байтов символов, тогда как VARCHAR2 может хранить до 4000 байтов символов.
Если мы объявим тип данных как VARCHAR, он будет занимать пространство для значений NULL. В случае типа данных VARCHAR2 он не будет занимать место для значений NULL. например,
name varchar(10)
зарезервирует 6 байтов памяти, даже если имя «Ravi__», тогда как
зарезервирует место в соответствии с длиной входной строки. например, 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;
VARCHAR является синонимом VARCHAR2. Однако вы не должны использовать VARCHAR, потому что Oracle может изменить свою семантику в будущем.
источник