Que tipo de dados MySQL usar para armazenar os valores booleanos

Uma vez que o MySQL não parece ter nenhum tipo de dados 'booleano', qual o tipo de dados que você 'abusa' para armazenar informações verdadeiras/falsas no MySQL?

especialmente no contexto da escrita e leitura de/para um script PHP.

ao longo do tempo, usei e vi várias abordagens:

  • tinyint, varchar fields contendo os valores 0/1,
  • campos varchar contendo as cadeias de caracteres '0' / ' 1 'ou'true'/'false'
  • e finalmente campos de enum contendo o duas opções "true" / "false".

nenhum dos acima parece ser o ideal. Eu tendem a preferir a variante tinyint 0/1, uma vez que a conversão automática de tipo em PHP me dá valores booleanos bastante simples.

qual o tipo de dados que utiliza? Existe um tipo projetado para valores booleanos que eu negligenciei? Você vê alguma vantagem / desvantagem usando um tipo ou outro?

Author: Peter Mortensen, 2008-11-14

13 answers

Para o MySQL 5, 0, 3 ou mais, pode utilizar BIT. O manual diz:

A partir de MySQL 5. 0. 3, o tipo de dados de bits é usado para armazenar o campo de bits valores. Um tipo de BIT(M) permite o armazenamento de valores de M-bit. M alcance de 1 a 64.

Caso contrário, de acordo com o manual MySQL, pode utilizar BOOL ou BOOLEAN, que são actualmente pseudónimos de tinyint(1):

Bool, booleano: estes tipos são sinónimos para TINYINT (1). Um valor de zero é considerado falso. Zero os valores são considerados verdadeiros.

MySQL também afirma que:

Temos a intenção de implementar um booleano completo. tratamento de tipo, em conformidade com SQL padrão, Num futuro MySQL lancar.

Referências: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

 1269
Author: markus, 2020-08-24 06:35:19

BOOL e {[1] } são sinónimos de TINYINT(1). Zero é false, qualquer outra coisa é true. Mais informações aqui.

 259
Author: Philip Morton, 2008-11-14 10:55:02

Esta é uma solução elegante que eu aprecio bastante porque usa bytes de dados zero:

some_flag CHAR(0) DEFAULT NULL

Para configurá-lo como verdadeiro, definir some_flag = '' e configurá-lo como falso, definir some_flag = NULL.

Depois, para testar o true, verifique se o some_flag IS NOT NULL, e para testar o false, verifique se o some_flag IS NULL.

(Este método é descrito em" High Performance MySQL: Optimization, Backups, Replication, and More " por Jon Warren Lentz, Baron Schwartz e Arjen Lentz.)
 75
Author: R. S., 2016-12-19 20:36:12
Esta pergunta foi respondida, mas pensei em juntar os meus $0,02. Uso frequentemente um CHAR(0), em que '' == true and NULL == false. De mysql docs:

CHAR(0) também é muito bom quando você precisa de uma coluna que pode tomar apenas dois valores: uma coluna que é definida como CHAR(0) NULL ocupa apenas um bit e pode tomar apenas os valores NULL e '' (o texto vazio).

 36
Author: Josh, 2020-04-19 11:25:39

Se você usar o tipo booleano, este é alias para TINYINT (1). Isto é melhor se você quiser usar SQL padronizado e não se importe que o campo possa conter um valor fora do intervalo (basicamente, qualquer coisa que não seja 0 será 'verdadeiro').

O ENUM ('False',' True') permitir-lhe-á usar as cadeias de caracteres no seu SQL, e o MySQL armazenará o campo internamente como um inteiro onde'False '=0 e'True' =1, com base na ordem que o Enum é especificado.

No MySQL 5+ pode usar um campo BIT(1) para indicar um tipo numérico de 1 bits. Eu não acredito que isso realmente usa menos espaço no armazenamento, mas novamente permite que você restrinja os valores possíveis para 1 ou 0.

Tudo o acima irá usar aproximadamente a mesma quantidade de armazenamento, por isso é melhor escolher o que você acha mais fácil de trabalhar.

 33
Author: Ciaran McNulty, 2008-11-14 14:59:29

USO O TINYINT (1) para guardar os valores booleanos no Mysql.

Não sei se há alguma vantagem em usar isto... Mas se eu não estiver errado, mysql pode armazenar booleano (BOOL) e armazená-lo como um tinyint(1)

Http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html

 18
Author: Fred, 2008-11-14 10:42:51

