Mysql
 sql >> Database >  >> RDS >> Mysql

Un'introduzione ai tipi di dati MySQL


Introduzione

Una delle caratteristiche principali dei database relazionali in generale è la capacità di definire schemi o strutture di tabelle che specificano esattamente il formato dei dati che conterranno. Questo viene fatto prescrivendo le colonne che queste strutture contengono insieme al loro tipo di dati ed eventuali vincoli.

I tipi di dati specificano un modello generale per i dati che accettano e archiviano. I valori devono rispettare i requisiti che delineano per essere accettati da MySQL. Sebbene sia possibile definire requisiti personalizzati, i tipi di dati forniscono gli elementi costitutivi di base che consentono a MySQL di convalidare l'input e di lavorare con i dati utilizzando le operazioni appropriate.

MySQL include un'ampia gamma di tipi di dati utilizzati per etichettare e convalidare che i valori siano conformi ai tipi appropriati. In questa guida, discuteremo i tipi di dati più comuni disponibili in MySQL, i diversi formati di input e output utilizzati e come configurare vari campi per soddisfare le esigenze delle tue applicazioni.


Quali sono i tipi di dati in MySQL?

Prima di entrare nei dettagli, diamo una visione ampia dei tipi di dati forniti da MySQL.

MySQL supporta una gamma ragionevole di tipi di dati adatti a vari tipi di dati semplici e complessi. Questi includono:

  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT
  • BIGINT
  • DECIMAL
  • NUMERIC
  • FLOAT
  • DOUBLE
  • BIT
  • DATE
  • DATETIME
  • TIMESTAMP
  • TIME
  • YEAR
  • CHAR
  • VARCHAR
  • BINARY
  • VARBINARY
  • BLOB
  • TEXT
  • ENUM
  • SET
  • GEOMETRY
  • POINT
  • LINESTRING
  • POLYGON
  • MULTIPOINT
  • MULTILINESTRING
  • MULTIPOLYGON
  • GEOMETRYCOLLECTION
  • JSON

Tratteremo i più comuni di questi in modo più approfondito in questa guida.



Introduzione ai tipi di dati MySQL

Quando inizi con i tipi, è importante ricordare che i tipi da soli non sono sempre una soluzione completa per la convalida dei dati, ma un componente. Anche altri strumenti di database, come i vincoli, hanno un ruolo da svolgere nella definizione della correttezza. Tuttavia, i tipi di dati sono spesso la prima linea di difesa contro i dati non validi.

In molti casi, i tipi generali forniti da MySQL sono appropriati per i tipi di dati che verranno archiviati. Ad esempio, mentre è possibile memorizzare le coordinate di un punto geometrico in due diverse colonne numeriche, il point fornito type è costruito appositamente per archiviare e convalidare esattamente questo tipo di informazioni. Quando scegli i tipi, verifica di utilizzare il tipo più specifico applicabile al tuo caso d'uso.




Numeri e valori numerici

MySQL include una gamma di tipi di dati numerici adatti a diversi scenari. Il tipo appropriato dipende dall'esatta natura dei valori che intendi memorizzare e dai tuoi requisiti di precisione.


Interi

Il intero il tipo di dati è una categoria di tipi utilizzati per memorizzare numeri senza frazioni o decimali. Questi possono essere valori positivi o negativi e diversi tipi di numeri interi possono memorizzare diversi intervalli di numeri. I tipi interi con intervalli di valori accettabili più piccoli occupano meno spazio di quelli con intervalli più ampi.

L'elenco di base dei tipi interi include quanto segue:

Tipo intero Lunghezza Intervallo con segno applicabile Intervallo non firmato applicabile
TINYINT 1 byte da -128 a 127 da 0 a 255
SMALLINT 2 byte -32768 a 32767 da 0 a 65535
MEDIUMINT 3 byte -8388608 a 8388607 da 0 a 16777215
INT 4 byte -2147483648 a 2147483647 da 0 a 4294967295
BIGINT 8 byte da -2^63 a -2^63-1 da 0 a 2^64-1

