В чем разница между типами данных Oracle VARCHAR и VARCHAR2?


19

При переносе таблиц, поступающих из других СУБД в Oracle, одной из стандартных задач является замена всех VARCHAR(n)полей на VARCHAR2(n)поля (при условии, что n <= 4000).

Почему Oracle называет этот тип данных, VARCHAR2а не просто VARCHARкак другие СУБД?

Ответы:


26

Казалось бы, в свое время Oracle планировал дать другое определение VARCHAR, чем VARCHAR2 . Он сказал клиентам об этом и рекомендует не использовать VARCHAR . Какими бы ни были их планы, по состоянию на 11.2.0.2 VARCHAR идентичен VARCHAR2 . Вот что говорит Справочник по языку SQL 11g Release 2 :

Не используйте тип данных VARCHAR. Вместо этого используйте тип данных VARCHAR2. Хотя тип данных VARCHAR в настоящее время синонимичен с VARCHAR2, тип данных VARCHAR планируется переопределить как отдельный тип данных, используемый для символьных строк переменной длины, по сравнению с другой семантикой сравнения.

Руководство пользователя и справочник по PL / SQL 10g Release 2 объясняет это следующим образом:

В настоящее время VARCHAR является синонимом VARCHAR2. Однако в будущих выпусках PL / SQL, чтобы соответствовать новым стандартам SQL, VARCHAR может стать отдельным типом данных с другой семантикой сравнения. Это хорошая идея, чтобы использовать VARCHAR2, а не VARCHAR.

В документе Database Concepts 10g Release 2 говорится то же самое в более строгих терминах:

Тип данных VARCHAR является синонимом типа данных VARCHAR2. Чтобы избежать возможных изменений в поведении, всегда используйте тип данных VARCHAR2 для хранения символьных строк переменной длины.

Документация по Oracle 9.2 и 8.1.7 говорит, по сути, об одном и том же, поэтому, несмотря на то, что Oracle постоянно не рекомендует использовать VARCHAR , до сих пор они не сделали ничего, чтобы изменить его соотношение с VARCHAR2 .


Я помню varchar2 в Oracle 8i, но я не уверен, что это был тот же самый varchar.
bernd_k


Есть признаки того, что в некоторый момент до 8i определение могло быть другим.
Ли Риффель

Раньше я думал, что varcharдо версии 8 было другое ограничение длины , но я не могу найти ничего заслуживающего доверия, чтобы поддержать это, и теперь задаюсь вопросом, не является ли это просто мифом.
Джек Дуглас

@ Джек Дуглас - я не могу найти ничего в документации по Oracle 7 по этому поводу. От docs.oracle.com/cd/A57673_01/DOC/dcommon/oin/indexj.htm >> Сервер Oracle 7 >> Концепции сервера >> Типы данных Oracle (не может напрямую ссылаться на него) говорит о том же, что и позже версии. В другом разделе документации версии 7 говорится, что в версии 6 Varchar и Varchar2 были синонимами для char.
Ли Риффель

25

В настоящее время оба являются синонимами.

VARCHAR является стандартным типом данных ANSI, но реализация Oracle типа данных VARCHAR нарушает стандарт ANSI, считая пустую строку NULL (реализация Oracle предшествует стандарту ANSI). Как указывает Ли, Oracle заявил, что семантика типа данных VARCHAR в будущем может измениться в зависимости от того, как обрабатывается пустая строка. Если и когда это произойдет, семантика типа данных VARCHAR2 останется прежней. Использование типа данных VARCHAR2 более безопасно, потому что вам не нужно беспокоиться о том, что какая-то будущая версия Oracle сломает ваш код, в результате чего пустые строки больше не будут рассматриваться как NULL.


3

Потому что в исходном стандарте SQL VARCHAR состоял из 255 символов, и Oracle в те дни, по крайней мере, добивался соответствия стандартам.


Это дает надежду увидеть Oracle varchar3 (max) через несколько лет.
bernd_k

У Sql-сервера не было проблем с увеличением разрешенной длины с 255 до 8000 (а теперь даже до макс). Зачем Oracle нужен другой тип данных.
bernd_k

1
Нет необходимости varchar(max), просто используйтеCLOB
a_horse_with_no_name

3
У CLOB другая семантика к VARCHAR2
Гай
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.