БУЛЕВА или путаница TINYINT
Я разрабатывал базу данных для сайта, где мне нужно использовать логический тип данных для хранения только двух состояний: true или false. Я использую MySQL.
При разработке базы данных с использованием phpMyAdmin я обнаружил, что у меня есть как тип данных BOOLEAN, так и тип данных TINYINT.
Я просмотрел разные статьи, некоторые сказали, что TINYINT - это то же самое, что и BOOLEAN, никакой разницы. Некоторые говорят, что BOOLEAN преобразуется в TINYINT в MySQL.
МОЙ вопрос, если они оба одинаковы, почему существуют два? Должен быть только один из них.
Вот ссылка на статьи, которые я прочитал:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
Ответы
Ответ 1
У MySQL нет внутреннего типа данных типа boolean. Он использует наименьший целочисленный тип данных - TINYINT.
BOOLEAN и BOOL являются эквивалентами TINYINT (1), поскольку они являются синонимами.
Попробуйте создать эту таблицу -
CREATE TABLE table1 (
column1 BOOLEAN DEFAULT NULL
);
Затем запустите SHOW CREATE TABLE, вы получите этот результат -
CREATE TABLE `table1` (
`column1` tinyint(1) DEFAULT NULL
)
Ответ 2
Просто примечание для разработчиков php (у меня нет необходимых точек stackoverflow, чтобы опубликовать это как комментарий)... автоматическое (и молчащее) преобразование в TINYINT означает, что php извлекает значение из столбца BOOLEAN в качестве "0" или "1" , а не ожидаемый (по мне) true/false.
Разработчик, который смотрит на SQL, используемый для создания таблицы, и видит что-то вроде:
"some_boolean BOOLEAN NOT NULL DEFAULT FALSE", может разумно ожидать увидеть истинные/ложные результаты, когда извлекается строка, содержащая этот столбец. Вместо этого (по крайней мере, в моей версии PHP) результат будет "0" или "1" (да, строка "0" или строка "1", а не int 0/1, спасибо php).
Это нить, но достаточно, чтобы вызвать единичные тесты.
Ответ 3
В новейших версиях MySQL есть новый тип данных BIT
, в котором вы можете указать количество бит в поле, например BIT(1)
для использования в качестве типа Boolean
, поскольку оно может быть только 0
или 1
.
Ответ 4
Начиная с версии MySql 5.1 ссылка
BIT(M) = approximately (M+7)/8 bytes,
BIT(1) = (1+7)/8 = 1 bytes (8 bits)
=============================================== ==========================
TINYINT(1) take 8 bits.
https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric