Oracle are trei tipuri de date pentru a stoca șiruri de caractere. – CHAR, VARCHAR și VARCHAR2. Care sunt diferențele dintre ele? Când ar trebui să folosiți care dintre ele?
Să aflăm răspunsurile în acest articol.
Primul lucru cel mai simplu din cale: VARCHAR și VARCHAR2 sunt același lucru. Dar asta astăzi – acest lucru s-ar putea schimba. Aruncați o privire la documentația Oracle 10G Release 2:
Nu folosiți tipul de date
VARCHAR
. Utilizați în schimb tipul de dateVARCHAR2
. Deși tipul de dateVARCHAR
este în prezent sinonim cuVARCHAR2
, tipul de dateVARCHAR
este programat să fie redefinit ca un tip de date separat utilizat pentru șiruri de caractere de lungime variabilă comparate cu o semantică de comparație diferită.
În acest articol, VARCHAR2 este folosit pentru a însemna atât VARCHAR cât și VARCHAR2, așa cum sunt ele echivalente în prezent.
Cum diferă CHAR și VARCHAR2 atunci?
Diferența este că CHAR(n) va avea ÎNTOTDEAUNA o lungime de n octeți. Dacă lungimea șirului este <n, acesta va fi umplut cu spații goale la inserare pentru a asigura o lungime de n. Pe de altă parte, un VARCHAR2(n) va avea o lungime cuprinsă între 1 și n octeți. Un șir mai scurt stocat ca VARCHAR2 NU va fi umplut cu spațiu gol.
De exemplu, să presupunem că stocați șirul „ORATABLE” într-un câmp CHAR(20) și într-un câmp VARCHAR2(20). Câmpul CHAR va utiliza 22 de octeți (2 octeți pentru lungimea de avans). Câmpul VARCHAR2 va folosi doar 10 octeți (8 pentru șirul de caractere, 2 octeți pentru lungimea anterioară).
Pentru a rezuma, CHAR este VARCHAR2 umplut până la lungimea maximă.
Cum influențează această diferență asupra SQL-urilor?
Acest lucru schimbă modul în care șirurile de caractere sunt comparate în CHAR față de VARCHAR2. Verificați în acțiune:
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
Așa că vedeți, căptușirea cu spații libere face o diferență în ceea ce privește potrivirea șirului CHAR cu un parametru de lungime variabilă. Pentru a obține o potrivire, trebuie fie să rpad valoarea, fie să rtrim coloana.
Nu există o astfel de cerință cu VARCHAR2:
SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found
Când ar trebui să folosim CHAR, când VARCHAR2?
Dacă folosiți doar VARCHAR2 și ignorați CHAR, vă veți face viața mult mai simplă. Nu există nicio diferență între cele două, cu excepția faptului că CHAR consumă mai mult spațiu atunci când șirurile dvs. nu au întotdeauna lungimea maximă fixă. În plus, CHAR duce la mai multă confuzie în scrierea interogărilor.
Utilizez CHAR ca coloane de bază de date doar pentru valori de tip Y/N. (Nu există un tip de date de coloană BOOLEAN, vă amintiți?) Aceasta acționează ca un marker pentru o coloană de tip „flag” sau „switch” – dar ar fi putut la fel de bine să fie VARCHAR2.
Pentru toate celelalte șiruri, este VARCHAR2.
Summary
Când luați în considerare tipurile de date Oracle CHAR, VARCHAR și VARCHAR2, amintiți-vă că:
- VARCHAR și VARCHAR2 sunt aceleași, dar funcția lui VARCHAR s-ar putea schimba în viitor. Folosiți VARCHAR2.
- CHAR și VARCHAR2 sunt diferite prin faptul că CHAR blank padsează șirurile sale pentru a fi de lungime maximă. VARCHAR2 nu face umplutură albă.
- Din cauza celor de mai sus, interogările care implică compararea șirurilor de caractere pe o coloană CHAR necesită mai multă atenție – un VARCHAR2 comparat cu CHAR trebuie să fie rpad-ded pentru a obține un rezultat.
- Se repetă: folosiți VARCHAR2!
.