Introduzione ai tipi di dati in SQL

A differenza di JavaScript, SQL ha una tipizzazione forte. In ogni tabella, ogni colonna ha il proprio tipo di dati fisso.

Esistono molti tipi di dati, ma a differenza del linguaggio Java, ce ne sono così tanti non perché esistono tipi di dati per tutte le occasioni. I database dipendono molto dalla dimensione dei dati, quindi molti tipi di dati differiscono l'uno dall'altro solo per la lunghezza.

In totale, i tipi di dati possono essere suddivisi in 5 gruppi:

  • Tipi numerici
  • Tipi di stringa
  • Tipi per la memorizzazione di date e orari
  • Oggetti: solitamente rappresentati come una raccolta di byte
  • Trasporto : JSON e XML

Di solito diversi DBMS hanno ancora i propri tipi di dati. Ogni DBMS ha la sua specializzazione, quindi l'aggiunta di nuovi tipi di dati è una cosa molto comune.

Un'altra cosa è che l'aggiunta di un nuovo tipo di dati non è sufficiente, è necessario aggiungere funzioni che funzionino con esso, oltre a rendere questo lavoro comodo e veloce.

Se lavori su qualsiasi DBMS industriale (aziendale), molto probabilmente dovrai occuparti dei suoi tipi di dati e delle sue funzioni. Per quello che sarà necessario leggere 2-5 buoni libri.

Come parte della nostra conoscenza di SQL, prenderemo in considerazione tre gruppi principali di tipi di dati:

  • Numeri
  • stringhe
  • Date

Tipi numerici in SQL

In SQL, i tipi numerici sono divisi in tre gruppi:

  • Tipi interi
  • Numeri a virgola fissa (numero fisso di cifre decimali)
  • Numeri in virgola mobile

Iniziamo con i numeri interi . Ce ne sono solo 5 e possono essere descritti in una tabella:

# Digita il nome Lunghezza in byte Analogico da Java Valore minimo Valore massimo
1 TINYINT 1 byte -128 127
2 SMALLINT 2 corto -32.768 32.767
3 MEDIUMINT 3 -8.388.608 8.388.607
4 INT 4 int -2.147.483.648 2.147.483.647
5 BIGINT 8 lungo -2 63 263-1 _

I tipi di dati sono molto simili ai tipi di dati Java, ma esiste anche un tipo intero lungo tre byte. Questo viene fatto per risparmiare sulle dimensioni.

Poi vengono i tipi in virgola mobile , proprio come in Java, ce ne sono solo due:

# Digita il nome Lunghezza in byte Analogico da Java Valore minimo Valore massimo
1 GALLEGGIANTE 4 galleggiante -3.40E+38 +1.18E+38
2 DOPPIO 8 Doppio -1.79E+308 +1.79E+308

Ancora una volta, niente di nuovo. Tutto è uguale a Java. Tuttavia, a differenza di Java, SQL ha un altro tipo speciale, il numero reale a virgola fissa. Si chiama DECIMALE.

In genere questo tipo viene utilizzato per memorizzare somme di denaro. Quando viene scritto il nome di questo tipo, dopo di esso viene solitamente indicato quante cifre decimali ha il numero prima e dopo il punto decimale. Il formato generale è simile al seguente:

DECIMAL(total_characters, after_comma)

E un piccolo esempio:

salary DECIMAL(5,2)

È così che abbiamo descritto il fatto che la colonna dello stipendio può contenere numeri interi (massimo 3 cifre decimali) e una parte frazionaria - 2 cifre decimali.

Il numero massimo di caratteri supportati dal tipo DECIMAL è 65.

Tipi di stringhe in SQL

Le righe in un database possono essere memorizzate in due forme:

  • Stringhe a lunghezza fissa
  • Corde di lunghezza variabile

Le stringhe a lunghezza fissa sono specificate come CHAR :

CHAR(length)

Lunghezza fissa significa che tutti i valori di questa colonna conterranno un numero di caratteri strettamente fisso.

Un esempio di una stringa di lunghezza fissa:

country_code CHAR(2)

Le stringhe di lunghezza variabile sono specificate dal tipo VARCHAR :

VARCHAR(max_length)

Lunghezza variabile significa che tutti i valori di questa colonna conterranno testo di qualsiasi lunghezza, ma non superiore alla lunghezza massima.

