SQLite - Tipi di Dati

Ciao, futuri maghi dei database! Oggi ci immergeremo nel mondo affascinante dei tipi di dati di SQLite. Non preoccuparti se sei nuovo alla programmazione - sarò il tuo guida amichevole in questo viaggio, spiegando tutto passo per passo. Allora, prenditi una tazza di caffè (o tè, se è la tua cosa), e iniziamo!

SQLite - Data Type

Classi di Storage di SQLite

Prima di tutto, parliamo delle classi di storage di SQLite. Pensa a queste come i mattoni fondamentali dei dati in SQLite. Ci sono cinque classi di storage principali:

  1. NULL
  2. INTEGER
  3. REAL
  4. TEXT
  5. BLOB

Analizziamo queste con alcuni esempi:

NULL

CREATE TABLE example (
id INTEGER,
name TEXT,
age INTEGER
);

INSERT INTO example (id, name) VALUES (1, 'Alice');

In questo esempio, abbiamo creato una tabella e inserito una riga dove la colonna 'age' non è specificata. SQLite assegna automaticamente un valore NULL. NULL rappresenta l'assenza di dati - è come dire, "Non conosciamo l'età di Alice."

INTEGER

INSERT INTO example (id, name, age) VALUES (2, 'Bob', 30);

Qui, abbiamo inserito l'età di Bob come 30. SQLite memorizza questo come un INTEGER. Gli interi sono numeri interi senza decimali.

REAL

CREATE TABLE products (
id INTEGER,
name TEXT,
price REAL
);

INSERT INTO products (id, name, price) VALUES (1, 'Coffee', 3.99);

Il prezzo 3.99 è memorizzato come un REAL, che è il modo di SQLite per gestire i numeri a virgola mobile.

TEXT

INSERT INTO example (id, name, age) VALUES (3, 'Charlie', '25 years old');

Anche se stiamo memorizzando l'età, abbiamo usato TEXT qui. SQLite memorizzerà "25 years old" come una stringa di caratteri.

BLOB

BLOB sta per Binary Large Object. Viene utilizzato per memorizzare dati binari come immagini o file.

CREATE TABLE files (
id INTEGER,
name TEXT,
content BLOB
);

-- Inserire un BLOB di solito viene fatto nel codice dell'applicazione, non in SQL raw

Affinità di Tipo in SQLite

Ora, parliamo dell'affinità di tipo. È il modo di SQLite per essere flessibile con i tipi di dati. Immagina SQLite che fa del suo meglio per capire che tipo di dati vuoi memorizzare.

Ci sono cinque affinità di tipo in SQLite:

  1. TEXT
  2. NUMERIC
  3. INTEGER
  4. REAL
  5. BLOB

Ecco una tabella divertente per mostrarti come SQLite decide quale affinità utilizzare:

Se il tipo dichiarato contiene... L'affinità è...
INT INTEGER
CHAR, CLOB, TEXT TEXT
BLOB BLOB
REAL, FLOA, DOUB REAL
Anything else NUMERIC

Vediamo questo in azione:

CREATE TABLE affinity_example (
a TEXT,
b NUMERIC,
c INTEGER,
d REAL,
e BLOB
);

INSERT INTO affinity_example VALUES
('123', '456', '789', '101112', x'ABCDEF');

SELECT typeof(a), typeof(b), typeof(c), typeof(d), typeof(e) FROM affinity_example;

Questo stamperà:

text, integer, integer, real, blob

Noterai come '456' è diventato un intero a causa dell'affinità NUMERIC!

Affinità e Nomi dei Tipi in SQLite

SQLite è molto flessibile quando si tratta di nomi dei tipi di colonna. Puoi usare i tipi SQL standard, e SQLite li mappolerà alle sue affinità. Ecco una guida rapida:

Nome del Tipo Affinità
INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT, UNSIGNED BIG INT, INT2, INT8 INTEGER
CHARACTER(20), VARCHAR(255), VARYING CHARACTER(255), NCHAR(55), NATIVE CHARACTER(70), NVARCHAR(100), TEXT, CLOB TEXT
BLOB, no datatype specified BLOB
REAL, DOUBLE, DOUBLE PRECISION, FLOAT REAL
NUMERIC, DECIMAL(10,5), BOOLEAN, DATE, DATETIME NUMERIC

Tipo Booleano

SQLite non ha un tipo Booleano separato, ma non farti ingannare! Possiamo comunque lavorare con valori true/false. SQLite tratta 0 come false e 1 come true.

CREATE TABLE tasks (
id INTEGER PRIMARY KEY,
description TEXT,
completed BOOLEAN
);

INSERT INTO tasks (description, completed) VALUES
('Learn SQLite', 0),
('Master SQL', 1);

SELECT * FROM tasks WHERE completed = TRUE;

Questo restituirà il compito "Master SQL" perché il suo valore 'completed' è 1 (true).

Tipo Data e Ora

Ultimo ma non meno importante, parliamo delle date e delle ore. SQLite non ha un tipo di dati integrato per le date o le ore, ma fornisce diverse funzioni per lavorare con questi valori.

Di solito memorizziamo le date e le ore come TEXT, INTEGER o REAL:

CREATE TABLE events (
id INTEGER PRIMARY KEY,
name TEXT,
date_text TEXT,
date_int INTEGER,
date_real REAL
);

INSERT INTO events (name, date_text, date_int, date_real) VALUES
('SQLite Workshop', '2023-06-15', 1686787200, 1686787200.0);

SELECT name,
date_text,
datetime(date_int, 'unixepoch') as date_from_int,
datetime(date_real, 'unixepoch') as date_from_real
FROM events;

Questo stamperà qualcosa come:

SQLite Workshop, 2023-06-15, 2023-06-15 00:00:00, 2023-06-15 00:00:00

Ecco tutto! Abbiamo coperto i principali tipi di dati in SQLite, dai classi di storage di base ai concetti più complessi dell'affinità di tipo. Ricorda, la flessibilità di SQLite è sia la sua forza che qualcosa di cui essere consapevoli. Testa sempre i tuoi dati per assicurarti che siano memorizzati e recuperati come ti aspetti.

La pratica rende perfetti, quindi non aver paura di sperimentare con questi concetti. Crea le tue tabelle, inserisci dati e osserva come SQLite gestisce diversi scenari. Prima di sapere, sarai un esperto di tipi di dati SQLite!

Buon coding, e possa i tuoi database essere sempre normalizzati!

Credits: Image by storyset