Back to Basics: i tipi di dati in Oracle

Datamaze
12.10.22 03:40 PM Comment(s)
In questo articolo saranno analizzati gli Oracle Built-in Data Types, ossia quelli definiti nativi nel database. Si fa riferimento alla versione 19c di Oracle. E’ possibile raggrupparli in 7 categorie che sono:              
  • Character Data Type;
  • Numeric Data Type;
  • LONG Data Type;
  • Datatetime e Interval Data Type;
  • RAW e LONG RAW Data Type;
  • Large Object (LOB) Data Type;
  • Extended Data Type

Si descrive nel dettaglio ciascuno dei formati dati.

Character Data Type

I data type character memorizzano i dati carattere (alfanumerici), ossia parole e testo in formato libero, nel set di caratteri del database o nel set di caratteri nazionale. Sono meno restrittivi di altri tipi di dati e di conseguenza hanno meno proprietà. 


Nome  Descrizione Dimensione
 CHAR [(size [BYTE | CHAR])] Il type CHAR specifica una stringa di caratteri di lunghezza fissa nel set di caratteri del database.

Oracle garantisce che tutti i valori archiviati in una colonna CHAR abbiano la lunghezza specificata dalla dimensione nella semantica della lunghezza selezionata. Se inserisci un valore più corto della lunghezza della colonna, Oracle inserisce in bianco il valore in base alla lunghezza della colonna. Se si tenta di inserire un valore troppo lungo per la colonna, Oracle restituisce un errore.
 Max 2000 bytes
Default size 1


 VARCHAR2, VARCHAR Stringhe di caratteri a lunghezza variabile e specificata durante la creazione. Se si dovesse superare il limite dichiarato, Oracle ritornerebbe un errore.

Usare questo data type al posto di CHAR salva spazio sull’intera tabella. 

La dimensione occupata non dipende dalla massima lunghezza ma dalla lunghezza effettiva della stringa memorizzata. Oracle  non usa la blank-padded comparison semantics  quando confronta variabili di questo data type.

NB. Si consiglia di utilizzare VARCHAR2 in quanto VARCHAR esiste per retrocompatibilità e potrebbe essere soggetto a cambiamenti.
 Max 4000 bytes
NCHAR Data type unicode che serve appunto per memorizzare caratteri Unicode. Lunghezza fissa.

NB. Un singolo carattere Unicode pesa molto di più di un carattere non Unicode.
 Può contenere fino a 2000 caratteri ma a runtime il peso complessivo non può superare i 2000 bytes.
 NVARCHAR2 Il tipo di dati NVARCHAR2 specifica una stringa di caratteri di lunghezza variabile nel set di caratteri nazionale. Lunghezza variabile. NVARCHAR2 è un tipo di dati esclusivamente Unicode.



Oracle confronta i valori NVARCHAR2 utilizzando la semantica di confronto non-padded.
 La dimensione minima è 1. Il valore massimo è: 

- 16383 se MAX_STRING_SIZE = EXTENDED e il national character set è AL16UTF16 

- 32767 se MAX_STRING_SIZE = EXTENDED e il national character set è UTF8

- 2000 se MAX_STRING_SIZE = STANDARD e il national character set è AL16UTF16

- 4000 se MAX_STRING_SIZE = STANDARD e il national character set è UTF8

*la blank-padded comparison semantics è un processo che si innesca al momento di un confronto tra valori che hanno differenti lunghezze. Oracle aggiunge spazi vuoti alla fine di quella più corta in modo tale da appianare la differenza di lunghezza. Poi avviene un confronto carattere per carattere e alla prima differenza il processo si ferma dichiarando che le due stringhe non sono uguali.


LONG Data Type

Non creare tabelle con colonne LONG. Utilizzare invece colonne LOB (CLOB, NCLOB, BLOB). Le colonne LONG sono supportate solo per la compatibilità con le versioni precedenti.


Numeric Date Type

I tipi di dati numerici di Oracle Database memorizzano numeri fissi e mobili positivi e negativi, zero, infinito e valori che sono il risultato non definito di un'operazione, "non un numero" o NAN.


Nome  Descrizione Dimensione
 NUMBER NUMBER memorizza 0 come pure numeri fissi positivi e negativi con valore assoluto tra 1.0 x 10-130  e 1.0 x 10126 escluso.  Ogni NUMBER richiede da 1 a 22 bytes. 

