Como o MySQL não parece ter nenhum tipo de dados 'booleano', que tipo de dados você 'abuse' por armazenar informações verdadeiras / falsas no MySQL?
Especialmente no contexto de escrita e leitura de / para um script PHP.
Com o tempo, usei e vi várias abordagens:
- tinyint, campos varchar contendo os valores 0/1,
- campos varchar contendo as seqüências de caracteres '0' / '1' ou 'true' / 'false'
- e finalmente enum Campos contendo as duas opções 'true' / 'false'.
Nenhuma das opções acima parece ótima. Eu tendem a preferir a variante tinyint 0/1, pois a conversão automática de tipo no PHP me fornece valores booleanos de maneira bastante simples.
Então, qual tipo de dados você usa? Existe um tipo projetado para valores booleanos que eu ignorei? Você vê vantagens / desvantagens usando um tipo ou outro?
mysql
boolean
sqldatatypes
Peter Mortensen
fonte
fonte
bit(1)
é um pouco ** para importar no Excel. Mudando para otinyint(1)
Works.Respostas:
Para o MySQL 5.0.3 e superior, você pode usar
BIT
. O manual diz:Caso contrário, de acordo com o manual do MySQL, você pode usar bool e boolean, que são atualmente aliases de tinyint (1):
O MySQL também afirma que:
Referências: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
fonte
!$boolean
nunca será avaliado adequadamente sem processamento adicional.auto_increment
uma coluna representando um valor booleano?BOOL
eBOOLEAN
são sinônimos deTINYINT(1)
. Zero éfalse
, qualquer outra coisa étrue
. Mais informações aqui .fonte
(1)
não faz nada mais do que determinar como o valor é exibido, se você está consciente sobre tamanho de armazenamento, em seguida, que pretende utilizarBIT
em vezBIT(1)
eTINYINT(1)
ambos usarão um byte de armazenamento. Até o MySQL 5.0.3,BIT
na verdade era sinônimoTINYINT
. Versões posteriores do MySQL mudaram a implementação do BIT. Mas mesmo com a alteração na implementação, ainda não há benefício de "tamanho do armazenamento" para oBIT
tipo de dados (pelo menos com o InnoDB e o MyISAM; outros mecanismos de armazenamento, como o NDB, podem ter alguma otimização de armazenamento para várias declarações de coluna BIT.) O maior problema é que alguns clientes as bibliotecas não reconhecem ou tratam adequadamente asBIT
colunas de tipo de dados retornadas . ATINYINT
funciona melhor.true
" não é verdadeira.SELECT 'foo' AS bar FROM dual WHERE -7
. A expressão -7 é avaliada em um contexto booleano e a consulta retorna uma linha. Podemos testar com 0 ou qualquer expressão que avalie o valor inteiro 0 e nenhuma linha é retornada. Se a expressão na cláusula WHERE for avaliada como qualquer valor inteiro não nulo diferente de zero, a expressão será TRUE. (Eu acredito valores decimais e flutuador obter "arredondado" para inteiro, por exemplo,WHERE 1/3
avalia aWHERE 0
Nós obter o mesmo resultado com.WHERE 'foo'
, Porque corda'foo'
também avalia a valor inteiro 0.Esta é uma solução elegante que eu aprecio bastante porque usa zero bytes de dados:
Para configurá-lo como true, configure
some_flag = ''
e para false, configuresome_flag = NULL
.Em seguida, para testar se true, verifique se some_flag
IS NOT NULL
e, para testar false, verifique se some_flagIS NULL
.(Este método é descrito em "MySQL de alto desempenho: otimização, backups, replicação e muito mais", de Jon Warren Lentz, Baron Schwartz e Arjen Lentz.)
fonte
COMMENT
na definição da coluna queNULL
indica falso e''
indica verdadeiro pode ser muito pequeno para ajudar no entendimento futuro.Se você usar o tipo BOOLEAN, isso é alias para TINYINT (1). Isso é melhor se você quiser usar SQL padronizado e não se importar que o campo possa conter um valor fora do intervalo (basicamente qualquer coisa que não seja 0 será 'verdadeira').
ENUM ('False', 'True') permitirá que você use as strings em seu SQL, e o MySQL armazenará o campo internamente como um número inteiro onde 'False' = 0 e 'True' = 1 com base na ordem em que o Enum está especificado .
No MySQL 5+, você pode usar um campo BIT (1) para indicar um tipo numérico de 1 bit. Não acredito que isso realmente use menos espaço no armazenamento, mas novamente permita que você limite os valores possíveis para 1 ou 0.
Todas as opções acima usarão aproximadamente a mesma quantidade de armazenamento; portanto, é melhor escolher a que você achar mais fácil trabalhar.
fonte
Esta pergunta foi respondida, mas achei que jogaria meus $ 0,02. Eu costumo usar um
CHAR(0)
, onde'' == true and NULL == false
.Dos documentos do mysql :
fonte
''
enull
são valores falsos.Eu uso TINYINT (1) para armazenar valores booleanos no Mysql.
Não sei se existe alguma vantagem em usar isso ... Mas se não estiver errado, o 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
fonte
O bit só é vantajoso em relação às várias opções de bytes (tinyint, enum, char (1)) se você tiver muitos campos booleanos. Um campo de bit ainda ocupa um byte completo. Campos de dois bits se encaixam no mesmo byte. Três, quatro, cinco, seis, sete, oito. Depois disso, eles começam a preencher o próximo byte. Por fim, as economias são tão pequenas que existem milhares de outras otimizações nas quais você deve se concentrar. A menos que você esteja lidando com uma quantidade enorme de dados, esses poucos bytes não serão suficientes. Se você estiver usando pouco com PHP, precisará digitar os valores entrando e saindo.
fonte
Até o MySQL implementar um tipo de dados em bits, se o seu processamento for realmente pressionado por espaço e / ou tempo, como em transações de alto volume, crie um campo TINYINT chamado
bit_flags
para todas as suas variáveis booleanas, mascare e altere o bit booleano em seu SQL inquerir.Por exemplo, se o seu bit mais à esquerda representa o seu campo bool e os 7 bits à direita não representam nada, então o seu
bit_flags
campo será igual a 128 (binário 10000000). Mascarar (ocultar) os sete bits mais à direita (usando o operador bit a bit&
) e deslocar o oitavo bit em sete espaços para a direita, terminando com 00000001. Agora, o número inteiro (que, nesse caso, é 1) é o seu valor.Você pode executar instruções como estas ao testar
etc.
Como você possui 8 bits, você tem potencialmente 8 variáveis booleanas de um byte. Algum programador futuro invariavelmente usará os próximos sete bits, então você deve mascarar. Não apenas mude, ou você criará o inferno para si e para os outros no futuro. Certifique-se de que o MySQL faça sua máscara e mudança - isso será significativamente mais rápido do que a linguagem de script da web (PHP, ASP, etc.). Além disso, certifique-se de colocar um comentário no campo MySQL comment para seu
bit_flags
campo.Você encontrará esses sites úteis ao implementar este método:
fonte
VARCHAR
e executar o procedimento de desmascaramento no código (você também não precisa limitá-lo a 8 campos) ...BIT
tipo existe. Veja dev.mysql.com/doc/refman/8.0/en/bit-type.htmlEu me cansei de tentar obter zeros, NULLS e '' arredondar com precisão um loop de valores PHP, MySql e POST, então apenas uso 'Sim' e 'Não'.
Isso funciona perfeitamente e não precisa de tratamento especial que não seja óbvio e fácil de fazer.
fonte
Referindo-se a este link Tipo de dados booleano no Mysql , de acordo com o uso do aplicativo, se alguém quiser que apenas 0 ou 1 seja armazenado, o bit (1) é a melhor opção.
fonte
BIT(1)
apenas permitirá que umb'0'
oub'1'
valor seja armazenado. O maior problema com oBIT
tipo de dados é que várias bibliotecas clientes têm uma variedade de manipulação instável do tipo de dados. Faça o checkout do comportamento de várias ferramentas SQL (SQLyog, TOAD para MySQL, SQL Developer), ferramentas que fazem engenharia reversa de modelos de banco de dados e vários clientes, como JDBC, PHP, Perl DBI e, por uma boa medida, teste algumas estruturas ORM ( Hibernate, Mybatis, JPA). Em termos de facilidade de uso, compatibilidade de ferramenta / estrutura / suporte nativo,TINYINT(1)
é o vencedor.BIT
eTINYINT
. Consulte a classe JdbcType do MyBatis, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/…Como o MySQL (8.0.16) e o MariaDB (10.2.1) implementaram a restrição CHECK, agora eu usaria
Você só será capaz de loja
0
,1
ouNULL
, bem como os valores que podem ser convertidas para0
ou1
sem erros como'1'
,0x00
,b'1'
ouTRUE
/FALSE
.Se você não deseja permitir NULLs, adicione a
NOT NULL
opçãoObserve que praticamente não há diferença se você usar
TINYINT
,TINYINT(1)
ouTINYINT(123)
.Se você deseja que seu esquema seja compatível com versões anteriores, também pode usar
BOOL
ouBOOLEAN
db <> demo de violino
fonte
ENUM
(deve serenum('0', '1')
- nota: são strings) não é uma boa ideia. Há muitos problemas devido à forma como ele é armazenado internamente e como os valores não-string são tratados. Por exemplo.0
eFALSE
não pode ser armazenado.1
eTRUE
se tornar'0'
. E2
se torna'1'
.Depois de ler as respostas aqui, decidi usar
bit(1)
e sim, é de alguma forma melhor no espaço / tempo, MAS depois de um tempo mudei de idéia e nunca mais o usarei. Isso complicou bastante meu desenvolvimento, ao usar instruções preparadas, bibliotecas etc. (php).Desde então, eu sempre uso
tinyint(1)
, parece bom o suficiente.fonte
Você pode usar o tipo de dados BOOL, BOOLEAN para armazenar valores booleanos.
No entanto, o tipo de dados BIT (1) faz mais sentido para armazenar um valor booleano (verdadeiro [1] ou falso [0]), mas é mais fácil trabalhar com TINYINT (1) quando você estiver produzindo os dados, consultando e assim por diante. e para obter interoperabilidade entre o MySQL e outros bancos de dados. Você também pode verificar esta resposta ou tópico .
Além disso, leia a documentação
fonte