Differenza tra i tipi di dati CHAR, VARCHAR e VARCHAR2 in Oracle

Oracle ha diversi tipi di dati a carattere che sono comunemente usati e possono anche confondere se non conosci le differenze tra loro. Impara cosa sono e le differenze tra loro in questo articolo.

I tipi di dati a carattere Oracle che sono usati più spesso sono CHAR e VARCHAR2. C’è anche un tipo di dati VARCHAR.

Vediamo che cosa sono ognuno di questi tipi di dati.

Tipo di dati CHAR

Il tipo di dati CHAR memorizza valori di carattere. Memorizza questi valori come una stringa di lunghezza fissa.

Questo significa che i valori di stringa saranno riempiti, o avranno dei caratteri di spazio aggiunti, per essere memorizzati nel database.

La lunghezza massima di un valore CHAR è 2000 byte.

Vediamo un esempio di questo.

Creerò una tabella di esempio usando tutti e tre questi tipi di dati, inserirò alcuni dati e vedrò cosa mostra.

CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));

Ora, inseriamo un valore.

INSERT INTO chartest (char_column)VALUES ('abcde');

Ora, interroghiamo il valore. Interrogo il valore, e il valore tra parentesi (per vedere dove sono gli spazi), controllo la lunghezza, e poi eseguo un DUMP su di esso per vedere alcune statistiche.

SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;

Risultato:

CHAR_COLUMN COL_FULL COL_LENGTH COL_DUMP
abcde (abcde ) 10 Typ=96 Len=10: 97,98,99,100,101,32,32,32,32,32

Come potete vedere, il valore di abcde è stato riempito di spazi quando memorizzato per portarlo ad una lunghezza di 10. Nell’output della funzione DUMP, potete vedere i codici per ogni carattere memorizzato. Il carattere 32 è uno spazio.

Tipo di dati VARCHAR

Il tipo di dati VARCHAR è un tipo di dati standard ANSI, che è il motivo per cui è incluso in Oracle.

Tuttavia, al momento, è lo stesso del tipo di dati VARCHAR2.

È stato incluso in Oracle per permettere una distinzione tra stringhe NULL e vuote, che è ciò che VARCHAR dovrebbe fare, secondo lo standard ANSI. Tuttavia, in Oracle, non lo fa. Funziona come un VARCHAR2 dove le stringhe vuote sono trattate come valori NULL.

Quindi, in Oracle, la differenza tra VARCHAR e VARCHAR2 è nulla. Sono la stessa cosa.

Non si dovrebbe usare il tipo di dati VARCHAR perché è riservato per funzionalità future di Oracle e potrebbe cambiare.

Vediamo un esempio. Useremo la stessa tabella di prima, e inseriremo alcuni dati.

INSERT INTO chartest (varchar_column)VALUES ('fghij');

Ora, selezioniamo questi dati.

SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;

Risultato:

VARCHAR_COLUMN COL_FULL COL_LENGTH COL_DUMP
fghij (fghij) 5 Typ=1 Len=5: 102,103,104,105,106

Si può vedere che il valore tra parentesi non contiene spazi, perché VARCHAR2 e VARCHAR non aggiungono spazi (di cui parlerò tra poco). È anche una lunghezza di 5 caratteri.

VARCHAR2 Datatype

Il tipo di dati VARCHAR2 è usato per memorizzare stringhe di lunghezza variabile. Ciò significa che si definisce una dimensione massima, e le stringhe che si inseriscono nella colonna saranno memorizzate così come vengono fornite. Nessuno spazio sarà aggiunto al carattere, come il tipo di dati CHAR.

La lunghezza massima di un tipo di dati VARCHAR2 è 4000 byte. Tuttavia, questo è stato portato a 32.767 byte come una delle nuove caratteristiche in Oracle 12c.

Vediamo un esempio.

INSERT INTO chartest (varchar2_column)VALUES ('klmno');

Ora, interroghiamo il risultato.

SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;

Risultato:

VARCHAR2_COLUMN COL_FULL COL_LENGTH COL_DUMP
klmno (klmno) 5 Typ=1 Len=5: 107,108,109,110,111

Si può vedere che l’output è lo stesso dell’esempio VARCHAR. Non sono stati aggiunti spazi e la lunghezza è la stessa. L’unica differenza sono i caratteri del codice ASCII perché la stringa in ingresso era diversa.

Differenze: CHAR vs VARCHAR vs VARCHAR2

Diamo un’occhiata alle differenze tra questi tre tipi di dati.

  • VARCHAR e VARCHAR2 sono esattamente uguali. CHAR è diverso.
  • CHAR ha una dimensione massima di 2000 byte, e VARCHAR/VARCHAR2 ha una dimensione massima di 4000 byte (o 32.767 in Oracle 12c)
  • CHAR non ha bisogno di una dimensione specificata e ha un valore predefinito di 1. Una dimensione deve essere specificata con le colonne VARCHAR/VARCHAR2.
  • CHAR imbottirà gli spazi a destra delle stringhe per corrispondere alla lunghezza della colonna, mentre VARCHAR/VARCHAR2 non lo fa.

Le prestazioni di CHAR, VARCHAR e VARCHAR2 sono le stesse. Non c’è differenza di prestazioni con questi tipi di dati. CHAR non è più veloce di VARCHAR2, e VARCHAR2 non è più veloce di CHAR.

Tom Kyte ha un post su AskTom che spiega i dettagli tecnici di questo. Spiega anche che un VARCHAR2 riempito di blank è esattamente lo stesso di un valore CHAR.

Pensate a questo per un momento.

Il blank padding di un valore VARCHAR2 è lo stesso di un valore CHAR.

I tipi di dati sono quasi identici.

Quindi, quale di questi tipi di dati dovresti usare?

Come Tom Kyte ha discusso sul suo forum e nel suo libro (e sono d’accordo), non c’è motivo di usare mai il tipo di dati CHAR. VARCHAR2 può coprire tutte le situazioni in cui un CHAR potrebbe essere considerato – anche un CHAR(1) che è lo stesso di un VARCHAR2(1).

VARCHAR vs VARCHAR2

La differenza tra VARCHAR e VARCHAR2 in Oracle è che VARCHAR è un tipo di dati ANSI-standard che supporta una distinzione tra stringhe NULL e vuote. Oracle non ha ancora implementato questa distinzione, quindi al momento, VARCHAR e VARCHAR2 sono la stessa cosa. È più sicuro usare VARCHAR2 perché non volete che il codice si rompa se Oracle cambia VARCHAR in futuro e il vostro codice usa VARCHAR.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.