Oracle are mai multe tipuri de date de caractere care sunt utilizate în mod obișnuit și care pot fi, de asemenea, derutante dacă nu cunoașteți diferențele dintre ele. Aflați ce sunt și care sunt diferențele dintre ele în acest articol.
Tipurile de date de caractere Oracle care sunt utilizate cel mai des sunt CHAR și VARCHAR2. Există, de asemenea, un tip de date VARCHAR.
Să vedem ce este fiecare dintre aceste tipuri de date.
Tip de date CHAR
Tipul de date CHAR stochează valori de caractere. El stochează aceste valori ca un șir de caractere de lungime fixă.
Aceasta înseamnă că valorile de tip șir de caractere vor fi umplute, sau li se vor adăuga caractere de spațiu, pentru a fi stocate în baza de date.
Lungimea maximă a unei valori CHAR este de 2000 de octeți.
Să vedem un exemplu în acest sens.
Voi crea un tabel de probă care utilizează toate aceste trei tipuri de date, voi introduce câteva date și voi vedea ce arată.
CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));
Acum, să introducem o valoare.
INSERT INTO chartest (char_column)VALUES ('abcde');
Acum, să interogăm valoarea. Voi interoga valoarea și valoarea din interiorul parantezelor (pentru a vedea unde sunt spațiile), voi verifica lungimea și apoi voi efectua un DUMP pentru a vedea câteva statistici.
SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;
Rezultat:
CHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
abcde | (abcde ) | 10 | Typ=96 Len=10: 97,98,99,99,100,101,32,32,32,32,32,32,32,32 |
După cum puteți vedea, valoarea abcde a fost umplută cu spații atunci când a fost stocată pentru a o aduce la o lungime de 10. În rezultatul funcției DUMP, puteți vedea codurile pentru fiecare caracter care este stocat. Caracterul 32 este un spațiu.
Tipul de date VARCHAR
Tipul de date VARCHAR este un tip de date standard ANSI, motiv pentru care este inclus în Oracle.
Cu toate acestea, în acest moment, este același cu tipul de date VARCHAR2.
A fost inclus în Oracle pentru a permite o distincție între șirurile NULL și șirurile goale, ceea ce ar trebui să facă VARCHAR, conform standardului ANSI. Cu toate acestea, în Oracle, nu face acest lucru. Funcționează ca un VARCHAR2 în care șirurile de caractere goale sunt tratate ca valori NULL.
Deci, în Oracle, diferența dintre VARCHAR și VARCHAR2 nu reprezintă nimic. Ele sunt la fel.
Nu ar trebui să folosiți tipul de date VARCHAR deoarece este rezervat pentru o viitoare funcționalitate Oracle și s-ar putea schimba.
Să vedem un exemplu. Vom folosi aceeași tabelă ca mai devreme și vom introduce niște date.
INSERT INTO chartest (varchar_column)VALUES ('fghij');
Acum, să selectăm aceste date.
SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;
Rezultat:
VARCHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
fghij | (fghij) | 5 | Typ=1 Len=5: 102,103,104,104,105,106 |
Vezi că valoarea din paranteze nu conține spații, ceea ce se datorează faptului că VARCHAR2 și VARCHAR nu adaugă spații (despre care voi discuta imediat). De asemenea, are o lungime de 5 caractere.
Tipul de date VARCHAR2
Tipul de date VARCHAR2 este utilizat pentru a stoca șiruri de caractere de lungime variabilă. Aceasta înseamnă că dumneavoastră definiți o dimensiune maximă, iar șirurile pe care le introduceți în coloană vor fi stocate așa cum sunt furnizate. Nu se vor adăuga spații la caracter, ca în cazul tipului de date CHAR.
Lungimea maximă a unui tip de date VARCHAR2 este de 4000 de octeți. Cu toate acestea, aceasta a fost ridicată la 32.767 de octeți ca una dintre noile caracteristici din Oracle 12c.
Să vedem un exemplu.
INSERT INTO chartest (varchar2_column)VALUES ('klmno');
Acum, să interogăm rezultatul.
SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;
Rezultat:
VARCHAR2_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
klmno | (klmno) | 5 | Typ=1 Len=5: 107,108,109,109,110,111 |
Vezi că rezultatul este același cu cel din exemplul VARCHAR. Nu au fost adăugate spații, iar lungimea este aceeași. Singura diferență este reprezentată de caracterele de cod ASCII, deoarece șirul de intrare a fost diferit.
Diferențe: CHAR vs VARCHAR vs VARCHAR2
Să aruncăm o privire la diferențele dintre aceste trei tipuri de date.
- VARCHAR și VARCHAR2 sunt exact la fel. CHAR este diferit.
- CHAR are o dimensiune maximă de 2000 de octeți, iar VARCHAR/VARCHAR2 are o dimensiune maximă de 4000 de octeți (sau 32.767 în Oracle 12c)
- CHAR nu are nevoie de o dimensiune specificată și are o valoare implicită de 1. O dimensiune trebuie să fie specificată cu coloanele VARCHAR/VARCHAR2.
- CHAR va completa spațiile din dreapta șirurilor pentru a se potrivi cu lungimea coloanei, în timp ce VARCHAR/VARCHAR2 nu o face.
Performanța coloanelor CHAR, VARCHAR și VARCHAR2 este aceeași. Nu există nicio diferență de performanță cu aceste tipuri de date. CHAR nu este mai rapid decât VARCHAR2, iar VARCHAR2 nu este mai rapid decât CHAR.
Tom Kyte are o postare pe AskTom care explică detaliile tehnice ale acestui aspect. El explică, de asemenea, că o valoare VARCHAR2 cu umplutură goală este exact la fel ca o valoare CHAR.
Gândiți-vă puțin la acest lucru.
Încărcarea goală a unei valori VARCHAR2 este la fel ca o valoare CHAR.
Tipurile de date sunt aproape identice.
Atunci, care dintre aceste tipuri de date ar trebui să folosiți?
Așa cum Tom Kyte a discutat pe forumul său și în cartea sa (și cu care sunt de acord), nu există niciun motiv pentru a folosi vreodată tipul de date CHAR. VARCHAR2 poate acoperi toate situațiile în care un CHAR ar putea fi luat în considerare – chiar și un CHAR(1) care este același lucru cu un VARCHAR2(1).
VARCHAR vs VARCHAR2
Diferența dintre VARCHAR și VARCHAR2 în Oracle este că VARCHAR este un tip de date standard ANSI care suportă o distincție între NULL și șiruri goale. Oracle nu a implementat încă această distincție, astfel încât, în acest moment, VARCHAR și VARCHAR2 sunt identice. Este mai sigur să folosiți VARCHAR2, deoarece nu doriți ca vreun cod să se întrerupă dacă Oracle schimbă VARCHAR în viitor și codul dvs. folosește VARCHAR.
.