La scelta del tipo di dati corretto per una colonna di tabella è una decisione importante. Riduce la necessità di conversioni del tipo di dati, migliora le prestazioni delle query del database e riduce al minimo i requisiti di archiviazione.
In questa guida esplorerai i vari tipi di dati utilizzati nei sistemi di gestione di database relazionali (RDBMS). Questi tipi di dati possono essere utilizzati durante la creazione o la modifica di una tabella o durante la dichiarazione di variabili nelle stored procedure del database. Alcuni noti RDBMS sono MySQL e PostgreSQL.
Tipi di dati binari SQL
Per memorizzare dati binari (0
o 1
), utilizzi il BINARY
e VARBINARY
tipi di dati. Il BINARY
il tipo di dati memorizza dati binari a lunghezza fissa, mentre VARBINARY
memorizza dati binari a lunghezza variabile. Entrambi questi tipi di dati vengono utilizzati per memorizzare stringhe di bit (0
's e 1
'S). I loro valori vengono assegnati e recuperati utilizzando la rappresentazione esadecimale, indicata da un prefisso 0x
. Le colonne (o variabili) di entrambi i Binary
e VarBinary
i tipi di dati vengono utilizzati per memorizzare il contenuto di file di immagine come JPEG, BMP, file di documenti, ecc.
Ad esempio, per un valore decimale di 63
, il suo valore esadecimale è rappresentato da 0x3F
e la sua stringa di bit binari equivalente è 111111
. Per comprendere il valore di queste stringhe binarie e come vengono archiviate, considera l'esempio seguente:
Nota Salvo diversa indicazione, tutti i comandi del database illustrati in questa guida funzionano bene su entrambi MySQL e PostgreSQL .
-
Dalla riga di comando, crea una tabella chiamata
BinaryExample
come mostrato di seguito:CREATE TABLE BinaryExample ( BinaryCol BINARY (10), VarBinaryCol VARBINARY (10) );
-
Inserisci una riga in
BinaryExample
tabella:INSERT INTO BinaryExample (BinaryCol, VarBinaryCol) VALUES (0x4D7953514C, 0x39274D);
-
Seleziona i dati da
BinaryExample
tabella:SELECT BinaryCol, VarBinaryCol FROM BinaryExample;
L'output ha il seguente aspetto:
+------------------------+----------------------------+ | BinaryCol | VarBinaryCol | +------------------------+----------------------------+ | 0x4D7953514C0000000000 | 0x39274D | +------------------------+----------------------------+
Come puoi vedere, il BinaryCol
i dati vengono riempiti alla dimensione massima della colonna con zeri finali, ma il VarBinaryCol
la colonna dei dati non lo è. Questo perché le colonne di VarBinaryCol
sono definiti come lunghezza variabile.
Nota La dimensione massima (lunghezza) dei tipi di dati Binary e VarBinary varia a seconda dell'implementazione del database. Sono generalmente abbastanza grandi (oltre 8.000 byte). Alcune implementazioni di database hanno estensioni binarie a questi tipi di dati di base che possono archiviare dati in dimensioni di più gigabyte.
Tipi di dati numerici SQL
I tipi di dati numerici disponibili possono essere suddivisi nei seguenti gruppi:tipi di dati numerici interi, tipi di dati numerici esatti e tipi di dati numerici approssimativi. Le sezioni seguenti discutono ogni gruppo.
Tipi di dati numerici interi
I tipi di dati interi possono essere Unsigned e Signed. Non firmato può memorizzare solo numeri zero e positivi, mentre Signed consente numeri zero, positivi e negativi.
La maggior parte delle implementazioni SQL supporta i tipi di dati Interi di INT
, SMALLINT
e TINYINT
per la memorizzazione di numeri interi positivi e negativi. Il tipo di dati numerico intero che scegli dipende dall'intervallo di valori che devi archiviare.
La tabella seguente mostra la memorizzazione consentita in byte per i tipi di dati numerici interi e i relativi valori SIGNED minimo e massimo.
Tipo | Archiviazione (byte) | Valore minimo FIRMATO | Valore massimo FIRMATO |
---|---|---|---|
INT | 4 | meno 2^31 (-2147483648) | più 2^31 (2147483647) |
SMALLINT | 2 | meno 2^15 (-32768) | più 2^15 (32767) |
TINYINT | 1 | -128 | 127 |
L'esempio seguente mostra i valori con segno minimo e massimo dei tipi di dati numerici Integer utilizzando una tabella denominata NumericExample
.
-
Dalla riga di comando, crea l'
NumericExample
tabella.CREATE TABLE NumericExample ( IntColumn INT, SmallIntColumn SMALLINT, TinyIntColumn TINYINT );
-
Inserisci i seguenti valori in
NumericExample
tabella.INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (3258594758, 32767, 255);
Quando esegui il comando sopra, ottieni un
Out of range
errore come mostrato nell'output di seguito. Non puoi inserire i valori3258594758
e255
aIntColumn
eTinyIntColumn
rispettivamente. Questo perché il valore SIGNED massimo per un tipo di dati intero è2147483647
e quello di TinyInt è127
.ERROR 1264 (22003): Out of range value for column 'IntColumn' at row 1
-
Aggiorna i valori di
IntColumn
eTinyIntColumn
colonne ed eseguire nuovamenteINSERT
comando.INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (2147483647, 32767, 127);
-
Recupera i valori delle colonne usando
SELECT
dichiarazione:SELECT IntColumn, SmallIntColumn, TinyIntColumn FROM NumericExample;
L'output è simile all'esempio seguente:
+------------+----------------+---------------+ | IntColumn | SmallIntColumn | TinyIntColumn | +------------+----------------+---------------+ | 2147483647 | 32767 | 127 | +------------+----------------+---------------+
Tipi di dati numerici decimali (numerico esatto)
I tipi di dati decimali, DECIMAL
e NUMERIC
, memorizza valori numerici esatti e fissi. Questi tipi di dati sono anche noti come numerico esatto tipi di dati. Memorizzano un valore intero a sinistra della virgola decimale e un valore frazionario a destra della virgola decimale. Sono funzionalmente equivalenti con gli stessi requisiti di archiviazione. La memoria utilizzata per questi tipi dipende dalla precisione e dagli intervalli specificati. Possono variare da 2 byte a 17 byte e i loro valori possono variare da -10^38 +1
a +10^38 -1
.
Questi due tipi di dati sono definiti da una precisione e una scala . La precisione indica il numero di posizioni a sinistra ea destra della virgola decimale combinate, mentre la scala indica il numero totale di cifre a destra della virgola decimale. Questi due tipi di dati vengono creati utilizzando la seguente sintassi:
DECIMAL(precision, scale)
o
NUMERIC(precision,scale)
L'esempio seguente mostra come creare e utilizzare il tipo di dati numerico decimale.
-
Dalla riga di comando, crea il
ExactNumericExample
tabella.CREATE TABLE ExactNumericExample ( DecimalCol DECIMAL(5,2), NumericCol NUMERIC(7,2) );
-
Inserisci i seguenti valori in
ExactNumericExample
tabella.INSERT INTO ExactNumericExample (DecimalCol, NumericCol) VALUES (123.45, 12345.67);
-
Recupera i valori delle colonne usando
SELECT
dichiarazione:SELECT DecimalCol, NumericCol FROM ExactNumericExample;
L'output è simile al seguente:
+------------+------------+ | DecimalCol | NumericCol | +------------+------------+ | 123.45 | 12345.67 | +------------+------------+
Tipi di dati numerici a virgola mobile (numerico approssimativo)
I tipi di dati numerici in virgola mobile sono FLOAT
e REAL
. Sono anche chiamati numerico approssimativo tipi di dati. Questi tipi di dati memorizzano un valore approssimativo dovuto alla rappresentazione binaria dei dati in virgola mobile. La sintassi per creare una colonna o una variabile in virgola mobile è la seguente:
Float(N)
Il parametro N
indica se il campo deve contenere quattro o otto byte. Un valore di N
maggiore di sette richiede otto byte; sette o meno richiede quattro byte. La precisione mobile per questo tipo di dati varia da -1.79E + 308
a 1.79E + 308
.
Allo stesso modo, una colonna e una variabile definite come tipo di dati REAL
occupa quattro byte di memoria e fornisce un intervallo di valori da -3.40E + 38
a 3.40E + 38
.
Tipi di dati di carattere SQL
I tipi di dati CHAR
e VARCHAR
vengono utilizzati per memorizzare dati di caratteri fino a 8.000 byte di lunghezza. Entrambi questi tipi di dati memorizzano i valori di stringa nelle colonne del database, ma differiscono nel modo in cui i loro valori vengono archiviati e recuperati. La lunghezza del CHAR
il tipo di dati rimane fisso alla lunghezza specificata indipendentemente dal fatto che lo spazio di allocazione venga utilizzato o meno. Se lo spazio non viene utilizzato, la colonna o la variabile viene riempita con spazi aggiuntivi. VARCHAR
restituisce il valore così com'è, senza spazi aggiuntivi.
L'esempio seguente mostra il tipo di dati del carattere.
-
Dalla riga di comando, crea il
Employee
tabella.CREATE TABLE Employee ( LastName VARCHAR(25), FirstName VARCHAR(20), Sex CHAR(1) );
-
Inserisci i seguenti valori nel
Employee
tabella.INSERT INTO Employee (LastName, FirstName, Sex) VALUES ('Jones', 'Mary', 'F');
-
Recupera i valori delle colonne usando
SELECT
dichiarazione:SELECT LastName, FirstName, Sex FROM Employee;
L'output vorrebbe quanto segue:
+----------+-----------+------+ | LastName | FirstName | Sex | +----------+-----------+------+ | Jones | Mary | F | +----------+-----------+------+
Le colonne LastName
e Firstname
sono dichiarati di tipo Varchar
. Ciò consente ai nomi di essere lunghi quanto la definizione del tipo di dati. Ma per i nomi più brevi del massimo specificato, non vengono aggiunti spazi vuoti ai dati in queste colonne.
Tipo di dati SQL Data e ora
Il DATETIME
il tipo di dati viene utilizzato per memorizzare i valori di data e ora nel database. Valori per DATETIME
il tipo di dati utilizza quattro byte di memoria per la parte della data e quattro byte per la parte dell'ora. La parte temporale di questo tipo di dati specifica l'ora con una granularità fino al numero di millisecondi dopo la mezzanotte. La precisione per questo tipo di dati varia da "1 gennaio 1753" a "31 dicembre 9999", con una precisione di 3,33 millisecondi.
Nota Se assegni solo il valore della data a un DATETIME
colonna o variabile del tipo di dati, la parte dell'ora per impostazione predefinita è mezzanotte.
L'esempio seguente mostra il DATETIME
tipo di dati.
DELIMITER //
CREATE PROCEDURE Datetimedemo()
BEGIN
DECLARE BirthDate DATETIME
SET BirthDate = '1990-01-01 09:00:00'
SELECT BirthDate
END//
DELIMITER ;
call Datetimedemo;
L'output è simile al seguente:
+----------+-----------+
| BirthDate |
+----------+-----------+
| 1990-01-01 09:00:00 |
+----------+-----------+
Nota Alcune implementazioni SQL supportano tipi di dati aggiuntivi, che sono un sottoinsieme, un superset o una variante di tutti i tipi di dati sopra specificati.
Considerazioni sui tipi di dati SQL
Quando si progetta un database, è estremamente importante selezionare con attenzione i tipi di dati appropriati per le colonne della tabella e le variabili della procedura memorizzata.
Le scelte effettuate possono avere un impatto significativo sull'efficienza dello storage e sulle prestazioni complessive del database. Un semplice esempio è definire l'Age
di una persona colonna deve essere del Tinyint
tipo di dati, al contrario di Int
tipo di dati. Ciò è dovuto ai seguenti motivi:
- Come notato in precedenza,
Tinyint
i tipi di dati hanno ¼ dei requisiti di archiviazione diInt
tipi di dati. - L'efficienza di recupero di un
Tinyint
colonna rispetto a unInt
colonna è molto più grande.
In apparenza, questo potrebbe non sembrare una grande preoccupazione. Tuttavia, se la tabella interessata contiene milioni di righe, è sicuramente possibile ottenere sia l'efficienza di archiviazione che le prestazioni. Se estendi questi criteri di progettazione a un intero database, puoi generare queste efficienze per ordini di grandezza.
Trascorrere il tempo di progettazione necessario nella selezione del tipo di dati del database può potenzialmente ridurre la necessità di eseguire costose conversioni di tipo nelle query e nella logica della procedura memorizzata, quando si confrontano colonne di tipi di dati diversi.
Ad esempio, in una tabella, memorizzi una data in un Varchar(20)
colonna e in un'altra tabella memorizzi una data in un Datetime
colonna. Se è necessario confrontare le due colonne, è necessario utilizzare una funzione di conversione del tipo di dati in una query su una delle due colonne. Questa è un'operazione costosa.
Conclusione
I tipi di dati SQL sono gli attributi associati alle colonne e alle variabili del database. Questi attributi possono assumere la forma di essere binari, numerici, caratteri e data/ora. È necessario un attento tempo di progettazione per garantire che le colonne e le variabili siano definite con un tipo di dati corretto, per garantire l'efficienza dell'archiviazione e dell'esecuzione delle query.