Під час міграції таблиць, що надходять з інших СУБД в Oracle, однією із стандартних задач є заміна всіх VARCHAR(n)
полів VARCHAR2(n)
полями (за умови n <= 4000).
Чому Oracle називає цей тип даних VARCHAR2
не так, VARCHAR
як інші СУБД?
Під час міграції таблиць, що надходять з інших СУБД в Oracle, однією із стандартних задач є заміна всіх VARCHAR(n)
полів VARCHAR2(n)
полями (за умови n <= 4000).
Чому Oracle називає цей тип даних VARCHAR2
не так, VARCHAR
як інші СУБД?
Відповіді:
Здавалося б, Oracle свого часу планував дати інше визначення VARCHAR, ніж VARCHAR2 . Він повідомив клієнтам про це і рекомендує не використовувати VARCHAR . Які б плани не були, станом на 11.2.0.2 VARCHAR є ідентичним VARCHAR2 . Ось що говорить посилання на мову SQL 11g, випуск 2 :
Не використовуйте тип даних VARCHAR. Використовуйте замість цього тип даних VARCHAR2. Хоча тип даних VARCHAR в даний час є синонімом VARCHAR2, тип даних VARCHAR планується переосмислити як окремий тип даних, що використовується для символьних рядків змінної довжини порівняно з різною семантикою порівняння.
Посібник користувача PL / SQL та довідка 10 г Випуск 2 ставлять це так:
В даний час VARCHAR є синонімом VARCHAR2. Однак у майбутніх випусках PL / SQL, щоб відповідати новим стандартам SQL, VARCHAR може стати окремим типом даних з різною семантикою порівняння. Корисно використовувати VARCHAR2, а не VARCHAR.
База даних Концепції 10g Release 2 говорить про те ж саме в більш чіткій формі:
Тип даних VARCHAR є синонімом типу даних VARCHAR2. Щоб уникнути можливих змін у поведінці, завжди використовуйте тип даних VARCHAR2 для зберігання рядків символів змінної довжини.
Документація Oracle 9.2 і 8.1.7 говорить по суті те саме, тому, хоча Oracle постійно відмовляє від використання VARCHAR , до цих пір вони нічого не зробили, щоб змінити її паритет з VARCHAR2 .
varchar
перед версією 8 існувало інше обмеження довжини , але я не можу знайти нічого поважного, щоб підкріпити це, і тепер цікаво, чи це лише міф.
Наразі вони є двома синонімами.
VARCHAR - стандартний тип даних ANSI, але реалізація типу даних VARCHAR Oracle порушує стандарт ANSI, вважаючи, що порожня рядок є NULL (реалізація Oracle передує стандарту ANSI). Як зазначає Лі, Oracle заявив, що семантика типу даних VARCHAR може змінитися в майбутньому стосовно того, як поводиться порожня рядок. Якщо і коли це станеться, семантика типу даних VARCHAR2 залишиться колишньою. Використання типу даних VARCHAR2 є більш безпечним, оскільки вам не доведеться турбуватися про те, що якась майбутня версія Oracle порушить ваш код, викликаючи порожні рядки більше не вважатись NULL.
Оскільки в оригінальному стандарті SQL VARCHAR налічував 255 символів, а Oracle принаймні мав удар у відповідність стандартам у ті часи.
varchar(max)
, просто використовуйтеCLOB