Het verschil tussen CHAR, VARCHAR en VARCHAR2

Oracle kent drie datatypes om strings op te slaan. – CHAR, VARCHAR en VARCHAR2. Waarin verschillen ze van elkaar? Wanneer moet u welke gebruiken?

Laten we de antwoorden in dit artikel eens bekijken.

Het eenvoudigste eerst uit de weg: VARCHAR en VARCHAR2 zijn hetzelfde. Maar dat dit vandaag – dit kan veranderen. Kijk maar eens in de Oracle documentatie 10G Release 2:

Gebruik niet het VARCHAR datatype. Gebruik in plaats daarvan het datatype VARCHAR2. Hoewel het VARCHAR-datatype momenteel synoniem is met VARCHAR2, zal het VARCHAR-datatype volgens planning opnieuw worden gedefinieerd als een afzonderlijk datatype dat wordt gebruikt voor tekenreeksen met variabele lengte en verschillende vergelijkingssemantiek.

In dit artikel wordt VARCHAR2 gebruikt om zowel VARCHAR als VARCHAR2 aan te duiden, zoals deze tegenwoordig equivalent zijn.

Waarin verschillen CHAR en VARCHAR2 dan?

Het verschil is dat CHAR(n) ALTIJD n bytes lang zal zijn. Als de lengte van de string <n is, zal deze bij het invoegen worden opgevuld met blanco’s om een lengte van n te garanderen. Een VARCHAR2(n) daarentegen zal 1 tot n bytes lang zijn. Een kortere string opgeslagen als VARCHAR2 zal NIET worden opgevuld.

Voorstel bijvoorbeeld dat u de string ‘ORATABLE’ opslaat in een CHAR(20) veld en een VARCHAR2(20) veld. Het CHAR-veld zal 22 bytes gebruiken (2 bytes voor de voorlooplengte). Het VARCHAR2 veld zal slechts 10 bytes gebruiken (8 voor de string, 2 bytes voor de voorloop lengte).

Om samen te vatten, CHAR is VARCHAR2 opgevuld tot de maximale lengte.

Hoe beïnvloedt dit verschil SQL’s?

Dit verandert de manier waarop strings worden gematched in CHAR vs VARCHAR2. Bekijk het in actie:

SQL> create table strings 2 (colchar char (20) 3 , colvarchar varchar2 (20));Table created.SQL>SQL> insert into strings 2 (colchar, colvarchar) 3 values 4 ('ORATABLE', 'ORATABLE');1 row created.SQL> -- Define a string variableSQL> var str varchar2(20)SQL> -- Give it a value with length < 20SQL> exec :str := 'ORATABLE'PL/SQL procedure successfully completed.SQL> -- Exact string match with CHARSQL> -- No result found!SQL> select 'found' found_flag 2 from strings 3 where colchar = :str;no rows selectedSQL> -- Padded string match with CHARSQL> -- Now it finds itSQL> select 'found' found_flag 2 from strings 3 where colchar = rpad(:str,20);FOUND-----found

Dus je ziet, opvulling met spaties maakt een verschil of de CHAR string wordt gematched met een variabele lengte parameter. Om een match te krijgen, moet je of de waarde rpaden of de kolom rtrimmen.

Dit is niet nodig bij VARCHAR2:

SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found

Wanneer moeten we CHAR gebruiken, wanneer VARCHAR2?

Als je alleen VARCHAR2 gebruikt en CHAR negeert, wordt je leven veel eenvoudiger. Er is geen verschil tussen de twee, behalve dat CHAR meer ruimte in beslag neemt wanneer de strings niet altijd de vaste maximumlengte hebben. Plus, CHAR leidt tot meer verwarring bij het schrijven van queries.

Ik gebruik CHAR als database kolommen alleen voor Y/N type waarden. (Er is geen BOOLEAN kolom datatype, weet je nog?) Dit werkt als een marker voor een “flag” of “switch” type kolom – maar het had net zo goed VARCHAR2 kunnen zijn.

Voor alle andere strings, is het VARCHAR2.

Samenvatting

Wanneer u de Oracle datatypes CHAR, VARCHAR en VARCHAR2 beschouwt, onthoud dan dat:

  • VARCHAR en VARCHAR2 zijn hetzelfde, maar de functie van VARCHAR kan in de toekomst veranderen. Gebruik VARCHAR2.
  • CHAR en VARCHAR2 zijn verschillend in die zin dat CHAR zijn strings leeg opvult om de maximale lengte te verkrijgen. VARCHAR2 doet niet aan blank padding.
  • Omdat het bovenstaande, queries die string vergelijking op een CHAR kolom vereisen meer zorg – een VARCHAR2 vergeleken met CHAR moet worden rpad-ded om een hit te krijgen.
  • Het moet worden herhaald: gebruik VARCHAR2!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.