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?
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
BOOL
e {[1] } são sinónimos de TINYINT(1)
. Zero é false
, qualquer outra coisa é true
. Mais informações aqui.
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
.
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 comoCHAR(0)
NULL
ocupa apenas um bit e pode tomar apenas os valoresNULL
e''
(o texto vazio).
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.
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
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.
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:
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.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))
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 sempretinyint(1)
, parece-me bem.
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