Nel precedente articolo avevamo visto quali erano i principali tipi di dati di un database Access, e spiegato l'importanza del corretto utilizzo dei tipi nella definizione di una tabella di un database. Ribadiamo nuovamente che la definizione dei tipi in un database è un'operazione fondamentale, la scelta adeguata del tipo di dato adatto a rappresentare un'informazione costituisce la base per lo sviluppo di un'applicazione funzionale e manutenibile, e permette inoltre di ottimizzare le tabelle e lo spazio che esse occupano.
Pertanto, oggi voglio parlarvi dei tipi definibili per un'altro noto e diffusissimo database relazionale, stiamo parlando di Sql Server, il potente database Engine di casa Microsoft.
Anche per Sql Server conoscere e definire i tipi di dati corretti, è un passo di fondamentale per l'architettura di un database performante. Noteremo come a differenza di Access i tipi di dato definibili in Sql Server è molto più ampia e completa sotto tutti i punti di vista, si possono infatti di definire tipi per qualsivoglia dato e con dimensioni di gran lunga superiori a quelle permesse d'Access, sino a giungere alla dichiarazione di tipi personalizzati definiti dall'utente. Andiamo quindi a vedere quindi quali sono i tipi di dato in Sql Server.
I tipi di dati definibili in Sql Server secondo lo standard TRANSACT-SQL possono riassumersi sostanzialmente in cinque Categorie, le quali a loro volta contengono vari tipi di dato a seconda delle informazioni che si vogliono rappresentare e lo spazio occupate da queste, le categorie sono:
Dati di tipo Numerico
Tra questi tipi di dato rientrano la definizione di numeri sui quali è possibile effettuare operazioni matematiche, questi sono:
- TINYINT: rappresenta un valore numerico non negativo compreso tra 0 e 255 ed occupa la dimensione di 1 byte, viene spesso usato per archiviare una Enumerazione o Enum
- SMALLINT: rappresenta un'intero semplice, ed occupa la dimensione di 2 byte, con valori compresi quindi tra -32768 e 32767
- INT: rappresenta un'intero semplice, ed occupa la dimensione di 4 byte, con un range di valori doppi pertanto rispetto allo SMALLINT
- BIGINT: rappresenta un'intero con una dimensione di 8 byte, con valori compresi quindi tra -2^64 e 2^64 - 1
- DECIMAL(p,s): rappresenta un numero decimale in virgola fissa, il parametro "p" indica la precisione, cioè il numero totale di cifre, mentre "s" indica le cifre dopo la virgola, ed occupa una dimensione in byte che può variare da 5 a 17, a seconda del valore di "p". Per rappresentare un numero decimale in Sql Server oltre a DEC (Decimal) viene usato anche il tipo NUMERIC(p,s)
- REAL: rappresenta un numero reale in virgola mobile, ed occupa una dimensione di 16 byte
- FLOAT(p): rappresenta un numero reale in virgola mobile, permettendo a differenza di REAL di specificarne la precisione tramite il parametro "p". Per p <= 25 abbiamo precisione singola ed occupa 4 byte, per p maggiore di 25 la precisione invece è doppia occupando 8 byte
- MONEY: rappresenta un dato numerico indicante un valore monetario, e sostanzialmente sono come i DECIMAL di 8 byte con un'arrotondamento a 4 cifre dopo la virgola
- SMALLMONEY: come il MONEY ma occupa una dimensione di 4 byte anzichè di 8.
Il calcolo del range di valori acquisibile da ogni tipo è molto semplice, considerato che un byte è formato da 8 bit, e la base è quella binaria, il numero di valori è dato da 2^(n°byte x 8) - 1. Quindi per il tipo TINYNT (1 byte = 8 bit), avremo: (2^8) = 256 ovvero da 0 a 255 possibili valori.
Notiamo subito rispetto ad Access la varietà di dati numerici definibili con Sql Server, molto più ampia e con capacità di archiviazione maggiore; inoltre altra grande differenza in Sql Server tra i tipi di dato numerici, non abbiamo il tipo Contatore o ID Replica presente in Access per la definizione delle chiavi primarie, per Sql Server si usa il GUID che vedremo dopo.
Dati di tipo Testuale
Tra questi tipi di dato rientrano le stringhe, ossia quei dati che permettono di definire un testo. Rispetto ad Access però in Sql Server oltre alle stringhe di caratteri esistono altri due tipi di stringhe, quelle binarie e quelle di bit, le definizioni possibili per i tipi stringa sono:
- CHAR(n): rappresenta una stringa testuale fissa di caratteri alfanumerici, dove "n" nè indica la lunghezza che è pari al massimo ad 8000, la dimensione occupata dipende dalla definizione di n, anche se poi il numero di caratteri inseriti sarà effettivamente minore, quindi per n uguale a 50, questo campo occuperà 50 bytes anche se inseriamo una quantità inferiore di caratteri
- VARCHAR(n): indica una stringa di lunghezza variabile, con n sempre pari a max 8000, solo che a differenza del primo lo spazio occupato dipende dal numero effettivo di caratteri inseriti e non dalla specifica di n, dove ricordiamo che ogni carattere occupa la dimensione di 1 byte. Da notare che può contenere anche valori di tipo NULL
- NCHAR(n): come CHAR(n), solo che permette di specificare caratteri UNICODE, i quali occupano una dimensione di 2 byte anzichè 1, e pertanto la lunghezza massima definibile tramite il parametro n è di 4000 anzichè 8000
- NVARCHAR(n): come VARCHAR(n), dove valgono le stesse cose dette per NCHAR, ovvero caratteri UNICODE di 2 byte ciascuno
- TEXT(n): usato per definire stringhe di lunghezza fissa, di dimensioni massime di 2 Gigabyte
- NTEXT(n): usato come TEXT per stringhe molto lunghe, e ciascun carattere occupa 2 byte contro il singolo byte di TEXT.
Per quanto riguarda invece le stringhe di tipo binario e di bit, queste vengono usate per rappresentare degli ogetti nello stesso formato di quello del sistema, ovvero il binario, queste sono:
- BINARY(n): indica una stringa di bit di lunghezza fissa, dove "n" è sempre max di 8000
- VARBINARY(n): indica una stringa di bit a lunghezza variabile
- IMAGE(n): come BINARY, solo che viene usata per sequenze di bit molto grandi, in quanto ha una capacità di archiviazione di gran lunga superiore a BINARY. Il nome stesso fà intuire che può essere usata per l'archiviazione d'immagini, documenti, videoclip come stream di bit all'interno del database stesso
- BIT: indica un valore di tipo booleano, o vero o falso, o acceso o spento, ed occupa la dimensione di un solo bit.
NOTA: a partire da Sql Server 2005 sono stati introdotti, o mmglio estesi, tre tipi di dati, questi sono: VARCHAR(MAX), NVARCHAR(MAX), VARBINARY(MAX) che consentono di archiviare grandi quantità di dati, superando il limite di 8000 fissato per i loro fratellini più piccoli, vengono infatti definiti come Large Value, ed hanno il grande pregio di poter sostituire i tipi di dato TEXT/IMAGE per la memorizzazione di dati molto grandi, quest'ultimi infatti sono deprecati in quanto usano una tecnica di memorizzazione non conforme con gli altri dati.
Dati di tipo Temporali
In Sql Server i dati per indicare la data e l'ora, anche se espressi sempre in un formato numerico, costituisce una categoria a parte, questi sono:
- DATETIME: indica una data e un'ora, archiviata come valore numerico occupante una dimensione di 4 bytes
- SMALLDATETIME: come il DATETIME, solo che occupa 2 byte anzichè 4.
NOTA: Il formato con cui viene archiviata la Data e l'ora racchiuse tra virgolette, è quello di "mm gg yyyy" per la data e "hh:mm AM" o "hh:mm PM" per l'ora. Invece il modo in cui viene rappresentata (formato italiano o americano, h24 o AM/PM, nome del mese o numero) può essere impostato tramite l'utilizzo del parametro SET DATEFORMAT, inoltre Sql Server riconosce anche i separatori " -" e "/" per la scrittura della data.
Dati di tipo Derivati
Questi tipi di dati derivano dai tipi base definiti precedentemente, e solitamente vengono usati per gestire informazioni interne al database stesso, questi sono:
- TIMESTAMP: deriva da BINARY o VARBINARY a secoda che possieda o meno il valore null, indica un valore che viene incrementato ogni qual volta un record contenente un valore di TIMESTAMP viene inserito o modificato. Si può accedere al valore di TIMESTAMP tramite la variabile globale @@dbts, e risulta utile per risalire all'ora di modifica o inserimento di un record
- SYSNAME: deriva dal tipo NVARCHAR e viene usato per definire i nomi degli oggetti interni del database.
Dati di tipo Identificativo Univoco
Avevamo accennato in precedenza che Sql Server a differenza di Access, non possiede il tipo ID Replica, e per definire le proprie chiavi primarie fà uso del tipo UNIQUEIDENTIFIER, che rappresenta una stringa binaria di numeri di 16 byte, esso viene usato e gestito a livello di codice tramite il tipo GUID (Globally Unique Identifier), largamente usato come identificativo univoco e per la definizione di chiavi e relazioni.
In Sql Server esiste già una funzione che permette di generare un UNIQUEIDENTIFIER a livello d'istruzione TRANSACT-SQL, questa è NEW_ID.
Tipi di dato personalizzati
Sql Server consente di definire anche dei tipi di dati personalizzati usando linguaggi di programmazione quali C# e VB; in tal senso è possibile quindi definire anche funzioni, procedure e trigger a livello di codice da usare poi come tipi all'interno del proprio database.
Conclusioni
Come già accennato più volte, conoscere e definire i tipi di dato corretti durante la strutturazione delle tabelle del nostro database è di fondamentale importanza per l'ottimizzazione e le performance non solo del database stesso ma di tutta l'applicazione su cui esso si appoggia. Per completezza diciamo anche, che a partire da Sql Server 2005 in poi è possibile anche usare il tipo di dati XML, che consente di memorizzare all'interno del database documenti formattati in XML.
Chiunque volesse aggiungere qualcosa in merito all'argomento o porre una domanda può farlo benissimo tramite i commenti.