I tipi sopra sono limitati dal loro intervallo valido. Qualsiasi valore al di fuori dell'intervallo genererà un errore.

Oltre ai tipi sopra menzionati, MySQL riconosce anche un alias chiamato SERIAL . Contrassegnare una colonna come SERIAL gli darà queste proprietà:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE . Viene utilizzato come scorciatoia per le proprietà comuni della colonna della chiave primaria. La colonna assegnerà automaticamente un nuovo valore univoco ogni volta che viene aggiunto un record.



Punto fisso

I tipi a virgola fissa vengono utilizzati per controllare la quantità di precisione o specificità possibile per un numero con decimali. In MySQL, questo può essere controllato manipolando due fattori:precisione e scala.

Precisione è la quantità massima di cifre totali che un numero può avere. Al contrario, scala è il numero di cifre a destra della virgola decimale. Manipolando questi numeri, puoi controllare quanto possono essere grandi le componenti frazionarie e non frazionarie di un numero.

Questi due argomenti sono usati per controllare la precisione arbitraria usando il numeric o decimal tipi di dati (questi due tipi sono sinonimi in MySQL). Il numeric type accetta da zero a due argomenti.

Senza argomenti, la colonna è definita con una precisione di 10 e una scala di 0. Ciò significa che la colonna può contenere fino a 10 cifre, ma nessuna di queste può essere dopo il punto decimale:

NUMERIC

Quando viene fornito un singolo argomento, viene interpretato come la precisione della colonna con scala impostata su 0. Ciò consente di specificare il numero massimo di cifre in un numero intero (nessun componente frazionario o decimale). Ad esempio, se hai bisogno di un numero intero di 5 cifre, puoi specificare:

NUMERIC(5)

Specificare la precisione seguita dalla scala quando si configura una colonna utilizzando entrambi i controlli. MySQL arrotonderà la componente decimale di qualsiasi input al numero corretto di cifre utilizzando il numero di scala. MySQL utilizzerà la precisione e la scala per determinare quante cifre sono consentite sul lato sinistro del punto decimale. Se una voce supera il numero consentito di cifre, MySQL genererà un errore.

Ad esempio, possiamo specificare una colonna con una precisione totale di 5 e una scala di 2:

NUMERIC(5, 2)

Questa colonna avrebbe il seguente comportamento:

Inserisci valore Valore arrotondato Accettato (si adatta alla precisione)?
400.28080 400.28
8.332799 8.33
11799.799 11799.80 No
11799 11799 No
2802.27 2802.27 No


virgola mobile

I numeri in virgola mobile sono un altro modo per esprimere i numeri decimali, ma senza una precisione esatta e coerente. Invece, i tipi a virgola mobile hanno solo un concetto di massima precisione che è spesso correlata all'architettura e alla piattaforma dell'hardware.

Ad esempio, per limitare una colonna a virgola mobile a 8 cifre di precisione, puoi utilizzare il FLOAT type, che memorizza i risultati utilizzando 4 byte con una precisione compresa tra 0 e 23 cifre:

FLOAT(8)

Allo stesso modo, il DOUBLE type utilizza 8 byte per memorizzare i dati e può utilizzare precisioni comprese tra 24 e 53 cifre.

A causa di queste scelte di progettazione, i numeri in virgola mobile possono funzionare con numeri con un numero elevato di decimali in modo efficiente, ma non sempre esattamente. La rappresentazione interna dei numeri può causare lievi differenze tra l'ingresso e l'uscita. Ciò può causare un comportamento imprevisto durante il confronto di valori, l'esecuzione di calcoli in virgola mobile o l'esecuzione di operazioni che richiedono valori esatti.



virgola mobile vs numerico

Entrambi i numeri in virgola mobile forniti da tipi come FLOAT e DOUBLE e numeri a virgola fissa forniti dal NUMERIC o DECIMAL i tipi possono essere utilizzati per memorizzare valori decimali. Come fai a sapere quale usare?

