8 ответов:
На данный момент они являются синонимами.
VARCHARзарезервированOracleдля поддержки различия междуNULLи пустая строка в будущем, какANSIстандарт предписывает.
VARCHAR2не различает aNULLи пустая строка, и никогда не будет.если вы полагаетесь на пустую строку и
NULLбыть то же самое, вы должны использоватьVARCHAR2.
В настоящее время VARCHAR ведет себя точно так же, как VARCHAR2. Однако этот тип не следует использовать, поскольку он зарезервирован для будущего использования.
взято из: разница между CHAR, VARCHAR, VARCHAR2
взято из последней стабильной производственной версии Oracle 12.2: Типы Данных
главное отличие в том, что
VARCHAR2это внутренний тип данных иVARCHARэто внешний тип данных. Поэтому нам нужно понять разницу между внутренним и внешним типом данных...внутри базы данных, значения хранятся в Столбцах в таблицах. Внутри Oracle представляет данные в определенных форматах, известных как внутренние типы данных.
как правило, приложения OCI (Oracle Call Interface) работают не с внутренними представлениями типов данных, а с типами данных языка хоста, которые предопределены языком, на котором они написаны. Когда данные передаются между клиентским приложением OCI и таблицей базы данных, библиотеки OCI преобразуют данные между внутренними типами данных и внешними типами данных.
внешние типы обеспечивают удобство для программист, сделав возможным работать с типами языков хоста вместо проприетарных форматов данных. OCI может выполнять широкий спектр преобразований типов данных при передаче данных между базой данных Oracle и приложением OCI. Существует больше внешних типов данных OCI, чем внутренних типов данных Oracle.
The
VARCHAR2тип данных представляет собой строку символов переменной длины с максимальной длиной 4000 байт. Если инит.параметр ora max_string_size по умолчанию, максимальный длинаVARCHAR2может быть 4000 байт. Если инит.параметр ora max_string_size = extended, максимальная длина aVARCHAR2может быть 32767 байтThe
VARCHARтип данных хранит символьные строки различной длины. Первые 2 байта содержат длину символьной строки, а остальные байты содержат строку. Указанная длина строки в вызове bind или define должна включать два байта длины, поэтому самый большойVARCHARстрока, которая может быть получена или отправлена 65533 байт длиной, а не 65535.быстрый тест в базе данных 12.2 предполагает, что в качестве внутренний тип данных, Oracle все еще лечит a
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++. Для программистов, которые заинтересованы, ссылка находится по адресу:Pro * C / C++ руководство программиста
после некоторых экспериментов (см. Ниже) я могу подтвердить, что по состоянию на сентябрь 2017 года ничего не изменилось в отношении функциональности, описанной в принято отвечать: -
- rextester demo для Oracle 11g: Пустые строки вставляются как
NULLs для обоихVARCHARиVARCHAR2.- LiveSQL demo для Oracle 12c: те же результаты.
в историческая причина этих двух ключевых слов хорошо объясняется в ответ на другой вопрос.
в настоящее время они одинаковы. но раньше
- где-то в сети, я читал, что,
VARCHARзарезервировано Oracle для поддержки различия междуNULLи пустая строка в будущем, как предписывает стандарт ANSI.
VARCHAR2не различает aNULLи пустая строка, и никогда не будет.
- и
Emp_name varchar(10)- если вы вводите значение менее 10 цифр, то остальные пространство не может быть удален. он использовал всего 10 мест.
Emp_name varchar2(10)- если вы вводите значение менее 10 цифр, то оставшееся пространство автоматически удаляется
VARCHAR2
используется для хранения символьных строк переменной длины. Длина строкового значения будет сохранена на диске вместе с самим значением.
variable x varchar2(10) begin :x := 'hullo'; end; /тип varchar
ведет себя точно так же, как VARCHAR2. Однако этот тип не следует использовать, так как он зарезервирован для дальнейшего использования
VARCHAR может хранить до 2000 байт символов, в то время как VARCHAR2 может хранить до 4000 байт символов.
если мы объявим тип данных как VARCHAR, то он будет занимать место для нулевых значений. В случае типа данных VARCHAR2 он не будет занимать места для нулевых значений. например,
name varchar(10)зарезервирует 6 байт памяти, даже если имя ' Ravi__', тогда как
name varchar2(10)оставляем пробел в соответствии с длиной входной строки. например, 4 байта памяти для ' Ravi__'.
здесь _ представляет NULL.
Примечание: varchar зарезервирует место для нулевых значений, а varchar2 не будет резервировать место для нулевых значений.
отличия:
VARCHARможет хранить до 2000 байт символов, в то время какVARCHAR2может хранить до 4000 байт символов.- если мы объявим тип данных как
VARCHARтогда он будет занимать место дляNULLзначения, в случаеVARCHAR2тип данных он не будет занимать никакого места.сходство:
VARCHARиVARCHAR2оба переменных характер.
Comments