One bit per answer
If you are willing to limit the number of questions to 64, then BIGINT UNSIGNED
will work somewhat easily, but limited to 64 true/false values. Let's say q
is the column being used.
q & 1<<0 -- the bit for question 1 (assuming question numbers start at 1)
q & 1<<22 -- the bit for question 23
(q & 1<<22) = 0 "false" for q23
(q & 1<<22) != 0 "true" for q23
(q & 0x7FF) = 0x7ff "true" for all of q 1-11
Etc.
The SET
datatype is implemented similarly but is clumsier to use for your case since it wants you to name each bit.
If you need more than 64, then BINARY
and BLOB
would let you have up to 4 billion bits (in LONGBLOB
), but it is much messier to extract a single bit from them.
INT UNSIGNED
has only 32 bits (4 bytes), thereby not satisfying your "50".
One byte per answer
It is probably not unreasonable to have the answers in rows -- a table with (student, question_number, answer). In this case answer
could be any of these. Each takes 1 byte and is about as easy to work on as any other.
CHAR(1) CHARACTER SET ASCII NOT NULL. -- and insert "T"/"F" (or whatever)
TINYINT UNSIGNED NOT NULL -- 0=false, 1=true
ENUM("F", "T") NOT NULL