• tipi di dati in oracle

    Tipi di dati in Oracle

    Quando si creano le tabelle, ad ogni colonna deve essere assegnato un tipo di dati, che determina la natura dei valori che possono essere inseriti nella colonna. I tipi di che Oracle mette a disposizione sono: NUMBER, FLOAT, INTEGER, CHAR, NCHAR, VARCHAR2, NVARCHAR2, DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, LONG, RAW, LONG RAW, BLOB, CLOB, NCLOB, BFILE e ROWID. I più usati sono in assoluto i VARCHAR2, CHAR, NUMBER e DATE.

    Considerazioni per la scelta del tipo dei dati

    Quando si decide di utilizzare un tipo del dato di una colonna, è necessario prendere in considerazione il tipo di informazione che si deve memorizzare e le operazioni che si desidera eseguire su di essa. Ecco alcuni esempi:

    • se un campo dovrà contenere un flag che memorizzerà un’informazione del tipo ‘Y’ oppure ‘N’, è sufficiente utilizzare un campo di tipo alfanumerico che contiene solo un carattere;
    • se un campo dovrà contenere un indirizzo email, sarà opportuno utilizzare un campo alfanumerico di lunghezza variabile;
    • se occorre memorizzare una data e un’ora, sarà utile utilizzare un tipo di dato che gestisce le date;
    • se è necessario memorizzare un importo di una valuta, può essere opportuno scegliere un campo di tipo numerico con dei decimali.

    La scelta di un tipo di dato per una colonna influisce sullo spazio che Oracle riserva per quel dato. Alcuni tipi di dati hanno lunghezza fissa, cioè occupano lo stesso numero di byte indipendentemente da quali dati ci sono; altri sono variabili. Quando un campo non viene popolato, il database server non alloca spazio per quel campo.

    I tipi di dati disponibili in Oracle sono classificabili in:

    • dati alfanumerici;
    • dati binari;
    • dati numerici;
    • dati per data e ora;
    • dati per oggetti di grandi dimensioni.

     

    Dati alfanumerici

    • VARCHAR2: dati carattere a lunghezza variabile, da 1 byte a 4 KB (la lunghezza massima quindi è 4000 byte). Non esiste un valore di default, occorre sempre specificare un valore. I dati vengono  memorizzati nel set di caratteri del database.
    • NVARCHAR2: come VARCHAR2, ma i dati vengono memorizzati in un set di caratteri diverso, quello specificato nel parametro del database NATIONAL CHARACTER SET (ad esempio l’ Unicode).
    • CHAR: dati carattere a lunghezza fissa, da 1 byte a 2 KB (la lunghezza massima quindi è 2000 byte), nell’insieme di caratteri del database. Se i dati non sono della lunghezza della colonna, allora la colonna sarà riempita con gli spazi.
    • NCHAR: come CHAR, ma i dati vengono memorizzati in un set di caratteri diverso, quello specificato nel parametro del database NATIONAL CHARACTER SET (ad esempio l’ Unicode).

    Il set di caratteri di NCHAR e NVARCHAR2 può essere solo AL16UTF16 o UTF8 (entrambi Unicode) e viene specificato come set di caratteri della nazione quando il database viene creato.  Per conoscere quale set di caratteri è in uso nel database, basta eseguire la seguente query sulla tabella NSL_DATABASE_PARAMETERS (NLS sta per National Language Support):

    SELECT * FROM NLS_DATABASE_PARAMETERS WHERE parameter='NLS_CHARACTERSET';

    NLS_CHARACTERSET

    Se un campo deve ospitare un dato alfanumerico (una stringa), cosa è opportuno scegliere tra CHAR e VARCHAR2?

    Se il valore da memorizzare è superiore ai 2000 byte, è ovvio che è necessario utilizzare VARCHAR2.

    Per capire come comportarsi nei restanti casi, occorre comprendere come Oracle utilizza lo spazio nei due casi e cosa avviene in termini di prestazioni. Nel caso di un tipo di dato CHAR, lo spazio che viene occupato fisicamente sul disco è fisso, indipendentemente dal numero di caratteri inserito. Ad esempio, se viene definito un campo di tipo CHAR(50) per memorizzare un nome e un cognome, e si inserisce “Giulio Cantali”, che in totale ha 14 caratteri, lo spazio occupato dal campo sarà comunque 50 byte, perché i caratteri dal 15° al 50° vengono riempiti con degli spazi bianchi. Per memorizzare la stessa stringa, ma con tipo di dato VARCHAR2, Oracle alloca lo spazio effettivo che serve per la stringa “Giulio Cantali” più un byte per conservare la lunghezza del dato: 14+1=15 byte (di cui 14 occupati dalla stringa e uno che contiene la lunghezza della stringa, cioè 14).

    Quindi in termini di occupazione di spazio, il tipo di dato VARCHAR2 è di sicuro più conveniente. In termini di prestazioni, nel caso di CHAR ci sarà un overhead dovuto alla lettura/scrittura dei caratteri bianchi, mentre nel caso di VARCHAR2 l’overhead è dato dalla lettura/scrittura e dall’interpretazione del byte che contiene la dimensione della stringa.

    In conclusione, quando si sa che il campo occupa una certa dimensione fissa, come ad esemio un flag Y/N (1 carattere), o un CAP (5 caratteri), o un codice fiscale (16 caratteri), conviene usare il tipo CHAR. Quando invece il dato può avere lunghezza variabile conviene quasi sempre usare VARCHAR2.

    Per mantenere la conformità ISO/ANSI, è possibile specificare un tipo di dati VARCHAR, ma qualsiasi colonna di questo tipo verrà automaticamente convertita in VARCHAR2.

     

    Dati binari

    • RAW: dati binari di lunghezza variabile, da 1 byte a 2 KB. Il dato RAW non viene convertito dai servizi Oracle Net (che connettono le sessioni utente all’istanza del database) dall’insieme di caratteri del database all’insieme di caratteri del processo utente (se i due insiemi di caratteri sono diversi), a differenza di quanto avviene per i tipi di dato CHAR e VARCHAR2.

     

    Dati numerici

    • NUMBER: consente di memorizzare valori numerici, per i quali è possibile specificare la precisione e la scala. La precisione è il numero di cifre e può variare da 1 a 38 (il valore di default è 38). La scala è la parte decimale e può variare da -84 a 127.
    • FLOAT: questo è un sottotipo di NUMBER, che ha solo precisione. Un valore FLOAT viene rappresentato internamente come un NUMBER. La precisione può variare da 1 a 126 binario (o 38 decimale). Un tipo di dato FLOAT richiede da 1 a 22 byte. Oracle fornisce anche BINARY_FLOAT e BINARY_DOUBLE come alternative.
    • INTEGER: equivalente a NUMBER, con scala zero, cioè NUMBER(38, 0).

    Per capire come vengono trattati i tipi di dati numerici, lanciare il seguente script di creazione tabella:

    CREATE TABLE testnum
    (
      ID_INT     INTEGER,
      ID_NUM38   NUMBER(38),
      ID_NUM     NUMBER(*),
      ID_FLT     FLOAT
    );

    e poi eseguire la seguente query:

    SELECT cname, coltype, width, scale, precision
      FROM COL
     WHERE tname = 'TESTNUM';

    Il risultato sarà il seguente:

    tipi di dato numerici

    Dati per data e ora

    • DATE: consente di memorizzare valori di tipo data; il valore inserito viene trasformato internamente in un formato che contiene secolo, anno, mese, giorno, ora, minuti e secondi. L’intervallo valido è dal 1 ° gennaio 4712 aC al 31 dicembre 9999 dC. Se si inserisce una data che non contiene un orario, viene memorizzato l’orario di default che è mezzanotte, cioè 00:00:00. Di solito una data viene inserita scrivendola come testo e convertendola mediante la funzione TO_DATE(). Ha lunghezza zero se la colonna è vuota, oppure di 7 byte.
    • TIMESTAMP: simile a DATE, ma consente di memorizzare anche i miliardesimi di secondo, con una precisione fino a 9 cifre decimali per i secondi, 6 cifre per impostazione predefinita. Ha lunghezza zero se la colonna è vuota, o fino a 11 byte, a seconda della precisione specificata.
    • TIMESTAMP WITH TIMEZONE: Come TIMESTAMP, ma i dati vengono memorizzati con un record che memorizza il fuso orario a cui si riferisce. La lunghezza può essere fino a 13 byte, a seconda della precisione. Questo tipo di dati permette a Oracle di determinare la differenza tra due date normalizzandole a UTC, anche se le date hanno diversi fusi orari.
    • TIMESTAMP WITH LOCALE TIMEZONE: Come TIMESTAMP, ma i dati vengono normalizzati sul fuso orario del database al momento del salvataggio. Una volta recuperato, è normalizzato al fuso orario del processo utente che lo seleziona.
    • INTERVAL YEAR TO MONTH: utilizzato per la registrazione di un periodo di anni e mesi tra due DATE o TIMESTAMP.
    • INTERVAL DAY TO TO SECOND: utilizzato per la registrazione di un periodo in giorni e secondi tra due DATE o TIMESTAMP.

     

    Dati per oggetti di grandi dimensioni

    • CLOB: Character Large OBject, dati carattere memorizzati nel set di caratteri database, con dimensione fino a 4GB.
    • NCLOB: Come CLOB, ma i dati sono memorizzati nel set di caratteri di lingua del proprio paese, uno dei set di caratteri Unicode consentiti.
    • BLOB: Binary Large OBject, supporta fino a 4GB di dati binari non strutturati; come CLOB, ma i dati binari non subiranno conversione del set di caratteri da Oracle Net.
    • BFILE: Un puntatore ad un file esterno memorizzato sul sistema operativo del database server. La dimensione dei file è limitata a 4GB.
    • LONG: dati carattere nel set di caratteri del database, fino a 2GB. Tutti le funzionalità di LONG vengono forniti da CLOB; i tipi LONG non dovrebbero essere utilizzati in un database moderno, e se il database ha qualche colonna di questo tipo, dovrebbero essere convertite in CLOB. Ci può essere una sola colonna LONG in una tabella.
    • LONG RAW: Come LONG, ma i dati binari non saranno convertiti da Oracle Net. Eventuali colonne LONG RAW devono essere convertite in BLOB.

     

    Dati di tipo ROWID

    • ROWID: Memorizza una stringa codificata in formato base-64 che contiene l’indirizzo fisico di un record di tabella (è un puntatore). Questo tipo di dato viene usato nelle pseudocolonne delle tabelle, ed occupa 10 Bytes. ROWID è un tipo di dati proprietario di Oracle, e non è visibile se non viene specificatamente selezionato.

     

Lascia un commento

Se vuoi condividere la tua opinione, lascia un commento

Puoi usare questi tag e attributi: HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">