Jaka jest różnica między typami danych VARCHAR i VARCHAR2 firmy Oracle?

Odpowiedzi:

26

Wygląda na to, że Oracle kiedyś planowało nadać VARCHAR inną definicję niż VARCHAR2 . Powiedział to klientom i odradza korzystanie z VARCHAR . Jakiekolwiek były ich plany, od 11.2.0.2 VARCHAR jest identyczny z VARCHAR2 . Oto, co mówi SQL Language Reference 11g Release 2 :

Nie używaj typu danych VARCHAR. Zamiast tego użyj typu danych VARCHAR2. Chociaż typ danych VARCHAR jest obecnie synonimem VARCHAR2, planuje się, że typ danych VARCHAR zostanie ponownie zdefiniowany jako oddzielny typ danych używany dla łańcuchów znaków o zmiennej długości w porównaniu z różnymi semantykami porównywania.

W PL / SQL Podręcznik użytkownika i Reference 10g Release 2 umieszcza go w ten sposób:

Obecnie VARCHAR jest synonimem VARCHAR2. Jednak w przyszłych wersjach PL / SQL, aby dostosować się do nowych standardów SQL, VARCHAR może stać się osobnym typem danych o różnej semantyce porównawczej. Dobrym pomysłem jest używanie VARCHAR2 zamiast VARCHAR.

Dokument dotyczący koncepcji bazy danych 10g wydanie 2 mówi to samo w bardziej zdecydowany sposób:

Typ danych VARCHAR jest synonimem typu danych VARCHAR2. Aby uniknąć możliwych zmian w zachowaniu, zawsze używaj typu danych VARCHAR2 do przechowywania ciągów znaków o zmiennej długości.

Dokumentacja Oracle 9.2 i 8.1.7 mówi w zasadzie to samo, więc chociaż Oracle ciągle odradza korzystanie z VARCHAR , jak dotąd nie zrobiły nic, aby zmienić jego równość z VARCHAR2 .

Leigh Riffel
źródło
Pamiętam varchar2 w Oracle 8i, ale nie jestem pewien, czy to wtedy był taki sam varchar.
bernd_k
Istnieją przesłanki, że w pewnym momencie przed 8i definicja mogła być inna.
Leigh Riffel
Kiedyś myślałem, że był inny limit długości varcharprzed wersją 8, ale nie mogę znaleźć niczego godnego zaufania, aby to zrobić i teraz zastanawiam się, czy to tylko mit.
Jack Douglas,
@Jack Douglas - Nie mogę nic na ten temat znaleźć w dokumentacji Oracle 7. Z docs.oracle.com/cd/A57673_01/DOC/dcommon/oin/indexj.htm >> Serwer Oracle 7 >> Koncepcje serwera >> Typy danych Oracle (nie można bezpośrednio z nim połączyć) mówi prawie tak samo jak później wersje. W innej sekcji dokumentacji wersji 7 napisano, że w wersji 6 Varchar i Varchar2 były synonimami char.
Leigh Riffel,
25

Obecnie oba są synonimami.

VARCHAR jest standardowym typem danych ANSI, ale implementacja typu danych VARCHAR przez Oracle narusza standard ANSI, ponieważ pusty ciąg znaków ma wartość NULL (implementacja Oracle poprzedza standard ANSI). Jak podkreśla Leigh, Oracle stwierdził, że semantyka typu danych VARCHAR może w przyszłości ulec zmianie w odniesieniu do sposobu traktowania pustego łańcucha. Jeśli i kiedy tak się stanie, semantyka typu danych VARCHAR2 pozostanie taka sama. Korzystanie z typu danych VARCHAR2 jest bezpieczniejsze, ponieważ nie musisz się martwić, że niektóre przyszłe wersje Oracle spowodują uszkodzenie kodu, powodując, że puste ciągi nie będą już uważane za NULL.

Justin Cave
źródło
3

Ponieważ w oryginalnym standardzie SQL VARCHAR składał się z 255 znaków, a Oracle w tych dniach przynajmniej starało się zachować zgodność ze standardami.

Gajusz
źródło
To daje nadzieję na zobaczenie Oracle varchar3 (max) za kilka lat.
bernd_k
Serwer Sql nie miał problemów ze zwiększeniem dozwolonej długości z 255 do 8000 (a teraz nawet do maksimum). Dlaczego Oracle potrzebował innego typu danych.
bernd_k
1
Nie ma potrzeby varchar(max), po prostu użyjCLOB
a_horse_w_no_name
3
CLOB ma inną semantykę niż VARCHAR2
Gajusz