Confusione BOOLEANA o TINYINT


92

Stavo progettando un database per un sito in cui ho bisogno di utilizzare 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 di avere sia il tipo di dati BOOLEANO che il tipo di dati TINYINT.
Ho esaminato diversi articoli, alcuni hanno detto che TINYINT è uguale a BOOLEAN, nessuna differenza. Alcuni dicono che BOOLEAN viene convertito in TINYINT in MySQL.

La mia domanda è: se entrambi sono uguali, perché ne esistono due? Dovrebbe essercene solo uno.

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

Risposte:


137

MySQL non ha un tipo di dati booleano interno. Utilizza il tipo di dati intero più piccolo: TINYINT.

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

Prova a creare questa tabella -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Quindi esegui SHOW CREATE TABLE, otterrai questo output -

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

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

2
Sembra che sia fatto per compatibilità con le versioni precedenti. Il tipo di dati BOOLEANO era precedente a MySQL 5 e il tipo BIT non era ottimizzato, era anche TINYINT. Dalla documentazione - Nuove funzionalità pianificate per 5.1: ottimizza il tipo di BIT per prendere un bit. (BIT ora richiede un byte; viene trattato come sinonimo di TINYINT.).
Devart

5
Sì, puoi sapere di avere BIT(1)o BIT(17)o ancheBIT(64)
ypercubeᵀᴹ

3
@ Devart - Dove la tua risposta ha il maggior numero di voti e appare per prima (nella mia lista comunque) e del tempo è passato, c'è qualche possibilità che vorresti aggiungere alla tua risposta per includere qualche discussione sul tipo BIT su MySQL 5.1 e dopo?
Jonathan

3
@Jonathan Forse menzionarlo è prezioso, tuttavia BIT (1) in realtà non utilizza meno spazio di TINYINT (1) e non viene visualizzato come la maggior parte delle persone si aspetterebbe quando si utilizza la console mysql standard. A causa di questo svantaggio e di nessun vantaggio di archiviazione, il solo utilizzo di TINYINT (1) o BOOLEAN sembra essere il più comune nella mia esperienza.
Tyler Smith

31

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

Uno sviluppatore che sta esaminando l'SQL utilizzato per creare una tabella e vede qualcosa come: "some_boolean BOOLEAN NOT NULL DEFAULT FALSE", potrebbe ragionevolmente aspettarsi di vedere risultati vero / falso quando viene recuperata una riga contenente quella colonna. 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 pelo, ma abbastanza da far fallire i test unitari.


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

24

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


7

A partire dal riferimento alla versione 5.1 di MySql

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 dice che lo spazio di archiviazione richiesto è effettivamente "circa (M + 7) / 8 byte". cioè, arrotonda per eccesso al successivo byte completo. Quindi non ci vuole 1 bit.
mpen

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.