Відповіді:
Щодо тепер, вони є синонімами.
VARCHAR
Зарезервовано, Oracle
щоб підтримувати відмінність між NULL
порожнім рядком у майбутньому, як це ANSI
передбачає стандарт.
VARCHAR2
не розрізняє a 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 за замовчуванням, максимальна довжина а VARCHAR2
може бути 4000 байт. Якщо параметр init.ora max_string_size = розширений, максимальна довжина а VARCHAR2
може бути 32767 байт
Тип VARCHAR
даних зберігає рядки символів різної довжини. Перші 2 байти містять довжину символьної рядки, а решта байти містять рядок. Зазначена довжина рядка в прив'язці або визначенні виклику повинна містити два байти довжини, тому найбільша VARCHAR
рядок, яка може бути отримана або надіслана, має довжину 65533 байт, а не 65535.
Швидкий тест в базі даних 12.2 передбачає , що в якості внутрішнього типу даних , Oracle все ще лікує 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 року нічого не змінилося щодо функціональності, описаного у прийнятій відповіді : -
NULL
s для обохVARCHAR
іVARCHAR2
.Історична причина цих двох ключових слів добре пояснюється у відповіді на інше запитання .
VARCHAR може зберігати до 2000 байт символів, тоді як VARCHAR2 може зберігати до 4000 байт символів.
Якщо ми оголосимо тип даних як VARCHAR, він буде займати простір для значень NULL. У випадку типу даних VARCHAR2 він не займе місця для значень NULL. наприклад,
name varchar(10)
збереже 6 байт пам'яті, навіть якщо ім'я "Ravi__", тоді як
name varchar2(10)
зарезервує простір відповідно до довжини вхідного рядка. наприклад, 4 байти пам'яті для 'Ravi__'.
Тут _ позначає NULL.
ПРИМІТКА: varchar резервує простір для нульових значень, а varchar2 не зарезервує місця для нульових значень.
VARCHAR
з CHAR
.
Наразі вони однакові. але раніше
VARCHAR
Зарезервовано Oracle для підтримки розмежування між NULL
порожнім рядком у майбутньому, як це прописано стандартом ANSI.
VARCHAR2
не розрізняє a 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;