Domanda

Poiché MySQL non sembra avere alcun tipo di dati "booleano", quale tipo di dati "abusa" per archiviare informazioni vere / false in MySQL?

Soprattutto nel contesto della scrittura e della lettura da / verso uno script PHP.

Nel corso del tempo ho usato e visto diversi approcci:

  • tinyint, campi varchar contenenti i valori 0/1,
  • campi varchar contenenti le stringhe '0' / '1' o 'true' / 'false'
  • e infine enum I campi contenenti le due opzioni 'true' / 'false'.

Nessuna delle precedenti sembra ottimale. Tendo a preferire la variante 0/1 tinyint, poiché la conversione automatica dei tipi in PHP mi dà valori booleani piuttosto semplicemente.

Quindi quale tipo di dati usi? Esiste un tipo progettato per valori booleani che ho trascurato? Vedi qualche vantaggio / svantaggio usando un tipo o un altro?

È stato utile?

Soluzione

Per MySQL 5.0.3 e versioni successive, è possibile utilizzare BIT. Il manuale dice:

  

A partire da MySQL 5.0.3, il tipo di dati BIT viene utilizzato per memorizzare bit-field   valori. Un tipo di BIT (M) consente la memorizzazione di valori M-bit. M può variare   da 1 a 64.

Altrimenti, secondo il manuale di MySQL è possibile utilizzare boolean e boolean che al momento sono alias di tinyint (1):

  

Bool, Boolean: questi tipi sono sinonimi di TINYINT (1). Un valore di   zero è considerato falso. Non nullo   i valori sono considerati veri.

MySQL afferma inoltre che:

  

Intendiamo implementare il valore booleano completo   movimentazione del tipo, in conformità con   SQL standard, in un futuro MySQL   rilascio.

Riferimenti: http: //dev.mysql. com / doc / refman / 5.5 / it / numerico-tipo-overview.html

Altri suggerimenti

BOOL e BOOLEAN sono sinonimi di TINYINT(1). Zero è false, qualsiasi altra cosa è true. Maggiori informazioni qui .

Questa è una soluzione elegante che apprezzo molto perché usa zero byte di dati:

some_flag CHAR(0) DEFAULT NULL

Per impostarlo su true, impostare some_flag = '' e per impostarlo su false, impostare some_flag = NULL.

Quindi, per verificare la presenza di true, controlla se some_flag IS NOT NULL e per verificare la presenza di false, controlla se some_flag IS NULL.

(Questo metodo è descritto nel " MySQL ad alte prestazioni: ottimizzazione, backup, replica e altro " di Jon Warren Lentz, Baron Schwartz e Arjen Lentz.)

Questa domanda ha avuto una risposta, ma ho pensato di aggiungere $ 0,02. Uso spesso un CHAR (0), dove '' == true e NULL == false.

Da mysql docs

  

CHAR (0) è anche abbastanza bello quando hai bisogno di una colonna che può prendere solo   due valori: una colonna definita come CHAR (0) NULL occupa solo uno   bit e può assumere solo i valori NULL e '' (la stringa vuota).

Se si utilizza il tipo BOOLEAN, questo è alias su TINYINT (1). Questo è meglio se vuoi usare un SQL standardizzato e non ti dispiace che il campo possa contenere un valore fuori range (praticamente tutto ciò che non è 0 sarà "vero").

ENUM ('False', 'True') ti permetterà di usare le stringhe nel tuo SQL e MySQL memorizzerà il campo internamente come un numero intero in cui 'False' = 0 e 'True' = 1 in base all'ordine Enum è specificato.

In MySQL 5+ è possibile utilizzare un campo BIT (1) per indicare un tipo numerico a 1 bit. Non credo che questo in realtà utilizzi meno spazio di archiviazione, ma consente nuovamente di limitare i possibili valori a 1 o 0.

Tutto quanto sopra utilizzerà approssimativamente la stessa quantità di spazio di archiviazione, quindi è meglio scegliere quello che ritieni più semplice con cui lavorare.

Uso TINYINT (1) per memorizzare valori booleani in Mysql.