La regola generale è che se hai bisogno di precisione nei tuoi calcoli, il NUMERIC il tipo è sempre la scelta migliore. Il NUMERIC type memorizzerà i valori esattamente come vengono forniti, il che significa che i risultati sono completamente prevedibili durante il recupero o il calcolo dei valori. Il NUMERIC tipo è chiamato precisione arbitraria perché specifichi la quantità di precisione richiesta dal tipo e memorizzerà quella quantità esatta di cifre nel campo.

Al contrario, tipi come FLOAT e DOUBLE sono tipi a precisione variabile. La quantità di precisione che mantengono dipende dal valore di input. Quando raggiungono la fine del livello di precisione consentito, possono arrotondare le cifre rimanenti, determinando differenze tra i valori inviati e recuperati.

Quindi, quando useresti i tipi di precisione variabile? Tipi di precisione variabile come FLOAT e DOUBLE sono adatti per scenari in cui non sono necessari valori esatti (ad esempio, se verranno comunque arrotondati) e quando la velocità è molto importante. La precisione variabile generalmente offre vantaggi in termini di prestazioni rispetto a NUMERIC digitare.




Tipi di stringhe

I tipi di caratteri e stringhe di MySQL possono essere suddivisi in due categorie:lunghezza fissa e lunghezza variabile . La scelta tra questi due influenza il modo in cui MySQL alloca lo spazio per ogni valore e come convalida l'input.

Il tipo di dati basato sui caratteri più semplice all'interno di MySQL è il char genere. Senza argomenti, il char tipo accetta un singolo carattere come input:

CHAR

Quando nella dichiarazione viene fornito un numero intero positivo, il char colonna memorizzerà una stringa di caratteri di lunghezza fissa uguale al numero di caratteri specificato:

CHAR(10)

Se viene fornita una stringa con meno caratteri, verranno aggiunti spazi vuoti per riempire la lunghezza:

Input # di caratteri di input Valore memorizzato # di caratteri memorizzati
'albero' 4 'albero      ' 10

Se viene fornita una stringa con un numero di caratteri maggiore del numero consentito, MySQL genererà un errore. Come eccezione a questa regola, se i caratteri in eccesso sono tutti spazi, MySQL troncherà semplicemente gli spazi in eccesso per adattarli al campo.

L'alternativa ai campi di caratteri a lunghezza fissa sono i campi a lunghezza variabile. Per questo, MySQL fornisce il varchar genere. Il varchar type memorizza i caratteri senza dimensioni fisse. A differenza di char , varchar non può essere utilizzato senza specificare il numero massimo di caratteri da memorizzare.

Definendo un varchar con un numero intero positivo, puoi impostare una lunghezza massima della stringa:

VARCHAR(10)

Questo è diverso dall'usare il char digita con un numero intero in quel varchar non riempirà il valore se l'input non soddisfa la lunghezza massima del campo:

Input # di caratteri di input Valore memorizzato # di caratteri memorizzati
'albero' 4 'albero' 4

Se la stringa è maggiore della lunghezza massima, MySQL genererà un errore. Lo stesso comportamento di troncamento presente in char i campi si verificano qui:se i caratteri in eccedenza sono spazi, verranno troncati per rientrare nella lunghezza massima dei caratteri.

MySQL supporta anche il binary e varbinary tipi di dati. Questi funzionano in modo simile al char e varchar tipi, ma memorizza stringhe binarie anziché stringhe di caratteri. Ciò ha implicazioni su come vengono archiviati e utilizzati (per cose come confronti, ordinamento, ecc.).

Per binary e varbinary tipi, l'intero dato quando si definisce il tipo di colonna rappresenta il numero di byte anziché il numero di caratteri.

