БУЛЕВА или путаница 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.