Яка різниця між varchar і varchar2 в Oracle?


Відповіді:


336

Щодо тепер, вони є синонімами.

VARCHARЗарезервовано, Oracleщоб підтримувати відмінність між NULLпорожнім рядком у майбутньому, як це ANSIпередбачає стандарт.

VARCHAR2не розрізняє a NULLі порожній рядок, і ніколи не буде.

Якщо ви покладаєтесь на порожню рядок і NULLє тим самим, вам слід скористатися VARCHAR2.


40
Я не чув цього обгрунтування раніше, це корисно. Дякую. Для запису все ще абсолютно смішно, що головним персонажем типу в Oracle є "varchar2". Хіба це не вражає когось іншого як жахливу хизу? Схоже, як я вирішив би якусь проблему в перший тиждень навчання програмуванню.
Ян Варлі

7
@Ian: основний тип полягає в VARCHAR2тому, що в даний час не існує типу, який би поводився так, як VARCHARслід. Насправді, ви не повинні використовувати VARCHARвзагалі, поки це не реалізовано належним чином.
Quassnoi

11
Дякую, @Quassnoi Тож я гадаю, дурна частина полягає в тому, що Oracle не має належного VARCHAR, як і будь-яка інша база даних? Тут відбувається щось нерозумне, я впевнений у цьому ... :)
Ian Varley

11
@Ian: коли розроблявся Oracle, ніяких стандартів не було. На той час, коли стандарти з'явилися, це вже навантажувало застарілі програми. Ми всі знаємо, як це відбувається.
Quassnoi

5
На жаль, насправді @UnKknown написав невірний коментар, на який я відповідав . Те, що where x is NULLповертає різні результати від цього, where x = ''ще не означає, що вони NULLі ''будь-яким чином відрізняються. Різна поведінка пояснюється =оператором.
Дан Ленскі

38

В даний час VARCHAR поводиться точно так само, як VARCHAR2. Однак тип VARCHARне слід використовувати, оскільки він зарезервований для подальшого використання.

Взято з: Різниця між CHAR, VARCHAR, VARCHAR2


@PhilipRego VARCHARне слід використовувати. Я його відредагував
bugybunny

29

Взято з останньої стабільної версії 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 ++


1
так це означає, що VARCHARвсе ще лікують '' == null?

2
Так. Вище обговорення внутрішніх та зовнішніх типів ведеться з посилання OCI. 12.2 Мова SQL Reference все ще несе те ж саме «не використовувати» заяву він завжди мав для VARCHAR.
Вільям Робертсон

Ось чому я обговорив відмінності OCI, інакше він в значній мірі зарезервований для подальшого використання або, як вони кажуть, «змінна довжина», яка може бути натяком на набори символів, такі як багатобайтові UTF8 ...
sandman

1
Ви показали, що значення, оголошені як VARCHAR, зберігаються в базі даних як VARCHAR2, проте максимальна довжина VARCHAR (65533 байт) перевищує максимальну довжину VARCHAR2 (32767 байт). Як це обробляє база даних?
Пьотр Доброгост

IIRC, давно (можливо, Oracle 6?) Був тип VARCHAR, який неправильно поводив Wrt до пробілу простору - або це був обріз пробілів? AAR, VARCHAR2 була відповідь. Oracle говорив, що вони повернуть VARCHAR, але, я впевнений, буде скрегіт зубів, коли порожня рядок НЕ НУЛЬНИЙ.
JMD

2

Після деяких експериментів (див. Нижче), я можу підтвердити, що станом на вересень 2017 року нічого не змінилося щодо функціональності, описаного у прийнятій відповіді : -

  1. Демограма Rextester для Oracle 11g: порожні рядки вставляються якNULLs для обохVARCHAR іVARCHAR2.
  2. Демонстрація LiveSQL для Oracle 12c: ті ж результати.

Історична причина цих двох ключових слів добре пояснюється у відповіді на інше запитання .


0
  1. VARCHAR може зберігати до 2000 байт символів, тоді як VARCHAR2 може зберігати до 4000 байт символів.

  2. Якщо ми оголосимо тип даних як VARCHAR, він буде займати простір для значень NULL. У випадку типу даних VARCHAR2 він не займе місця для значень NULL. наприклад,

    name varchar(10)

збереже 6 байт пам'яті, навіть якщо ім'я "Ravi__", тоді як

name varchar2(10) 

зарезервує простір відповідно до довжини вхідного рядка. наприклад, 4 байти пам'яті для 'Ravi__'.

Тут _ позначає NULL.

ПРИМІТКА: varchar резервує простір для нульових значень, а varchar2 не зарезервує місця для нульових значень.


2
Я думаю , що ця відповідь плутає VARCHARз CHAR.
Джон Хеллер

0

Наразі вони однакові. але раніше

  1. Десь у мережі я прочитав це,

VARCHARЗарезервовано Oracle для підтримки розмежування між NULLпорожнім рядком у майбутньому, як це прописано стандартом ANSI.

VARCHAR2не розрізняє a NULLі порожній рядок, і ніколи не буде.

  1. Також,

Emp_name varchar(10)- якщо ви ввели значення менше 10 цифр, залишок пробілу неможливо видалити. він використав загалом 10 пробілів.

Emp_name varchar2(10) - якщо ви вводите значення менше 10 цифр, решта пробілу автоматично видаляється


Нещодавно я натрапив на цю публікацію, зауважте, що вона неправильна. Виконайте наступне, і обидва поля будуть по 3 символи: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;
Брайан Ліч

-1

VARCHAR - синонім VARCHAR2. Однак не варто використовувати VARCHAR, оскільки Oracle може змінити свою семантику в майбутньому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.