Specificare un numero in virgola fissa utilizzando il seguente formato:
NUMBER (p,s) dove
- p è la precisione, o il numero massimo di cifre decimali significative, dove la cifra più significativa è la cifra diversa da zero più a sinistra e la cifra meno significativa è la cifra nota più a destra. Oracle garantisce la portabilità dei numeri con precisione fino a 20 cifre in base 100, che equivalgono a 39 o 40 cifre decimali a seconda della posizione del punto decimale. 
- s è la scala o il numero di cifre dalla virgola decimale alla cifra meno significativa. La scala può variare da -84 a 127.
 Se si usa una scala negativa(-n) al momento della creazione, Oracle arrotonda il valore fino alla cifra sinistra (n). 

Esempio:



7,456,123.89



NUMBER(7,-2)



7456100


FLOAT E’ un sottoinsieme del NUMBER. Può essere specificato con o senza la precisione p (cha ha lo stesso range di valori del NUMBER), la scala s non può essere specificata ma è interpretata a partire dal dato. Esempio:

CREATE TABLE test (col1 NUMBER(5,2), col2 FLOAT(5));

 

INSERT INTO test VALUES (1.23, 1.23);

INSERT INTO test VALUES (7.89, 7.89);

INSERT INTO test VALUES (12.79, 12.79);

INSERT INTO test VALUES (123.45, 123.45);

 

SELECT * FROM test;

  COL1  COL2

---------- ----------

  1.23  1.2

  7.89  7.9

  12.79  13

  123.45  120

In questo esempio, il valore FLOAT restituito non può superare 5 cifre binarie. Il numero decimale più grande che può essere rappresentato da 5 cifre binarie è 31. L'ultima riga contiene valori decimali che superano 31. Pertanto, il valore FLOAT deve essere troncato in modo che le cifre significative non richiedano più di 5 cifre binarie. Pertanto 123,45 viene arrotondato a 120, che ha solo due cifre decimali significative, richiedendo solo 4 cifre binarie.

 BINARY_FLOAT, BINARY_DOUBLE Simili al NUMBER data type. Al posto della precisione decimale, questi tipi, usano la precisione binaria.

Questo permette di avere una dimensione ridotta e calcoli aritmetici più veloci.



NB. Questi data types sono usati per memorizzare approssimazioni di valori e non la loro reale rappresentazione.
 BINARY_FLOAT è a 32 bit.

Ogni valore richiede 4 bytes.



BINARY_DOUBLE è a 64 bit.

Ogni valore richiede 8 bytes.

Datatime e Interval Data Type

 Il Date data type serve per memorizzare date e quantità di tempo in una tabella.              

I database Oracle possono memorizzare le date in formato Giuliano con un intervallo che parte da I tipi di dati datetime sono DATA, TIMESTAMP, TIMESTAMP CON FUSO ORARIO e TIMESTAMP CON FUSO ORARIO LOCALE. I valori dei tipi di dati datetime sono talvolta chiamati datetimes. I tipi di dati dell'intervallo sono INTERVAL ANNO AL MESE e INTERVAL GIORNO AL SECONDO. 

Nome  Descrizione Dimensione
 Date Il datatype DATE memorizza le informazioni su data e ora. Per ogni valore DATE, Oracle memorizza le seguenti informazioni: anno, mese, giorno, ora, minuti e secondi.
 TIMESTAMP Estensione del tipo di dati DATE. Memorizza l'anno, il mese e il giorno del datetype DATE, oltre ai valori di ora, minuti e secondi. Questo tipo di dati è utile per memorizzare valori temporali precisi e per raccogliere e valutare le informazioni sulla data nelle aree geografiche.
 TIMESTAMP WITH TIME ZONE E’ una variante di TIMESTAMP che include il nome di un'area del fuso orario o un offset di fuso orario nel suo valore. L'offset del fuso orario è la differenza (in ore e minuti) tra l'ora locale e l'UTC (Coordinated Universal Time, precedentemente Greenwich Mean Time). Questo tipo di dati è utile per preservare le informazioni sul fuso orario locale.
 TIMESTAMP WITH LOCAL TIME ZONE E’ un'altra variante del TIMESTAMP sensibile alle informazioni sul fuso orario. Differisce da TIMESTAMP WITH TIME ZONE in quanto i dati archiviati nel database vengono normalizzati al fuso orario del database e le informazioni sul fuso orario non vengono archiviate come parte dei dati della colonna. Quando un utente recupera i dati, Oracle li restituisce nel fuso orario della sessione locale dell'utente. Questo tipo di dati è utile per le informazioni sulla data che devono essere sempre visualizzate nel fuso orario del sistema client in un'applicazione a due livelli.
 INTERVAL YEAR TO MONTH Memorizza un periodo di tempo utilizzando i campi ANNO e MESE datetime. Questo tipo di dati è utile per rappresentare la differenza tra due valori datetime quando solo i valori dell'anno e del mese sono significativi.
 INTERVAL DAY TO SECONDMemorizza un periodo di tempo in termini di giorni, ore, minuti e secondi. Questo tipo di dati è utile per rappresentare la differenza precisa tra due valori datetime.

