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 motore MEMORY , che mette i dati nella RAM. Ma i VARCHARs vengono trasformati in CHAR in questo processo. Ciò rende VARCHAR(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 del CHARACTER SET (es. 4 byte / carattere per utf8mb4).
  • Con CHAR , usa CHARACTER 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ò rallentare SELECTs 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 .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow