MySQL
Tipi di dati
Ricerca…
Casting implicito / automatico
select '123' * 2;
Per rendere la moltiplicazione con 2
MySQL converte automaticamente la stringa 123
in un numero.
Valore di ritorno:
246
La conversione in un numero inizia da sinistra a destra. Se la conversione non è possibile, il risultato è 0
select '123ABC' * 2
Valore di ritorno:
246
select 'ABC123' * 2
Valore di ritorno:
0
VARCHAR (255) - o no
Max len suggerito
Innanzitutto, menzionerò alcune stringhe comuni che sono sempre esadecimali o altrimenti limitate ad ASCII. Per questi, è necessario specificare CHARACTER SET ascii
( latin1
è ok) in modo che non sprechi spazio:
UUID CHAR(36) CHARACTER SET ascii -- or pack into BINARY(16)
country_code CHAR(2) CHARACTER SET ascii
ip_address CHAR(39) CHARACTER SET ascii -- or pack into BINARY(16)
phone VARCHAR(20) CHARACTER SET ascii -- probably enough to handle extension
postal_code VARCHAR(20) CHARACTER SET ascii -- (not 'zip_code') (don't know the max
city VARCHAR(100) -- This Russian town needs 91:
Poselok Uchebnogo Khozyaystva Srednego Professionalno-Tekhnicheskoye Uchilishche Nomer Odin
country VARCHAR(50) -- probably enough
name VARCHAR(64) -- probably adequate; more than some government agencies allow
Perché non semplicemente 255? Ci sono due ragioni per evitare la pratica comune di usare (255) per tutto.
- Quando un
SELECT
complesso deve creare una tabella temporanea (per una sottoquery,UNION
,GROUP BY
, ecc.), La scelta migliore è usare il motoreMEMORY
, che mette i dati nella RAM. Ma iVARCHARs
vengono trasformati inCHAR
in questo processo. Ciò rendeVARCHAR(255) CHARACTER SET utf8mb4
1020 byte. Ciò può portare alla necessità di versare su disco, che è più lento. - In alcune situazioni, InnoDB esaminerà la dimensione potenziale delle colonne in una tabella e deciderà che sarà troppo grande, interrompendo una
CREATE TABLE
.
VARCHAR contro TEXT
Suggerimenti di utilizzo per *TEXT
, CHAR
e VARCHAR
, oltre a alcune best practice:
- Non usare mai
TINYTEXT
. - Quasi mai usare
CHAR
- è una lunghezza fissa; ogni carattere è la lunghezza massima delCHARACTER SET
(es. 4 byte / carattere per utf8mb4). - Con
CHAR
, usaCHARACTER SET ascii
meno che tu non sappia diversamente. -
VARCHAR(n)
troncerà su n caratteri ;TEXT
troncerà a un numero di byte . (Ma vuoi il troncamento?) -
*TEXT
può rallentareSELECTs
complessi a causa di come vengono gestite le tabelle temporanee.
INT come AUTO_INCREMENT
È possibile utilizzare qualsiasi dimensione di INT
per AUTO_INCREMENT
. UNSIGNED
è sempre appropriato.
Tieni presente che determinate operazioni "bruciano" ID AUTO_INCREMENT
. Ciò potrebbe portare a un vuoto inatteso. Esempi: INSERT IGNORE
e REPLACE
. Possono preallocare un ID prima di rendersi conto che non sarà necessario. Questo è un comportamento previsto e di progettazione nel motore InnoDB e non dovrebbe scoraggiare il loro utilizzo.
Altri
C'è già una voce separata per "FLOAT, DOUBLE e DECIMAL" e "ENUM". È probabile che una singola pagina sui tipi di dati sia ingombrante - suggerisco "Tipi di campo" (o dovrebbe essere chiamato "Tipi di dati"?) Essere una panoramica, quindi divisa in queste pagine di argomenti:
- INT
- GALLEGGIANTE, DOPPIO e DECIMALE
- Stringhe (CHAR, TEXT, ecc.)
- BINARIO e BLOB
- DATETIME, TIMESTAMP e amici
- ENUM e SET
- Dati spaziali
- Tipo JSON (MySQL 5.7.8+)
- Come rappresentare Soldi e altri "tipi" comuni che hanno bisogno di abbinarli ai tipi di dati esistenti
Laddove appropriato, ogni pagina di argomento dovrebbe includere, oltre alla sintassi e agli esempi:
- Considerazioni sulla modifica
- Dimensione (byte)
- Contrasto con motori non MySQL (bassa priorità)
- Considerazioni sull'utilizzo del tipo di dati in una CHIAVE PRIMARIA o in una chiave secondaria
- altre migliori pratiche
- altri problemi di prestazioni
(Presumo che questo "esempio" si auto-distrugga quando i miei suggerimenti sono stati soddisfatti o posto il veto.)
Introduzione (numerico)
MySQL offre un numero di tipi numerici diversi. Questi possono essere suddivisi in
Gruppo | tipi |
---|---|
Tipi interi | INTEGER , INT , SMALLINT , TINYINT , MEDIUMINT , BIGINT |
Tipi di punti fissi | DECIMAL , NUMERIC |
Tipi di virgola mobile | FLOAT , DOUBLE |
Tipo di valore bit | BIT |
Tipi interi
Il valore senza segno minimo è sempre 0.
genere | Conservazione (Byte) | Valore minimo (Firmato) | Valore massimo (Firmato) | Valore massimo (Non firmato) |
---|---|---|---|---|
TINYINT | 1 | -2 7 -128 | 2 7 -1 127 | 2 8 -1 255 |
SMALLINT | 2 | -2 15 32.768 | 2 15 -1 32.767 | 2 16 -1 65.535 |
MEDIUMINT | 3 | -2 23 -8.388.608 | 2 23 -1 8.388.607 | 2 24 -1 16.777.215 |
INT | 4 | -2 31 -2.147.483.648 | 2 31 -1 2,147,483,647 | 2 32 -1 4,294,967,295 |
BIGINT | 8 | -2 63 -9.223.372.036.854.775.808 | 2 63 -1 9.223.372.036.854.775.807 | 2 64 -1 18.446.744.073.709.551.615 |
Tipi di punti fissi
I tipi DECIMAL
e NUMERIC
di MySQL memorizzano valori di dati numerici esatti. Si consiglia di utilizzare questi tipi per preservare la precisione esatta, ad esempio per i soldi.
Decimale
Questi valori sono memorizzati in formato binario. In una dichiarazione di colonna, è necessario specificare la precisione e la scala
Precisione rappresenta il numero di cifre significative memorizzate per i valori.
La scala rappresenta il numero di cifre memorizzate dopo il decimale
salary DECIMAL(5,2)
5 rappresenta la precision
e 2 rappresenta la scale
. Per questo esempio, l'intervallo di valori che è possibile memorizzare in questa colonna è -999.99 to 999.99
Se il parametro di scala è omesso, il suo valore predefinito è 0
Questo tipo di dati può contenere fino a 65 cifre.
Il numero di byte presi da DECIMAL(M,N)
è approssimativamente M/2
.
Tipi di virgola mobile
FLOAT
e DOUBLE
rappresentano tipi di dati approssimativi .
genere | Conservazione | Precisione | Gamma |
---|---|---|---|
GALLEGGIANTE | 4 byte | 23 bit significativi / ~ 7 cifre decimali | 10 ^ + / - 38 |
DOPPIO | 8 byte | 53 bit significativi / ~ 16 cifre decimali | 10 ^ + / - 308 |
REAL
è sinonimo di FLOAT
. DOUBLE PRECISION
è sinonimo di DOUBLE
.
Sebbene MySQL permetta anche il qualificatore (M, D), non usarlo. (M, D) significa che i valori possono essere memorizzati con un massimo di M cifre totali, dove D può essere dopo il decimale. I numeri saranno arrotondati due volte o troncati; questo causerà più problemi che benefici.
Poiché i valori in virgola mobile sono approssimativi e non vengono memorizzati come valori esatti, i tentativi di trattarli come esatti nei confronti possono portare a problemi. Nota in particolare che un valore FLOAT
equivale raramente a un valore DOUBLE
.
Tipo di valore bit
Il tipo BIT
è utile per la memorizzazione dei valori dei campi di bit. BIT(M)
consente la memorizzazione di valori fino a M-bit in cui M è nell'intervallo da 1 to 64
È inoltre possibile specificare valori con notazione del bit value
.
b'111' -> 7
b'10000000' -> 128
A volte è utile usare 'shift' per costruire un valore a singolo bit, ad esempio (1 << 7)
per 128.
La dimensione combinata massima di tutte le colonne BIT in una tabella NDB
è 4096.
CHAR (n)
CHAR(n)
è una stringa di una lunghezza fissa di n
caratteri . Se è CHARACTER SET utf8mb4
, significa che occupa esattamente 4*n
byte , indipendentemente dal testo in esso contenuto.
La maggior parte dei casi d'uso per CHAR(n)
coinvolge stringhe che contengono caratteri inglesi, quindi dovrebbe essere CHARACTER SET ascii
. ( latin1
andrà altrettanto bene.)
country_code CHAR(2) CHARACTER SET ascii,
postal_code CHAR(6) CHARACTER SET ascii,
uuid CHAR(39) CHARACTER SET ascii, -- more discussion elsewhere
DATA, DATETIME, TIMESTAMP, ANNO e ORA
Il datatype DATE
comprende la data ma nessun componente orario. Il suo formato è 'YYYY-MM-DD'
con un intervallo di '1000-01-01' a '9999-12-31'.
Il tipo DATETIME
include l'ora con il formato 'AAAA-MM-GG HH: MM: SS'. Ha un intervallo da '1000-01-01 00:00:00' a '9999-12-31 23:59:59'.
Il tipo TIMESTAMP
è un tipo intero che comprende la data e l'ora con un intervallo effettivo da '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC.
Il tipo YEAR
rappresenta un anno e contiene un intervallo dal 1901 al 2155.
Il tipo TIME
rappresenta un orario con un formato di 'HH: MM: SS' e contiene un intervallo da '-838: 59: 59' a '838: 59: 59'.
Requisiti di archiviazione:
|-----------|--------------------|----------------------------------------|
| Data Type | Before MySQL 5.6.4 | as of MySQL 5.6.4 |
|-----------|--------------------|----------------------------------------|
| YEAR | 1 byte | 1 byte |
| DATE | 3 bytes | 3 bytes |
| TIME | 3 bytes | 3 bytes + fractional seconds storage |
| DATETIME | 8 bytes | 5 bytes + fractional seconds storage |
| TIMESTAMP | 4 bytes | 4 bytes + fractional seconds storage |
|-----------|--------------------|----------------------------------------|
Fractional Seconds (dalla versione 5.6.4):
|------------------------------|------------------|
| Fractional Seconds Precision | Storage Required |
|------------------------------|------------------|
| 0 | 0 bytes |
| 1,2 | 1 byte |
| 3,4 | 2 byte |
| 5,6 | 3 byte |
|------------------------------|------------------|
Consultare le pagine del manuale MySQL DATA, DATETIME e TIMESTAMP , Requisiti di archiviazione dei tipi di dati e Secondi frazionari nei valori temporali .