Altri due tipi di dati forniti da MySQL per le stringhe e l'archiviazione dei caratteri sono blob e text . Questi tipi funzionano in modo simile a varchar e varbinary tipi rispettivamente e sono pensati per la memorizzazione di oggetti di grandi dimensioni. Funzionano per lo più allo stesso modo delle loro controparti, ma presentano alcune differenze come l'impossibilità di iniziare ad avere valori predefiniti e la richiesta di una lunghezza del prefisso durante la creazione di un indice.



Booleani

MySQL in realtà non ha un tipo booleano nativo per rappresentare valori true e false.

MySQL riconosce i tipi BOOL o BOOLEAN nel tentativo di compatibilità con altri sistemi di database. La sua implementazione interna, tuttavia, utilizza un TINYINT(1) colonna per memorizzare i valori e li interpreta come veri o falsi in base a un insieme di regole.

Quando si interpretano valori numerici in un contesto booleano, il valore di 0 è considerato falso. Tutti i valori diversi da zero sono considerati veri.

MySQL riconosce i valori letterali booleani TRUE e FALSE e converte TRUE a 1 e FALSE a 0 durante la memorizzazione.



Date e ora

MySQL supporta la rappresentazione di date, orari e combinazioni dei due.


Date

La date type può memorizzare una data senza un valore di ora associato:

DATE

Durante l'elaborazione dell'input per date colonne, MySQL può interpretare diversi formati per determinare la data corretta da memorizzare. Tuttavia, le parti componenti devono sempre venire nella stessa sequenza:anno, mese e poi giorno. Il STR_TO_DATE() è disponibile per aiutare a convertire altri formati di data in un formato che MySQL interpreterà correttamente.

Durante la visualizzazione delle date, MySQL utilizza il YYYY-MM-DD formato. Puoi usare il DATE_FORMAT() funzione per formattare l'output in altri formati.

La date type può memorizzare valori che vanno da 1000-01-01 a 9999-12-31 .



Tempo

Il time il tipo di dati può memorizzare un'ora del giorno specifica senza un fuso orario o una data associati.

Durante l'elaborazione dell'input per time colonne, MySQL può interpretare più formati per determinare l'ora corretta per l'archiviazione. Quando l'input ha i due punti, viene generalmente interpretato come hh:mm:ss . Qualsiasi valore abbreviato (utilizzando solo una colonna) verrà interpretato come utilizzando hh:mm . Quando l'input non hanno i due punti, il tempo viene elaborato per riempire prima il valore più piccolo. Ad esempio, 1045 è preso come 10 minuti e 45 secondi.

MySQL supporta anche i secondi frazionari se viene fornito un punto decimale. Memorizza fino a 6 cifre di precisione dopo il decimale. Valori in time le colonne possono variare da -838:59:59.000000 a 838:59:59.000000 .

Durante la visualizzazione dei valori temporali, MySQL utilizza hh:mm:ss formato. Come per le date, viene fornita una funzione, chiamata TIME_FORMAT() per visualizzare i valori temporali utilizzando altri formati.




Timestamp e datetime

MySQL può rappresentare timestamp, una combinazione di una data e un'ora utilizzate per rappresentare un momento specifico nel tempo, in due diverse varianti:utilizzando il timestamp digitare e il datetime digitare.

Il datetime tipo può rappresentare valori da 1000-01-01 00:00:00 a 9999-12-31 23:59:59 . Può anche includere frazioni di secondi fino a sei cifre simili al time digitare.

Il timestamp tipo può rappresentare valori da 1970-01-01 00:00:01 UTC a 2038-01-19 03:14:07 UTC. Può gestire anche frazioni di secondi. Durante la memorizzazione di timestamp valori, tutti i valori vengono convertiti dal fuso orario specificato in UTC per l'archiviazione e riconvertiti nel fuso orario locale al recupero. Il datetime type non lo fa.

Da MySQL 8.0.19 in poi, puoi includere un offset di fuso orario durante la memorizzazione di un timestamp per impostare in modo esplicito il fuso orario per il valore memorizzato. Puoi farlo includendo un valore dopo la componente temporale, senza spazio per indicare l'offset. L'intervallo di valori accettati va da -14:00 a +14:00 , che rappresenta l'offset del valore memorizzato da UTC.

