it-swarm.dev

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

Podczas migracji tabel pochodzących z innych DBMS do Oracle, jednym ze standardowych zadań jest zastąpienie wszystkich pól VARCHAR(n) polami VARCHAR2(n) (pod warunkiem, że n <= 4000) .

Dlaczego Oracle nazywa ten typ danych VARCHAR2 a nie tylko VARCHAR jak inne DBMS?

19
bernd_k

Wydaje się, że Oracle kiedyś miało inną definicję [~ # ~] varchar [~ # ~] niż VARCHAR2 . Powiedział to klientom i odradza używanie [~ # ~] varchar [~ # ~] . Jakiekolwiek były ich plany, od 11.2.0.2 [~ # ~] varchar [~ # ~] jest identyczny z VARCHAR2 . Oto, co Skorowidz języka SQL 11g wydanie 2 mówi:

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

Podręcznik użytkownika PL/SQL i odniesienie 10g wydanie 2 przedstawia to w następujący 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 Database Concepts 10g Release 2 mówi to samo silniej:

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 zasadniczo to samo, więc nawet jeśli Oracle ciągle odradza stosowanie [~ # ~] varchar [~ # ~] , jak dotąd nie zrobili nic, aby zmienić jego parzystość z VARCHAR2 .

26
Leigh Riffel

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.

25
Justin Cave

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.

3
Gaius