Jaka jest różnica między varchar a varchar2 w Oracle?

Jaka jest różnica między varchar a varchar2?

Author: Steve Chambers, 2009-07-23

8 answers

Na razie są synonimami.

VARCHAR jest zarezerwowane przez Oracle do obsługi rozróżnienia pomiędzy NULL i pustym łańcuchem w przyszłości, zgodnie ze standardem ANSI.

VARCHAR2 nie rozróżnia NULL i pustego łańcucha i nigdy nie będzie.

Jeśli polegasz na pustym łańcuchu i NULL jest tym samym, powinieneś użyć VARCHAR2.

 264
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-08 22:31:12

Obecnie VARCHAR zachowuje się dokładnie tak samo jak VARCHAR2. Jednak ten typ nie powinien być używany, ponieważ jest zarezerwowany do przyszłego użycia.

Wzięte z: różnica między CHAR, VARCHAR, VARCHAR2

 32
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-23 11:43:16

Zaczerpnięte z najnowszej stabilnej wersji produkcyjnej Oracle 12.2: Typy Danych

Zasadnicza różnica polega na tym, że VARCHAR2 jest wewnętrznym typem danych i VARCHAR jest zewnętrznym typem danych. Musimy więc zrozumieć różnicę między wewnętrznym a zewnętrznym typem danych...

Wewnątrz bazy danych wartości są przechowywane w kolumnach w tabelach. Wewnętrznie Oracle reprezentuje dane w określonych formatach znanych jako wewnętrzne typy danych .

W ogólnie, aplikacje OCI (Oracle Call Interface) nie działają z wewnętrznymi reprezentacjami danych typu danych, ale z typami danych języka hosta, które są predefiniowane przez język, w którym są zapisywane. Gdy dane są przesyłane między aplikacją kliencką OCI a tabelą bazy danych, biblioteki OCI konwertują dane między wewnętrznymi typami danych a zewnętrznymi typami danych.

Typy zewnętrzne zapewniają wygodę programiście, umożliwiając pracę z językiem hosta typy zamiast własnych formatów danych. OCI może wykonywać szeroki zakres konwersji typów danych podczas przesyłania danych między bazą danych Oracle a aplikacją OCI. Istnieje więcej zewnętrznych typów danych OCI niż wewnętrznych typów danych Oracle.

Typ danych VARCHAR2 jest ciągiem znaków o zmiennej długości o maksymalnej długości 4000 bajtów. Jeśli init.parametr Ora max_string_size jest domyślny, maksymalna długość VARCHAR2 może wynosić 4000 bajtów. Jeśli init.parametr ora max_string_size = extended, maksymalna długość VARCHAR2 może wynosić 32767 bajtów

Typ danych VARCHAR przechowuje ciągi znaków o różnej długości. Pierwsze 2 bajty zawierają Długość łańcucha znaków, a pozostałe bajty zawierają łańcuch znaków. Podana Długość łańcucha w wywołaniu bind lub define musi zawierać dwa bajty długości, więc największy VARCHAR łańcuch, który może być odebrany lub wysłany, ma długość 65533 bajtów, a nie 65535.

Szybki test w bazie danych 12.2 sugeruje, że jako wewnętrzny typ danych , Oracle nadal traktuje {[2] } jako pseudotyp dla VARCHAR2. Nie jest to SYNONYM, który jest rzeczywistym typem obiektu w 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)

Istnieją również pewne implikacje VARCHAR dla opcji Prekompilatora ProC / C++. Dla programistów, którzy są zainteresowani, link znajduje się pod adresem: Pro * C / C++ Programmer ' s Guide

 13
Author: sandman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-01 16:45:25

Po kilku eksperymentach (patrz poniżej), mogę potwierdzić, że od września 2017 roku nic się nie zmieniło w odniesieniu do funkcjonalności opisanej w zaakceptowanej odpowiedzi:-

  1. rextester demo dla Oracle 11g: Puste ciągi są wstawiane jako NULL s dla obu VARCHAR i VARCHAR2.
  2. LiveSQL demo dla Oracle 12c: te same wyniki.

historyczny powód tych dwóch słów kluczowych jest dobrze wyjaśniony w an odpowiedź na inne pytanie .

 1
Author: Steve Chambers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-01 22:33:28

Obecnie są takie same. ale wcześniej

  1. gdzieś w sieci, czytałem, że,

VARCHAR jest zarezerwowane przez Oracle do obsługi rozróżnienia między NULL i pustym łańcuchem w przyszłości, zgodnie ze standardem ANSI.

VARCHAR2 nie rozróżnia NULL i pustego łańcucha i nigdy nie będzie.

  1. również,

Emp_name varchar(10) - Jeśli wprowadzisz wartość mniejszą niż 10 cyfr, pozostała spacja nie może zostać usunięta. wykorzystało łącznie 10 miejsca.

Emp_name varchar2(10) - Jeśli wprowadzisz wartość mniejszą niż 10 cyfr, pozostała spacja zostanie automatycznie usunięta

 1
Author: Ramkumar P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-16 10:52:26

VARCHAR2

Jest używany do przechowywania łańcuchów znaków o zmiennej długości. Długość łańcucha wartości zostanie zapisana na dysku z samą wartością.

variable x varchar2(10)
begin
 :x := 'hullo';
end;
/

VARCHAR

Zachowuje się dokładnie tak samo jak VARCHAR2. Jednak ten typ nie powinien być używany, ponieważ jest zarezerwowany dla przyszłego użycia

 0
Author: Nisar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-06 13:15:24
  1. Varchar może przechowywać do 2000 bajtów znaków, podczas gdy VARCHAR2 może przechowywać do 4000 bajtów znaków.

  2. Jeśli zadeklarujemy typ danych jako VARCHAR, to zajmie On miejsce dla wartości NULL. W przypadku typu danych VARCHAR2, nie zajmie on Miejsca dla wartości NULL. np.,

    name varchar(10)

Zarezerwuje 6 bajtów pamięci, nawet jeśli nazwa to ' Ravi__', podczas gdy

name varchar2(10) 

Zarezerwuje miejsce zgodnie z długością łańcucha wejściowego. np. 4 bajty pamięci dla ' Ravi__'.

Tutaj, _ reprezentuje NULL.

Uwaga: varchar rezerwuje miejsce na wartości null, a varchar2 nie rezerwuje miejsca na wartości null.

 -1
Author: Palak Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-27 20:50:35

Różnica:

  • VARCHAR może przechowywać do 2000 bajtów znaków, podczas gdy VARCHAR2 może przechowywać do 4000 bajtów znaków.
  • jeśli zadeklarujemy typ danych jako VARCHAR, to zajmie On przestrzeń dla wartości NULL, w przypadku typu danych VARCHAR2 nie zajmie żadnej przestrzeni.

Podobieństwo:

  • VARCHAR i VARCHAR2 mają charakter zmienny.

Źródło

 -1
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 03:04:49