Riepilogo :in questo tutorial imparerai a conoscere il sistema dei tipi di dati SQLite e i relativi concetti come classi di archiviazione, tipizzazione manifest e affinità di tipo.
Introduzione ai tipi di dati SQLite
Se provieni da altri sistemi di database come MySQL e PostgreSQL, noterai che usano la tipizzazione statica . Significa che quando dichiari una colonna con un tipo di dati specifico, quella colonna può memorizzare solo i dati del tipo di dati dichiarato.
Diversamente da altri sistemi di database, SQLite utilizza sistema di tipo dinamico . In altre parole, un valore memorizzato in una colonna ne determina il tipo di dati, non il tipo di dati della colonna.
Inoltre, non è necessario dichiarare un tipo di dati specifico per una colonna quando si crea una tabella. Nel caso in cui dichiari una colonna con il tipo di dati intero, puoi memorizzare qualsiasi tipo di tipo di dati come testo e BLOB, SQLite non si lamenterà di questo.
SQLite fornisce cinque tipi di dati primitivi denominati classi di archiviazione.
Le classi di archiviazione descrivono i formati utilizzati da SQLite per archiviare i dati su disco. Una classe di archiviazione è più generale di un tipo di dati, ad esempio INTEGER
la classe di archiviazione include 6 diversi tipi di numeri interi. Nella maggior parte dei casi, puoi utilizzare classi di archiviazione e tipi di dati in modo intercambiabile.
La tabella seguente illustra 5 classi di archiviazione in SQLite:
Classe di archiviazione | Significato |
---|---|
NULLO | I valori NULL indicano informazioni mancanti o sconosciute. |
INTERO | I valori interi sono numeri interi (positivi o negativi). Un numero intero può avere dimensioni variabili come 1, 2,3, 4 o 8 byte. |
REALE | I valori reali sono numeri reali con valori decimali che utilizzano float a 8 byte. |
TESTO | TEXT viene utilizzato per memorizzare i dati dei caratteri. La lunghezza massima di TESTO è illimitata. SQLite supporta varie codifiche di caratteri. |
BLOB | BLOB sta per un oggetto binario di grandi dimensioni in grado di memorizzare qualsiasi tipo di dati. La dimensione massima di BLOB è, in teoria, illimitata. |
SQLite determina il tipo di dati di un valore in base al tipo di dati in base alle seguenti regole:
- Se un valore letterale non ha virgolette, punto decimale o esponente, SQLite assegna la classe di archiviazione INTEGER.
- Se un letterale è racchiuso tra virgolette singole o doppie, SQLite assegna la classe di archiviazione TEXT.
- Se un letterale non ha virgolette né punto decimale né esponente, SQLite assegna la classe di archiviazione REAL.
- Se un valore letterale è NULL senza virgolette, ha assegnato una classe di archiviazione NULL.
- Se un valore letterale ha X'ABCD' o x 'abcd', SQLite ha assegnato la classe di archiviazione BLOB.
SQLite non supporta le classi di archiviazione di data e ora integrate. Tuttavia, è possibile utilizzare TEXT, INT o REAL per memorizzare i valori di data e ora. Per informazioni dettagliate su come gestire i valori di data e ora, dai un'occhiata al tutorial di data e ora di SQLite.
SQLites fornisce il typeof()
funzione che permette di verificare la classe di memoria di un valore in base al suo formato. Vedi il seguente esempio:
SELECT
typeof(100),
typeof(10.0),
typeof('100'),
typeof(x'1000'),
typeof(NULL);
Code language: SQL (Structured Query Language) (sql)
Una singola colonna in SQLite può memorizzare tipi di dati misti. Vedi l'esempio seguente.
Innanzitutto, crea una nuova tabella denominata test_datatypes
per il test.
CREATE TABLE test_datatypes (
id INTEGER PRIMARY KEY,
val
);
Code language: SQL (Structured Query Language) (sql)
In secondo luogo, inserisci i dati in test_datatypes
tabella.
INSERT INTO test_datatypes (val)
VALUES
(1),
(2),
(10.1),
(20.5),
('A'),
('B'),
(NULL),
(x'0010'),
(x'0011');
Code language: SQL (Structured Query Language) (sql)
Terzo, usa typeof()
funzione per ottenere il tipo di dati di ogni valore memorizzato nel val
colonna.
SELECT
id,
val,
typeof(val)
FROM
test_datatypes;
Code language: SQL (Structured Query Language) (sql)
Potresti chiedere in che modo SQLite ordina i dati in una colonna con classi di archiviazione diverse come la colonna val sopra.
Per risolvere questo problema, SQLite fornisce il seguente insieme di regole quando si tratta di ordinare:
- La classe di archiviazione NULL ha il valore più basso. È inferiore a qualsiasi altro valore. Tra i valori NULL, non c'è ordine.
- Le successive classi di archiviazione superiori sono INTEGER e REAL. SQLite confronta numericamente INTEGER e REAL.
- La successiva classe di archiviazione superiore è TEXT. SQLite usa le regole di confronto dei valori di TESTO quando confronta i valori di TESTO.
- La classe di archiviazione più elevata è il BLOB. SQLite usa la funzione C
memcmp()
per confrontare i valori BLOB.
Quando usi il ORDER BY
clausola per ordinare i dati in una colonna con diverse classi di archiviazione, SQLite esegue i seguenti passaggi:
- In primo luogo, raggruppa i valori in base alla classe di archiviazione:NULL, INTEGER e REAL, TEXT e BLOB.
- In secondo luogo, ordina i valori in ciascun gruppo.
L'istruzione seguente ordina i dati misti in val
colonna dei test_datatypes
tabella:
SELECT
id,
val,
typeof(val)
FROM
test_datatypes
ORDER BY val;
Code language: SQL (Structured Query Language) (sql)
Tipologia del manifesto SQLite e affinità di tipo
Altri concetti importanti relativi ai tipi di dati SQLite sono la tipizzazione manifest e l'affinità del tipo:
- La tipizzazione manifest significa che un tipo di dati è una proprietà di un valore memorizzato in una colonna, non la proprietà della colonna in cui è memorizzato il valore. SQLite utilizza la tipizzazione manifest per memorizzare valori di qualsiasi tipo in una colonna.
- L'affinità del tipo di una colonna è il tipo consigliato per i dati archiviati in quella colonna. Tieni presente che il tipo di dati è consigliato, non obbligatorio, quindi una colonna può memorizzare qualsiasi tipo di dato.
In questo tutorial, hai appreso i tipi di dati SQLite e alcuni concetti importanti, tra cui le classi di archiviazione, la tipizzazione manifest e l'affinità dei tipi.