Nelle lezioni precedenti di T-SQL abbiamo visto come le tabelle siano gli oggetti all'interno dei databases destinati a contenere i nostri dati.
Quando creiamo una tabella dobbiamo definire in modo esatto il tipo di dati che ogni colonna può contenere. SQL Server ci permette di definire vari tipi di dati utili per immagazzinare: caratteri, numeri, bytes, date, immagini, ecc... oltre a questo possiamo definire tipi di dati personalizzati secondo le nostre esigenze.
Tipi di dati con SQL Server
Ecco l'elenco e la descrizione dei tipi di dati disponibili con SQL Server 7.0:
Dati binari:
- binary[(n)]
ha una lunghezza fissa e può contenere fino ad 8000 bytes di dati
binari - varbinary[(n)]
ha una lunghezza variabile e può contenere fino ad 8000 bytes di
dati binari
Dati carattere: varchar SQL
- char[(n)]
ha una lunghezza fissa e può contenere fino ad 8000 caratteri ANSI
(cioè 8000 bytes) - varchar[(n)]
ha una lunghezza variabile e può contenere fino ad 8000 caratteri
ANSI (cioè 8000 bytes) - nchar[(n)]
ha una lunghezza fissa e può contenere fino a 4000 caratteri
UNICODE (cioè 8000 bytes, ricordiamo che per i caratteri UNICODE
servono 2 bytes per memorizzare un carattere) - nvarchar[(n)]
ha una lunghezza variabile e può contenere fino a 4000 caratteri
UNICODE (cioè 8000 bytes, ricordiamo che per i caratteri UNICODE
servono 2 bytes per memorizzare un carattere)
Dati ora e data:
- datetime
ammette valori compresi dal 1 gennaio 1753 al 31 dicembre 9999
(precisione al trecentesimo di secondo), occupa uno spazio di 8 byte - smalldatetime
meno preciso del precedente (precisione al minuto), ,occupa uno
spazio di 4 byte
Dati monetari:
- money
Contiene valori monetari da -922337203685477.5808 a
922337203685477.5807 con una precisione al decimillesimo di unità
monetaria, occupa 8 bytes di memoria - smallmoney
Contiene valori monetari da - 214748.3648 a 214748.3647 con una
precisione al decimillesimo di unità monetaria, occupa 4 bytes di
memoria.
Dati numerici approssimati: SQL float
- float[(n)]
Contiene numeri a virgola mobile positivi e negativi, compresi tra
2.23E-308 e 1.79E308 per i valori positivi e tra -2.23E-308 e
-1.79E308 per i valori negativi, occupa 8 bytes di memoria ed ha una
precisione di 15 cifre - real
Contiene numeri a virgola mobile positivi e negativi comprese tra
1.18E-38 e 3.40E38 per i valori positivi e tra -1.18E-38 e -3.40E38
per i valori negativi, occupa 4 bytes di memoria ed ha una
precisione di 7 cifre
Dati numerici esatti: SLQ int
- decimal[(p[, s])]
- numeric[(p[, s])]
decimal e numeric sono sinonimi per SQL Server 7, possono avere
valori compresi tra 10^38 - 1 e - 10^38 -1. La memoria che occupano
per essere immagazzinati varia a seconda della precisione che
utilizziamo per rappresentarli, da un minimo di 2 bytes a un massimo
di 17 bytes
p - è la precisione, che rappresenta il numero massimo di cifre
decimali che possono essere memorizzate (da entrambe le parti della
virgola). Il massimo della precisione è 28 cifre.
s - è la scala, che rappresenta il numero di massimo di cifre
decimali dopo la virgola e deve essere minore od uguale alla
precisione. - int
occupa 4 byte di memoria e memorizza i valori da -2147483648 a
2147483647 - smallint
occupa 2 byte di memoria e memorizza i valori da -32768 a 32,767 - tinyint
occupa 1 byte di memoria e memorizza i valori da 0 a 255
Dati speciali:
- bit
tipicamente è usato per rappresentare i flag, vero/false o true/false
o si/no, perché può accettare solo due valori 0 o 1. Occupa un bit
ovviamente. Le colonne che hanno un tipo dati bit non possono avere
valori nulli e non possono avere indici. - cursor
sono usati come varibili in stored proc oppure come parametri di
OUTPUT sempre in stored proc, fanno riferimento ai cursori. Possono
essere nulli e non possono essere usati con le istruzioni CREATE
TABLE. - sysname
una varchar di 128 caratteri ed occupa 256 bytes, viene usato per
assegnare i nomi ad ogggetti del database, come tabelle, procedure,
triggere, indici, ecc... - timestamp
occupa 8 bytes ed è un contatore incrementale per colonna assegnato
automaticamente da SQL Server 7. - UNIQUEIDENTIFIER (GUID)
E' un identificatore unico a livello globale di 16 byte di lunghezza
chiamato anche GUID. E' generato (molto lentamente) automaticamente
da SQL Server.
Dati text ed image:
I dati di questo tipo, non vengono memorizzati nelle normali pagine dati
di SQL Server, ma sono tratati in modo speciale su apposite pagine di
memorizzazione.
- text
un tipo dati a lunghezza variabile, che può memorizzare fino a
2147483647 caratteri. - ntext
come il precedente ma memorizza caratteri UNICODE, quindi fino alla
metà del precedente, cioè 1073741823 caratteri. - image
può memorizzare fino a 2147483647 bytes di dati binari, è
solitamente usato per le immagini.
Sinonimi per i tipi di dati in SQL Server
Per assicurare la compatibilità con lo standard SQL-92, SQL Server può
usare i seguenti sinonimi per i corrispondenti tidi di dati quando
usiamo istruzioni che fanno parte del data definition language (DDL),
come CREATE TABLE, CREATE PROCEDURE o in DECLARE @nomevariable.
Sinonimo | Mappato su SQL Server 7.0 |
Binary varying | Varbinary |
char varying | Varchar |
character | Char |
character | char(1) |
character(n) | char(n) |
character varying(n) | varchar(n) |
Dec | decimal |
Double precision | float |
float[(n)] for n = 1-7 | real |
float[(n)] for n = 8-15 | float |
Integer | Int |
national character(n) | nchar(n) |
national char(n) | nchar(n) |
national character varying(n) | nvarchar(n) |
national char varying(n) | nvarchar(n) |
national text | ntext |
Vediamo un esempio:
use tempdb
go
declare @sinonimo_carattere national character varying(10)
/* è la stessa cosa che scrivere: */
declare @carattere nvarchar(10)
La conversione dei data types in altri linguaggi
Una delle cose che T-SQL non fa è mappare i tipi di dati con quelli di
altri linguaggi di programmazione. Nelle due tabelle sottostanti abbiamo
le corrispondenze tra i tipi di dati di SQL Server e quelli di Visual
Basic (VB)
Convertire I VB Data Types in SQL Server Data Types | |
Tipi di dati in VB | Tipi di dati corrispondenti in SQL Server |
Long, Integer, Byte, Boolean | T-SQL Int |
Double, Single | T-SQL Float |
Currency | T-SQL Money |
Date | T-SQL DateTime |
Stringhe fino a 255 caratteri | T-SQL VarChar |
Stringhe superiori a 255 caratteri |
T-SQL Text |
Array monodimensionale fino a 255 elementi |
T-SQL VarBinary |
Array monodimensionale con più di 255 elementi | T-SQL Image |
Cosa è lo standard UNICODE ?
Lo standard UNICODE a differenza dello standard
ANSI mira a supportare tutti i caratteri dei linguaggi e alfabeti del mondo.
UNICODE è ben supportato nei programma che girano nella galassia
Windows: NT, W 95, 98 ME, 2000 ma non efficacemente nei sistemi UNIX
,IBM, e DOS.
La memoria necessaria per memorizzare un carattere UNICODE è doppia (2
byte per carattere) rispetto a quella per i caratteri ANSI (1 byte per
carattere)
In Sql Server i tipi dati che supportano lo standard UNICODE sono: nchar,
nvarchar, ntext. Il prefisso n(national) non è casuale ma è stato
fissato dallo standard SQL-92.
I caratteri codificabili con UNICODE sono oltre 65.000 con ANSI solo 256.