Odpowiedzi:
Na razie są to synonimy.
VARCHAR
jest zarezerwowane przez w Oracle
celu obsługi rozróżnienia pomiędzy NULL
i pustym łańcuchem w przyszłości, jak ANSI
nakazuje standard.
VARCHAR2
nie rozróżnia NULL
ciągów od pustych i nigdy nie będzie.
Jeśli polegasz na pustym łańcuchu i NULL
będąc tym samym, powinieneś użyć VARCHAR2
.
VARCHAR2
ponieważ obecnie nie ma typu, który zachowuje się tak, jak VARCHAR
powinien. W rzeczywistości nie powinieneś używać, VARCHAR
dopóki nie zostanie poprawnie zaimplementowany.
where x is NULL
zwracane są różne wyniki where x = ''
, nie oznacza tego NULL
i ''
są w jakikolwiek inny sposób. Inne zachowanie jest spowodowane przez =
operatora.
Obecnie VARCHAR zachowuje się dokładnie tak samo jak VARCHAR2. Nie VARCHAR
należy jednak używać tego typu, ponieważ jest on zarezerwowany do użycia w przyszłości.
Zaczerpnięte z: Różnica między CHAR, VARCHAR, VARCHAR2
VARCHAR
nie powinien być używany. Zredagowałem to
Zaczerpnięte z najnowszej stabilnej wersji produkcyjnej Oracle 12.2: Typy danych
Główną różnicą jest to, że VARCHAR2
jest to wewnętrzny typ danych i VARCHAR
jest to zewnętrzny typ danych . Musimy więc zrozumieć różnicę między wewnętrznym a zewnętrznym typem danych ...
W bazie danych wartości są przechowywane w kolumnach w tabelach. Wewnętrznie Oracle reprezentuje dane w określonych formatach zwanych wewnętrznymi typami danych .
Zasadniczo 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 zostały zapisane. 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ą programistom wygodę, umożliwiając pracę z typami języka hosta zamiast zastrzeżonych 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 VARCHAR2
danych to ciąg znaków o zmiennej długości i maksymalnej długości 4000 bajtów. Jeśli parametr init.ora max_string_size jest domyślny, maksymalna długość a VARCHAR2
może wynosić 4000 bajtów. Jeśli parametr init.ora max_string_size = rozszerzona, maksymalna długość a VARCHAR2
może wynosić 32767 bajtów
Typ VARCHAR
danych przechowuje ciągi znaków o różnej długości. Pierwsze 2 bajty zawierają długość ciągu znaków, a pozostałe bajty zawierają ciąg. Podana długość ciągu w powiązaniu lub wywołaniu definicji musi zawierać dwa bajty długości, więc największy VARCHAR
ciąg, który można odebrać lub wysłać, 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 VARCHAR
jako pseudotyp dla VARCHAR2
. NIE SYNONYM
jest to rzeczywisty typ 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 ++. Zainteresowanym programistom link znajduje się w: Pro * C / C ++ Programmer's Guide
Po kilku eksperymentach (patrz poniżej) mogę potwierdzić, że od września 2017 r. Nic się nie zmieniło w odniesieniu do funkcjonalności opisanej w zaakceptowanej odpowiedzi : -
NULL
s dla obuVARCHAR
iVARCHAR2
.Historyczny powód tych dwóch słów kluczowych został dobrze wyjaśniony w odpowiedzi na inne pytanie .
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, wówczas zajmie miejsce na wartości NULL. W przypadku typu danych VARCHAR2 nie będzie on zajmował miejsca na wartości NULL. na przykład,
name varchar(10)
zarezerwuje 6 bajtów pamięci, nawet jeśli nazwa to „Ravi__”, natomiast
name varchar2(10)
zarezerwuje miejsce zgodnie z długością ciągu wejściowego. np. 4 bajty pamięci dla „Ravi__”.
Tutaj _ oznacza NULL.
UWAGA: varchar zarezerwuje miejsce na wartości null, a varchar2 nie zarezerwuje miejsca na wartości null.
VARCHAR
z CHAR
.
Obecnie są takie same. ale wcześniej
VARCHAR
jest zastrzeżone przez Oracle do obsługi rozróżnienia pomiędzy NULL
i pustym łańcuchem w przyszłości, jak nakazuje standard ANSI.
VARCHAR2
nie rozróżnia NULL
ciągów od pustych i nigdy nie będzie.
Emp_name varchar(10)
- jeśli wprowadzisz wartość mniejszą niż 10 cyfr, pozostałego miejsca nie będzie można usunąć. wykorzystał w sumie 10 miejsc.
Emp_name varchar2(10)
- jeśli wprowadzisz wartość mniejszą niż 10 cyfr, wówczas pozostałe miejsce zostanie automatycznie usunięte
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;