2012-06-23 25 views
67

Stavo progettando un database per un sito in cui ho bisogno di usare un tipo di dati booleano per memorizzare solo 2 stati, vero o falso. Sto usando MySQL.
Durante la progettazione del database utilizzando phpMyAdmin, ho scoperto che ho sia il tipo di dati BOOLEAN che il tipo di dati TINYINT.
Ho esaminato diversi articoli, alcuni hanno detto che TINYINT è lo stesso di BOOLEAN, nessuna differenza. Alcuni dicono che BOOLEAN viene convertito in TINYINT in MySQL.confusione BOOLEAN o TINYINT

LA MIA domanda è, se sono entrambi uguali perché ce ne sono due? Ci dovrebbe essere solo uno di loro.

Ecco il riferimento agli articoli che ho letto:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

risposta

101

MySQL non ha il tipo di dati booleano interno. Usa il più piccolo tipo di dati intero - TINYINT.

BOOLEAN e BOOL sono equivalenti di TINYINT (1), perché sono sinonimi.

Tentare di creare questo tavolo -

CREATE TABLE table1 (
    column1 BOOLEAN DEFAULT NULL 
); 

Poi gestita SHOW CREATE TABLE, si otterrà questa uscita -

CREATE TABLE `table1` (
    `column1` tinyint(1) DEFAULT NULL 
) 
+25

C'è [BIT] (http: //dev.mysql.it/doc/refman/5.5/it/bit-type.html) –

+0

Sì, davvero. Non ho pensato al BIT. – Devart

+1

Ma la tua risposta è corretta in tutti gli altri aspetti. Ciò che sembra confondere l'OP è l'esistenza di sinonimi. –

21

le versioni più recenti di MySQL hanno il nuovo tipo di dati BIT in cui è possibile specificare il numero di bit nel campo, ad esempio BIT(1) da utilizzare come tipo Boolean, perché può essere solo 0 o 1.

7

a partire da MySQL 5.1 versione reference

BIT(M) = approximately (M+7)/8 bytes, 
BIT(1) = (1+7)/8 = 1 bytes (8 bits) 

================================= ========================================

TINYINT(1) take 8 bits. 

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric

+1

Il tuo riferimento indica che la memoria richiesta è in realtà "circa (M + 7)/8 byte". vale a dire, si arrotonda al prossimo byte completo. Così fa ** non ** prendere 1 bit. – mpen

+0

@mpen tnx, ho aggiornato la risposta. – fortune

25

Solo una nota per gli sviluppatori php (non ho i necessari punti StackOverflow per postare questo come commento) ... la conversione automagic (e silenziosa) in TINYINT significa che php recupera un av alore da una colonna "BOOLEAN" come uno "0" o "1", non l'atteso (da me) vero/falso.

Uno sviluppatore che sta esaminando lo SQL utilizzata per creare una tabella e vede qualcosa di simile: "BOOLEANO some_boolean NOT NULL default è false," potrebbe ragionevolmente aspettarsi di vedere vero/falso risultati quando una riga che contiene quella colonna viene recuperato. Invece (almeno nella mia versione di PHP), il risultato sarà "0" o "1" (sì, una stringa "0" o una stringa "1", non un int 0/1, grazie php).

È un nit, ma sufficiente a causare il fallimento dei test dell'unità.

+1

Come nota aggiuntiva, i driver mysql di PHP inseriscono tutti i tipi interi come stringhe. – kojow7