Kosmous beyond the clouds: Sviluppo, Formazione e Consulenza Informatica

Oracle DBA 9i - Cap. 9

In Oracle è possibile utilizzare diverse tipologie di Data Type. Ovviamente ogni singola tipologia ha delle caratteristiche e delle proprietà diverse (ad esempio è possibile eseguire la somma tra due numeri, ma non la somma di due valori di tipo raw). Inoltre può cambiare il range di valori ammissibili a secondo di dove vengono utilizzati.
Così, ad esempio, un campo di tabella definito di tipo char può accettare fino a 2.000 bytes, ma se invece definisco una variabile nel Pl/SQL di tipo CHAR posso gestire valori fino a 32.767 bytes.
Analizziamo le diverse tipologie, facendo riferimento all'utilizzo come campi di una tabella.

CHAR

CHAR ( [BYTE | CHAR]) Il CHAR è un campo a lunghezza fissa, di cui è possibile specificare la dimensione in byte (default) o in numero di caratteri. Se non specifico la dimensione viene utilizzato il Default che è 1 byte, mentre il valore massimo è di 2000 byte.

VARCHAR2

VARCHAR2 ( [BYTE | CHAR]) Il VARCHAR2 è un campo a lunghezza variabile, nel senso che quello che viene fissato è il valore massimo che può essere memorizzato. Devo sempre specificare un valore, non esiste un default. Il valore massimo è di 4000 bytes.

CHAR vs VARCHAR2