RAW & LONG RAW Date Type

I tipi di dati RAW e LONG RAW memorizzano i dati che non devono essere convertiti in modo esplicito da Oracle Database quando questi vengono spostati tra sistemi diversi. Questi tipi di dati sono destinati a dati binari o stringhe di byte. Ad esempio, puoi utilizzare LONG RAW per archiviare grafica, suoni, documenti o array di dati binari, per i quali l'interpretazione dipende dall'uso.               

Oracle consiglia vivamente di convertire le colonne LONG RAW in colonne LOB binarie (BLOB). Le colonne LOB sono soggette a molte meno restrizioni rispetto alle colonne LONG. RAW è un tipo di dati a lunghezza variabile come VARCHAR2, tranne per il fatto che Oracle Net (che collega il software client a un database o un database a un altro) e le utility di export e import non eseguono la conversione dei caratteri durante la trasmissione di dati RAW o LONG RAW (diversamente da quanto accade per dati di tipo CHAR, VARCHAR2 e LONG in caso di characters set differenti tra sorgente e destinazione). 

LARGE OBJECT (LOB) Date Type

I tipi di dati LOB integrati BLOB, CLOB e NCLOB (memorizzati internamente) e BFILE (memorizzati esternamente) possono archiviare dati di grandi dimensioni e non strutturati come testo, immagine, video e dati spaziali. La dimensione dei dati BLOB, CLOB e NCLOB può arrivare fino a (232-1 byte) * (il valore del parametro CHUNK della memoria LOB). Se i tablespace nel database hanno una dimensione del blocco standard e se è stato utilizzato il valore predefinito del parametro CHUNK dell'archiviazione LOB durante la creazione di una colonna LOB, questo equivale a (232-1 byte) * (dimensione del blocco del database). I dati BFILE possono contenere fino a 264-1 byte, sebbene il sistema operativo possa imporre restrizioni su questo massimo. Quando si crea una tabella, è possibile specificare facoltativamente spazio tabella e caratteristiche di archiviazione per le colonne LOB o gli attributi degli oggetti LOB da quelli specificati per la tabella.


Nome  Descrìzione Dimensione
 BLOB Dati binari non strutturati. Gli oggetti BLOB possono essere considerati flussi di bit senza semantica del set di caratteri. Gli oggetti BLOB possono memorizzare dati binari fino a (4 gigabyte -1) * (il valore del parametro CHUNK della memoria LOB).
 CLOB Memorizza dati di caratteri a byte singolo e multibyte. Sono supportati sia i set di caratteri a larghezza fissa che quelli a larghezza variabile ed entrambi utilizzano il set di caratteri del database. Gli oggetti CLOB possono memorizzare fino a (4 gigabyte -1) * (il valore del parametro CHUNK della memoria LOB) di dati carattere. 
 NCLOB Il tipo di dati NCLOB memorizza i dati Unicode. Sono supportati sia i set di caratteri a larghezza fissa che quelli a larghezza variabile ed entrambi utilizzano il national characterset. Gli oggetti NCLOB possono memorizzare fino a (4 gigabyte -1) * (il valore del parametro CHUNK della memoria LOB) di dati di testo carattere.
 BFILE Il tipo di dati BFILE consente l'accesso ai LOB di file binari archiviati in file system al di fuori di Oracle Database. Una colonna o un attributo BFILE memorizza un localizzatore BFILE, che funge da puntatore a un file binario sul file system del server. Il localizzatore conserva il nome della directory e il nome del file. I BFILE non partecipano alle transazioni e non sono recoverabili ma è ill sistema operativo sottostante che garantisce l'integrità e il salvataggio dei file. BFILE possono raggiungere la dimensione massima fino a 264-1 bytes, sebbene il sistema operativo possa imporre delle restrizioni a tale dimensione.

EXTENDED Data Types

               A partire da Oracle Database 12c, è possibile specificare una dimensione massima di 32767 byte per i data types VARCHAR2, NVARCHAR2 e RAW. E’ possibile verificare se il database supporta questa nuova dimensione massima impostando il parametro di inizializzazione MAX_STRING_SIZE come segue:               
  • se MAX_STRING_SIZE = STANDARD, si applicano i limiti di dimensione per le versioni precedenti a Oracle Database 12c: 4000 byte per i tipi di dati VARCHAR2 e NVARCHAR2 e 2000 byte per il tipo di dati RAW. Questa è l'impostazione predefinita. 
  • se MAX_STRING_SIZE = EXTENDED, il limite di dimensione è 32767 byte per i tipi di dati VARCHAR2, NVARCHAR2 e RAW.


di Anna Bruno, pubblicato il 12 ottobre 2022