Jaka jest różnica między varchar i varchar2?
oracle
sqldatatypes
hrishi
źródło
źródło
Odpowiedzi:
Na razie są to synonimy.
VARCHAR
jest zarezerwowane przez wOracle
celu obsługi rozróżnienia pomiędzyNULL
i pustym łańcuchem w przyszłości, jakANSI
nakazuje standard.VARCHAR2
nie rozróżniaNULL
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
.źródło
VARCHAR2
ponieważ obecnie nie ma typu, który zachowuje się tak, jakVARCHAR
powinien. W rzeczywistości nie powinieneś używać,VARCHAR
dopóki nie zostanie poprawnie zaimplementowany.where x is NULL
zwracane są różne wynikiwhere x = ''
, nie oznacza tegoNULL
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
źródło
VARCHAR
nie powinien być używany. Zredagowałem toZaczerpnię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 iVARCHAR
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ść aVARCHAR2
może wynosić 4000 bajtów. Jeśli parametr init.ora max_string_size = rozszerzona, maksymalna długość aVARCHAR2
może wynosić 32767 bajtówTyp
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ększyVARCHAR
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 dlaVARCHAR2
. NIESYNONYM
jest to rzeczywisty typ obiektu w Oracle.Istnieją również pewne implikacje
VARCHAR
dla opcji Prekompilatora ProC / C ++. Zainteresowanym programistom link znajduje się w: Pro * C / C ++ Programmer's Guideźródło
VARCHAR
nadal to traktuje'' == null
?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 .
źródło
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
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.
źródło
VARCHAR
zCHAR
.Obecnie są takie same. ale wcześniej
VARCHAR
jest zastrzeżone przez Oracle do obsługi rozróżnienia pomiędzyNULL
i pustym łańcuchem w przyszłości, jak nakazuje standard ANSI.VARCHAR2
nie rozróżniaNULL
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źródło
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;
VARCHAR jest synonimem VARCHAR2. Nie należy jednak używać VARCHAR, ponieważ Oracle może zmienić swoją semantykę w przyszłości.
źródło