Oracle ha tre tipi di dati per memorizzare stringhe. – CHAR, VARCHAR e VARCHAR2. Come differiscono l’uno dall’altro? Quando dovresti usare quali?
Scopriamo le risposte in questo articolo.
Prima la cosa più semplice: VARCHAR e VARCHAR2 sono la stessa cosa. Ma questo oggi – questo potrebbe cambiare. Date un’occhiata alla documentazione Oracle 10G Release 2:
Non usate il tipo di dato
VARCHAR
. Usate invece il tipo di datoVARCHAR2
. Sebbene il tipo di datoVARCHAR
sia attualmente sinonimo diVARCHAR2
, il tipo di datoVARCHAR
sta per essere ridefinito come un tipo di dato separato usato per stringhe di caratteri di lunghezza variabile confrontati con diverse semantiche di confronto.
In questo articolo, VARCHAR2 è usato per indicare sia VARCHAR che VARCHAR2 come sono equivalenti oggi.
In che modo CHAR e VARCHAR2 sono diversi allora?
La differenza è che CHAR(n) sarà SEMPRE lungo n byte. Se la lunghezza della stringa è <n, sarà riempita in bianco all’inserimento per assicurare una lunghezza di n. Un VARCHAR2(n) invece sarà lungo da 1 a n byte. Una stringa più corta memorizzata come VARCHAR2 NON sarà riempita in bianco.
Per esempio, supponiamo di memorizzare la stringa “ORATABLE” in un campo CHAR(20) e in un campo VARCHAR2(20). Il campo CHAR userà 22 byte (2 byte per la lunghezza iniziale). Il campo VARCHAR2 userà solo 10 byte (8 per la stringa, 2 byte per la lunghezza iniziale).
Per riassumere, CHAR è VARCHAR2 imbottito alla sua lunghezza massima.
Come impatta questa differenza sugli SQL?
Questo cambia il modo in cui le stringhe sono abbinate in CHAR vs VARCHAR2. Controllate in azione:
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
Così vedete, il riempimento con gli spazi vuoti fa la differenza se la stringa CHAR viene abbinata ad un parametro di lunghezza variabile. Per ottenere una corrispondenza, è necessario o rpad il valore o rtrim la colonna.
Nessuno di questi requisiti con VARCHAR2:
SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found
Quando dovremmo usare CHAR, quando VARCHAR2?
Se usate sempre e solo VARCHAR2 e ignorate CHAR, avrete la vita molto più semplice. Non c’è differenza tra i due, tranne che CHAR usa più spazio quando le vostre stringhe non sono sempre della lunghezza massima fissata. Inoltre, CHAR porta a più confusione nella scrittura delle query.
Io uso CHAR come colonne di database solo per valori di tipo S/N. (Non esiste un tipo di colonna BOOLEAN, ricordate?) Questo agisce come un marcatore per un tipo di colonna “bandiera” o “interruttore” – ma avrebbe potuto benissimo essere VARCHAR2.
Per tutte le altre stringhe, è VARCHAR2.
Sommario
Quando si considerano i tipi di dati Oracle CHAR, VARCHAR e VARCHAR2, ricordare che:
- VARCHAR e VARCHAR2 sono gli stessi, ma la funzione di VARCHAR potrebbe cambiare in futuro. Usate VARCHAR2.
- CHAR e VARCHAR2 sono diversi in quanto CHAR imbottisce le sue stringhe per essere della sua lunghezza massima. VARCHAR2 non fa alcun blank padding.
- A causa di quanto sopra, le query che coinvolgono il confronto di stringhe su una colonna CHAR richiedono più attenzione – un VARCHAR2 confrontato con CHAR ha bisogno di essere rpad-ded per ottenere un risultato.
- Va ripetuto: usate VARCHAR2!