Non so se ci sia qualche vantaggio nell'usarlo ... Ma se non sbaglio, mysql può archiviare booleano (BOOL) e lo memorizza come un piccolo (1)

http: //dev.mysql. com / doc / refman / 5.0 / it / altra-vendor-dati-types.html

Bit è vantaggioso solo sulle varie opzioni di byte (tinyint, enum, char (1)) se hai molti campi booleani. Un campo bit occupa ancora un byte intero. I campi a due bit si adattano allo stesso byte. Tre, quattro, cinque, sei, sette, otto. Dopo di che iniziano a riempire il byte successivo. In definitiva i risparmi sono così piccoli che ci sono migliaia di altre ottimizzazioni su cui dovresti concentrarti. A meno che tu non abbia a che fare con un'enorme quantità di dati, quei pochi byte non sommeranno molto. Se stai usando bit con PHP, devi digitare i valori in entrata e in uscita.

Fino a quando MySQL non implementa un tipo di dati bit, se l'elaborazione viene realmente premuta per spazio e / o tempo, ad esempio con transazioni ad alto volume, creare un campo TINYINT chiamato bit_flags per tutte le variabili booleane e mascherare e spostare il valore booleano bit che desideri nella tua query SQL.

Ad esempio, se il bit più a sinistra rappresenta il campo bool e i 7 bit più a destra non rappresentano nulla, il campo & sarà uguale a 128 (10000000 binario). Maschera (nascondi) i sette bit più a destra (usando l'operatore bit a bit <=>) e sposta l'ottavo bit di sette spazi a destra, finendo con 00000001. Ora l'intero numero (che, in questo caso, è 1) è il tuo valore.

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;

if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

È possibile eseguire istruzioni come queste durante il test

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

ecc.

Dato che hai 8 bit, hai potenzialmente 8 variabili booleane da un byte. Qualche futuro programmatore utilizzerà invariabilmente i successivi sette bit, quindi devi mascherare. Don & # 8217; spostati, o creerai l'inferno per te e gli altri in futuro. Assicurati di avere MySQL per mascherare e spostare & # 8212; questo sarà significativamente più veloce rispetto al linguaggio di scripting Web (PHP, ASP, ecc.). Inoltre, assicurati di inserire un commento nel campo dei commenti di MySQL per il tuo <=> campo.

Tu & # 8217; troverai questi siti utili durante l'implementazione di questo metodo:

Mi sono stufato di provare a ottenere zero, NULL e '' accuratamente intorno a un ciclo di valori PHP, MySql e POST, quindi uso semplicemente 'Sì' e 'No'.

Funziona perfettamente e non necessita di trattamenti speciali che non siano ovvi e facili da fare.

Riferendosi a questo link      Tipo di dati booleano in Mysql , secondo il utilizzo dell'applicazione, se si desidera memorizzare solo 0 o 1, il bit (1) è la scelta migliore.

Dopo aver letto le risposte qui ho deciso di usare bit(1) e sì, è in qualche modo meglio nello spazio / tempo, MA dopo un po 'ho cambiato idea e non lo userò mai più. Ha complicato molto il mio sviluppo quando ho usato istruzioni preparate, librerie ecc. (Php).

Da allora uso sempre tinyint(1), mi sembra abbastanza buono.

Poiché MySQL (8.0.16) e MariaDB (10.2.1) hanno entrambi implementato il vincolo CHECK, ora userei

bool_val TINYINT CHECK(bool_val IN(0,1))

Sarai in grado di memorizzare solo 0, 1 o NULL, nonché i valori che possono essere convertiti in '1' o 0x00 senza errori come b'1', TRUE, < => o FALSE / NOT NULL.

Se non si desidera consentire NULL, aggiungere l'opzione TINYINT

bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

Nota che non c'è praticamente alcuna differenza se usi TINYINT(1), TINYINT(123) o BOOL.

Se si desidera che il proprio schema sia compatibile verso l'alto, è anche possibile utilizzare BOOLEAN o <=>

bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

db < > fiddle demo <

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top