A volte si deve scegliere quale tipo di dati scegliere tra i due. Ovviamente se il valore da memorizzare è superiore ai 2000 byte, la scelta è obbligata, ma negli altri casi si deve fare una piccola considerazione. Quando si utilizza il CHAR, lo spazio fisicamente occupato sul disco è fisso, a prescindere dal valore effettivamente memorizzato, mentre nel caso del VARCHAR2 lo spazio effettivamente occupato è pari alla dimensione del dato immagazzinato più un valore aggiuntivo (in genere 1 byte) che memorizza la lunghezza del dato.
Facciamo un esempio pratico: Supponiamo di avere una colonna (col1) con CHAR(20) ed una colonna (col2) definita VARCHAR2(20). In entrambi i casi è possibile memorizzare stringhe di caratteri fino ad una dimensione massima di 20. Se memorizziamo il valore "Fabio" in entrambe le colonne, lo spazio occupato dalla col1 sarà di 20 bytes, mentre lo spazio occupato dalla colonna col2 sarà di 5+1 = 6 Bytes (5 occupati dal valore, ed 1 che contiene la lunghezza del dato, cioè il valore 5).
Ragionando in termini prestazionali succede che ogni qual volta il sistema deve accedere al disco per leggere o scrivere un dato, se il tipo è CHAR Oracle dovrà leggere e scrivere anche gli spazi bianchi (15 nell'esempio di "Fabio"), mentre nel caso del VARCHAR2, di contro, il sistema avrà un overhead dovuto alla lettura ed interpretazione del byte aggiuntivo che indica la dimensione.
In conclusione si suggerisce, solo per motivi prestazionali, di utilizzare il CHAR quando la variazione di lunghezza del dato è bassa (ad esempio uguale o inferiore a 5), ed usare il VARCHAR2 in tutti gli altri casi.
Si ricorda che questo tipo di ragionamento deve comunque essere inquadrato in un'ottica più ampia, come l'utilizzo che viene fatto del dato da parte dell'applicazione che utilizza il dato. Se infatti l'applicazione lavora anche sulla lunghezza del contenuto (estrazione di un tracciato record a lunghezza fissa) questo ragionamento decade in quanto l'applicazione dovrà eseguire dei controlli sulla lunghezza che vanificano il guadagno prestazionale precedente.

NCHAR

NCHAR () Il comportamento è analogo al CHAR ma il dato viene memorizzato usando un set di caratteri diverso, quello specificato nel parametro del database NATIONAL CHARACTER SET (ad esempio l' Unicode). Anche in questo caso il default è 1 e il valore massimo 2000 byte.

NVARCHAR2

NVARCHAR2 () Il comportamento è analogo al VARCHAR2 ma il dato viene memorizzato usando un set di caratteri diverso, quello specificato nel parametro del database NATIONAL CHARACTER SET (ad esempio l' Unicode). Anche in questo caso non c'è un default ed il valore massimo è 4000 byte.

NUMBER

NUMBER (, ) Questo tipo di dato permette la memorizzazione di valori numerici aventi un numero di cifre pari al valore di "precision", di cui "scale" individua la parte decimale. Il valore di default per "precision" è di 38 cifre, che è il massimo, mentre "scale" può valere da -84 fino a 127.

DATE

DATE Utilizzato per memorizzare una data. Il valore immesso viene trasformato internamente in un formato che contiene:secolo, anno, mese, giorno, ora, minuto, secondo. Il range di valori accettati spazia dal 1 gennaio 4712 AC al 31 dicembre 9999 DC. Generalmente la data viene inserita scrivendola come testo e convertendola mediante la funzione TO_DATE(); Se quando specifico una data non indico anche un orario viene preso il default 12 AM. (NB: Mezzanotte è 00:00:00)

TIMESTAMP

TIMESTAMP [()] Questo tipo di dato è un'estensione del tipo DATE che permette di specificare la precisione della frazione di secondo memorizzata. Il valore di default (per la "precision" è 6, ma può valere un qualunque intero compreso tra 0 e 9.




TIMESTAMP WITH TIME ZONE

TIMESTAMP [()] WITH TIME ZONE Questo tipo di dato è un'estensione del TIMESTAMP che permette di memorizzare la differenza di time zone, cioè la differenza tra l’ora locale e la UTC (Universal Time Coordinate o GMT Greenwich Mean Time), differenza che è espressa in ore e minuti. In questo modo risulta più semplice confrontare due valori temporali registrati sul medesimo database da aree geografiche diverse.

TIMESTAMP WITH LOCAL TIME ZONE

TIMESTAMP [()] WITH LOCAL TIME ZONE Anche questo tipo di dato è una variante del TIMESTAMP, e si differenzia dalla precedente perchè non memorizza la differenza tra il time zone del db e l'UTC, ma converte direttamente il valore nel timezone del Db. Ovviamente quando il dato viene richiesto, il valore mostrato viene automaticamente corretto facendo riferimento al timezone della sessione che richiede il dato.

INTERVAL YEAR TO MONTH

INTERVAL YEAR [(precision)] TO MONTH Rappresenta un periodo di tempo come anni e mesi, e viene utilizzato per memorizzare la differenza tra due date, della quale interessa solo la porzione di anno e mese. Precision fa riferimento agli anni, e se non specificato assume il valore di default che è 2.

INTERVAL DAY TO SECOND

INTERVAL DAY [(precision)] TO SECOND Usato per rappresentare periodo di tempo come giorno, ora, minuti e secondi. La precisione fa riferimento al giorno, default è 6, e può variare tra 0 e 9. Più alta è la precisione, maggiore può essere la differenza tra due date. In genere viene usato per memorizzare la differenza tra due date con precisione del secondo.

RAW

RAW () E' un tipo di dato a dimensione variabile, usato per memorizzare dati non-strutturati, senza avere conversione in caratteri. Esiste solo per compatibilità, e può contenere fino a 2000 bytes. Oracle suggerisce di usare il tipo BLOB o BFILE.

LONG RAW

LONG RAW Ha le stesse caratteristiche del tipo RAW, ma può registrare fino a 2Gb. Oracle suggerisce di usare il tipo BLOB in alternativa.

LONG

Il tipo LONG viene utilizzato per memorizzare una stringa di caratteri a lunghezza variabile fino a 2 Gb. Tuttavia in una tabella può esistere al massimo una colonna con questo tipo di dati. Nella versione 9i questo tipo di dato viene mantenuto solo per compatibilità, Oracle consiglia di usare invece CLOB o NCLOB.

BLOB

Questo tipo di dato (Binary Large OBject) può contenere fino a 4 Gb di dati non strutturati, ed è pienamente supportato dalle transazioni.

CLOB

Il tipo CLOB è analogo al BLOB, ma il dato memorizzato viene convertito in caratteri, riuscendo a memorizzare dati fino a 4 Gb. Il set di caratteri usato deve essere di tipo 1 byte = 1 carattere. Se il set di carattere è di tipo multibytes si deve usare NCLOB.

NCLOB

Come il CLOB, ma utilizza un set di carattere multibytes come l'Unicode (specificato dal national character set impostato). Può memorizzare fino a 4Gb.

BFILE

Memorizza dati binari non strutturati in file del SO esterni al Db. Fino a 4 Gb. Oracle memorizza nel Db solo il puntatore al file

ROWID

Memorizza una stringa in formato base-64 che contiene l'indirizzo fisico di un record di tabella. Questo tipo di dato viene usato nelle pseudocolonne delle tabelle, ed occupa 10 Bytes. Generalmente il suo valore viene anche chiamato "puntatore".

UROWID

UROWID () Conosciuto anche come Universal-ROWID, permette di gestire qualunque puntamento ai dati, anche esterno al database Oracle, sia di tipo fisico, logico o mediante sistema di terze parti. Usato internamente per i puntamenti ai record che non possono disporre di un rowid, come le tabelle IOT (Index Oraganized). Può gestire fino a 4000 bytes, che è il valore di default.

Vi invitiamo ad inviarci commenti, eventuali segnalazioni di errore e quant'altro.



Questo documento non è un documento ufficiale della Oracle Corporation. Oracle detiene tutti i diritti sulla propria documentazione. Alcuni termini usati sono trademarks registrati. In caso di dubbi o incertezze consultate la documentazione ufficiale di Oracle o contattate il Customer Support di Oracle.
<< Capitolo 8 Indice >>
Commenti (0)2009-06-25