Bit só é vantajoso sobre as várias opções de bytes(tinyint, enum, char (1)) Se você tem um monte de campos booleanos. Um pouco de campo ainda ocupa um byte completo. Dois pequenos campos encaixam no mesmo byte. Três, quatro, cinco, seis, sete, oito. Depois disso, começam a encher o próximo byte. Em última análise, as economias são tão pequenas, há milhares de outras otimizações que você deve se concentrar. A menos que esteja a lidar com uma enorme quantidade de dados, esses poucos bytes não vão somar. a muito. Se você está usando bit com PHP você precisa digitar os valores indo e vindo.

 18
Author: Thor, 2012-01-12 16:18:54

Até que o MySQL Implemente um tipo de dados de bits, se o seu processamento for realmente pressionado por espaço e / ou tempo, como por exemplo com transacções de alto volume, crie um campo de TINYINT chamado {[[2]} para todas as suas variáveis booleanas, mascare e mude o bit booleano que deseja na sua consulta SQL.

Por exemplo, se o seu bit mais à esquerda representa o seu campo bool, e os 7 bits mais à direita não representam nada, então o seu campo bit_flags será igual a 128 (binário 10000000). Mascarar (esconder) os sete bits mais à direita (usando o operador bitwise &), e mudar o oitavo bit sete espaços para a direita, terminando com 000001. Agora o número inteiro (que, neste caso, é 1) é o seu valor.

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

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

Podes fazer declarações como estas à medida que testas

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

Etc.

Uma vez que você tem 8 bits, você tem potencialmente 8 variáveis booleanas de um byte. Algum programador futuro usará invariavelmente os próximos sete bits, então você deve máscara. Não basta mudar, ou você vai criar o inferno para tu e os outros no futuro. Certifique - se de que o MySQL faz a sua máscara e a sua mudança-isto será significativamente mais rápido do que ter a linguagem de programação web (PHP, ASP, etc.) faça-o. Além disso, certifique-se de colocar um comentário no campo de comentários MySQL para o seu campo bit_flags.

Você vai achar estes sites úteis ao implementar este método:

 12
Author: Jonathan, 2018-06-22 16:09:32

Fartei-me de tentar obter zeros, NULLS, e " exactamente em volta de um loop de valores de PHP, MySql e POST, então eu só uso 'Sim' e 'não'.

Isto funciona perfeitamente e não precisa de tratamento especial que não seja óbvio e fácil de fazer.
 10
Author: Geoff Kendall, 2017-08-03 13:55:53
([1]}referindo-se a esta ligação o tipo de dados booleano no Mysql , de acordo com o uso da aplicação, se alguém quiser apenas 0 ou 1 para ser armazenado, o bit(1) é a melhor escolha.
 6
Author: Vidz, 2017-04-13 12:42:36

Uma Vez Que o MySQL (8.0.16) e o MariaDB (10.2.1) ambos implementaram a restrição de verificação, eu agora usaria

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

Você vai apenas ser capaz de armazenar 0, 1 ou NULL, bem como valores que podem ser convertidos para 0 ou 1 sem erros como '1', 0x00, b'1' ou TRUE/FALSE.

Se não queres permitir NULLs, adiciona a opção NOT NULL

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

Note que não há praticamente nenhuma diferença se utilizar TINYINT, TINYINT(1) ou TINYINT(123).

Se quiseres o seu esquema para ser compatível com o aumento, também pode usar BOOL ou BOOLEAN

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

Demonstração do Dbfiddle

 6
Author: Paul Spiegel, 2019-05-26 17:53:19

Depois de ler as respostas aqui decidi usar {[[[0]} e sim, é de alguma forma melhor no espaço/tempo, mas Depois de algum tempo mudei de ideias e nunca mais a utilizarei. Isso complicou muito o meu desenvolvimento, ao usar declarações preparadas, bibliotecas etc (php).

Desde então, uso sempre tinyint(1), parece-me bem.
 3
Author: Lemures, 2018-06-26 10:14:10

Pode usar o tipo de dados booleano para armazenar os valores booleanos.

Estes tipos são sinónimos para o TINYINT (1)

No Entanto, o BIT(1) tipo de dados faz mais sentido para armazenar um valor booleano (true) [1] ou falsa[0]), mas TINYINT(1) é mais fácil de trabalhar quando você está emitindo o de dados, consulta e assim por diante e para alcançar a interoperabilidade entre MySQL e outros bancos de dados. Você também pode verificar esta resposta ou linha .

MySQL também converts BOOL, BOOLEAN data types to TINYINT (1).

Além disso, deve ler-se documentação

 1
Author: Premkumar chalmeti, 2020-04-26 10:43:59