Quando si decide se memorizzare i valori di data e ora utilizzando datetime o timezone tipi, è spesso utile separarli in base a ciò per cui sono migliori.

Pensa a datetime valori come data e ora specifiche, in relazione al calendario e all'orologio ovunque vengano recuperati. Se una persona va a letto alle 23:00 di notte, un datetime value può rappresentare quel valore, indipendentemente dal fuso orario in cui si trova attualmente la persona.

D'altra parte, timezone i valori sono i migliori per rappresentare un momento specifico nel tempo che non è ambiguo tra i fusi orari. Per inviare un invito a una videochiamata, un timezone value sarebbe in grado di garantire che la riunione avvenga contemporaneamente per tutti, indipendentemente dal fuso orario in cui si trova il partecipante.



Altri tipi utili

Insieme ai tipi che abbiamo trattato in modo approfondito sopra, ci sono tipi aggiuntivi che sono utili in scenari specifici. Li tratteremo brevemente per darti un'idea di come usarli e quando possono essere utili.


Tipi enumerati e impostati

Due tipi correlati che consentono agli utenti di dettare i valori validi per una colonna sono enum e set tipi.

Il enum type è un tipo stringa che consente all'utente di definire una raccolta di valori validi quando viene creata la colonna. Qualsiasi valore che corrisponde a uno dei valori definiti viene accettato e tutti gli altri valori vengono rifiutati. Funziona in modo simile a un menu a discesa in quanto è possibile effettuare una scelta da un insieme specifico di opzioni. Ad esempio, un enum chiamato season potrebbe essere creato con i valori winter , spring , summer e autumn .

Per creare un enum colonna, specifica il tipo come enum , fornendo i possibili valori come stringhe, separate da virgole, all'interno di un insieme di parentesi, in questo modo:

season ENUM('winter', 'spring', 'summer', 'autumn')

Un tipo simile di tipo definito dall'utente è il set genere. Come enum digita, set i tipi consentono agli utenti di specificare valori validi come stringhe al momento della definizione. La differenza tra questi due tipi è che in un set , è possibile memorizzare più di un valore per ogni record.

Ad esempio, se hai bisogno di una colonna per rappresentare i giorni della settimana in cui i volontari sono disponibili a lavorare, potresti avere un set colonna come questa:

availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')

Quando si inseriscono i valori per la availability colonna che abbiamo appena creato, fornisci una singola stringa con virgole che separano tutti i giorni in cui il volontario è disponibile. Ad esempio:

'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'

Per set tipi in MySQL, i valori duplicati in input vengono sempre rimossi e al momento del recupero, i valori seguono l'ordine utilizzato nel set definizione indipendentemente dall'ordinamento al momento dell'immissione nella colonna.



JSON

MySQL supporta le colonne in JSON utilizzando json genere. Dati archiviati come json è memorizzato in binario per un'esecuzione e un'elaborazione più rapide in modo che il server non debba interpretare una stringa per operare su JSON valori.

JSON

Per operare su JSON colonne, MySQL fornisce una serie di funzioni per lavorare con i valori all'interno del documento.




Conclusione

In questo articolo abbiamo trattato molti dei tipi di dati più comuni che sono utili quando si lavora con i database MySQL. Esistono altri tipi non trattati in questa guida utili da conoscere, ma rappresentano un buon punto di partenza per la maggior parte dei casi d'uso.

È importante utilizzare il sistema dei tipi in modo appropriato in modo da poter controllare valori validi e operare sui dati come previsto. Se scegli un tipo non adatto ai tuoi dati, puoi incappare in insidie, quindi nella maggior parte dei casi vale la pena pensarci prima di impegnarti in un tipo di dati.

Se stai usando Prisma Client per lavorare con i tuoi database MySQL, puoi trovare una mappatura tra alcuni dei comuni tipi MySQL e Prisma nei documenti dei connettori di dati MySQL di Prisma.