Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Разница между VARCHAR и VARCHAR2

#sql #oracle #plsql


Все кто имел дело с БД Oracle, знают, что объявлять символьные поля и переменные
надо как  VARCHAR2, а не VARCHAR.

Но эти типы данных вроде синонимы:

CREATE TABLE table1 (
  id number,
  text VARCHAR(10),
  text2 VARCHAR2(10)
);

Name  Null Type
----- ---- ------------
ID         NUMBER
TEXT       VARCHAR2(10)
TEXT2      VARCHAR2(10)


Так какая все таки между ними разница?
    


Ответы

Ответ 1



На данный момент они синонимы. VARCHAR зарезервирован Oracle для поддержки, в будущем, различия между NULL и пустой строкой, как описано в стандарте ANSI. VARCHAR2 не делает различий между NULL и пустой строкой, и никогда не будет делать. Если вы полагаетесь на то, что пустая строка и NULL - одно и то же, используйте VARCHAR2. перевод ответа @Quassnoi

Ответ 2



В настоящее время, никакой разницы. Тип VARCHAR является псевдонимом VARCHAR2 и будет при обьявлении замещён как VARCHAR2. VARCHAR зарезервирован для использования в будущих релизах для соответствия стандарту ISO SQL и Oracle не рекомендует этот тип к применению. Поэтому, все пользуются типом VARCHAR2 потому, что его поведение никогда не изменится. В чём отличие VARCHAR2 от стандарта, их два: пустая строка интерпретируется как NULL с длиной NULL (не 0) NULL при конкантинации строк игнорируется, в стандарте результатом такой конкантинации будет NULL Почему так вышло (сокращённо перефразирую@JustinCave): Oracle очень старый производитель на рынке БД. Во времена, когда ещё SQL не был стандартизирован, теоретики Oracle приняли дизайнерское решение, что пустая строка в полях БД не содержит информации и по сути есть NULL. Со временем, когда появился стандарт SQL и было решено, что NULL и пустая строка по сущности различны, уже было много пользователей со старым кодом, который эту разницу не учитывал. Так Oracle был поставлен перед выбором, делать существующий код не действительным или нарушать стандарт SQL. Был принято, по мнению Oracle, менее деструктивное решение, зарезервировать тип данных VARCHAR для изменения и соответствия стандарту SQL и введению нового типа данных VARCHAR2, неизменность поведения которого гарантируется. Когда будут произведены намеченые изменения в поведении VARCHAR? Так было в версии 7, заметьте фразу - "в следующей версии Oracle7": The VARCHAR datatype is currently synonymous with the VARCHAR2 datatype. It is recommended that you use VARCHAR2 rather than VARCHAR. In a future version of Oracle7, VARCHAR might be a separate datatype used for variable length character strings compared with different comparison semantics. И, более чем 20 лет спустя, в последнем релизе 19c: Do not use the VARCHAR data type. Use the VARCHAR2 data type instead. Although the VARCHAR data type is currently synonymous with VARCHAR2, the VARCHAR data type is scheduled to be redefined as a separate data type used for variable-length character strings compared with different comparison semantics.

Ответ 3



Правильный ответ: для использования они не отличаются, при хранении VARCHAR2 не резервирует место под значения NULL, в отличии от VARCHAR, т.е. для хранения (для админов это важно). ответ в https://stackoverflow.com/questions/1171196/what-is-the-difference-between-varchar-and-varchar2-in-oracle не корректен. Никаких отличий работы с NULL для VARCHAR или VARCHAR2 нет (в будущем может появиться разница между VARCHAR и VARCHAR2, а сейчас ее действительно нет). Ниже пример иллюстрирует одинаковое поведение: DECLARE l_str VARCHAR(10):=''; l_STR2 VARCHAR2(10) :=''; BEGIN IF l_str IS NULL THEN dbms_output.put_line('l_str is null'); ELSE dbms_output.put_line('l_str is not null'); END IF; IF l_str2 IS NULL THEN dbms_output.put_line('l_str2 is null'); ELSE dbms_output.put_line('l_str2 is not null'); END IF; END;

Комментариев нет:

Отправить комментарий