Esempio di stringa di lunghezza variabile:

phone VARCHAR(12)

Le stringhe a lunghezza fissa hanno un grande vantaggio. Se il client ha chiesto al server SQL di restituirgli la 1.000.000a riga dalla tabella e le righe nella tabella sono di lunghezza fissa, quindi, conoscendo la lunghezza della riga, è possibile calcolare facilmente i byte relativi al desiderato riga.

Nel caso di lunghezza variabile delle righe, non sarà possibile trovare rapidamente la riga desiderata nella tabella. Ricorda la velocità di accesso a ArrayList e LinkedList, la situazione è approssimativamente la stessa qui.

Confrontiamo il modo in cui le stringhe di diverse lunghezze verranno archiviate in una tabella, a seconda del tipo di dati.

Linea CAR(4) Byte da memorizzare VARCHAR(4) Byte da memorizzare
'' ' ' 4 '' 1
'ab' 'ab' 4 'ab' 3
'abcd' 'abcd' 4 'abcd' 5
'abcdefgh' 'abcd' 4 'abcd' 5

Nota. Il tipo VARCHAR richiede un byte in più per la stessa lunghezza, perché deve memorizzare anche la lunghezza della stringa.

Tipi temporanei in SQL

SQL ha anche tipi speciali per la memorizzazione di date e orari. Ci sono cinque tipi in totale:

# Digita il nome Analogico dall'API Java DateTime Esempio Valore minimo Valore massimo
1 DATA Data locale '2022-06-30' '1000-01-01' '9999-12-31'
2 TEMPO Ora locale 'hh:mm:ss[.frazione]' '-838:59:59.000000' '838:59:59.000000'
3 APPUNTAMENTO LocalDateTime '1000-01-01 00:00:00.000000' '9999-12-31 23:59:59.999999'
4 TIMESTAMP Data '1970-01-01 00:00:01.000000' '2038-01-19 03:14:07.999999'
5 ANNO 1901 2155

Tutti i dati nelle query sono scritti come una stringa, tra virgolette singole. Il formato della voce va dal più grande al più piccolo:

  • Anno
  • Mese
  • Giorno
  • Ora
  • Minuto
  • Secondo
  • Frazioni di secondo

I tipi DATE, TIME e DATETIME possono essere convenzionalmente considerati analoghi dei tipi dell'API Java DateTme: LocalDate, LocalTime, LocalDateTime. La logica è più o meno la stessa.

Il tipo TIMESTAMP memorizza i dati in millisecondi dall'inizio del 1970 (uno standard del sistema operativo UNIX). È in questa forma che vengono memorizzati dal tipo Date nel linguaggio Java.

E infine, c'è il tipo YEAR, che è lungo 1 byte e memorizza i valori da 1 a 255. Pertanto, l'intervallo di anni a sua disposizione è 1901-2155. L'anno 1900 non può essere memorizzato da questo tipo, poiché il valore 0 viene utilizzato per codificare un valore NULL.

Archiviazione di oggetti in SQL

Esistono tipi speciali per la memorizzazione di oggetti o testi di grande lunghezza. Non entreremo nei dettagli su di loro, ma li elencherò comunque:

# Digita il nome Spiegazione
1 TESTO Utilizzato per memorizzare lunghi testi. Durante il confronto e l'ordinamento in questo campo, vengono utilizzati solo i primi 100 caratteri.
2 BLOB Il nome sta per Byte Large Object. Memorizzato come semplice raccolta di byte. Può essere utilizzato, ad esempio, per memorizzare immagini in un database.
3 CLUB Il nome sta per Char Large Object. Utilizzato per memorizzare lunghi testi.
4 ENUM Consente di impostare un insieme fisso di valori e memorizzarne uno come valore.
5 IMPOSTATO Consente di impostare un insieme fisso di valori e di memorizzarne qualsiasi sottoinsieme come valore. Di solito li memorizza come una maschera binaria.

In teoria, puoi serializzare qualsiasi oggetto Java come un insieme di byte e memorizzarlo nel database come BLOB. Salvare l'oggetto non è un problema. Come lavorare ulteriormente con lui?

Supponiamo che una tabella memorizzi un milione di oggetti in forma serializzata: come li cercherai? Un DBMS supporta solo un certo tipo di dati quando fornisce un ampio set di funzioni per lavorarci.