Para a coluna de propósito booleano, qual é o melhor: anulável char(0)
ou tinyint(1)
.
Eu sei que bool é um apelido para tinyint(1) , mas no livro "High Performance MySQL" publicado pela O'reilly disse:
"Se você deseja armazenar um valor verdadeiro/falso em um único bit de espaço de armazenamento, outra opção é criar uma coluna CHAR(0) anulável. Essa coluna é capaz de armazenar a ausência de um valor (NULL) ou um zero - valor de comprimento (a string vazia)."
qual é melhor para tamanho, desempenho, indexação ou ...
ATUALIZAÇÃO : Achei este link útil para esta pergunta: Armazenamento de valor booleano eficiente para tabelas Innodb
Você deve ter em mente que é impossível indexar uma coluna CHAR(0), mesmo como parte de um índice composto.
Em termos de tamanho, nada supera NULLable CHAR(0); mas quantos desses você tem? Em comparação com outros tipos de dados em sua tabela? Normalmente, quando comparado aos tipos e tamanhos gerais de dados, isso pode ser negligenciado.
O mais claro é BOOL/TINYINT UNSIGNED. É mais óbvio quais valores são esperados.
Caso contrário, considere muitas alternativas em minha postagem e veja boas ideias nos comentários: Escolhendo tipos de dados booleanos do MySQL
Acho que você deveria usar TINYINT(1) porque com valores inteiros, você pode obter valores até 0 e 1. Com TINYINT, pagamos apenas com 1 byte de armazenamento. Assim como com CHAR(1), não podemos impedir que alguém insira outros valores além de 0 e 1. Mas isso realmente não importa, se estivermos dispostos a aceitar que 0 seja avaliado como falso e todos os outros valores como verdadeiros. Usando TINYINT(1), expressões booleanas funcionam muito bem com seus valores de coluna.
Tamanho, desempenho e indexação:
Sinto que recuperar e classificar campos inteiros é mais rápido do que campos de caracteres e também é familiar mostrar 1s e 0s para sinalizadores liga/desliga.