Логическая или TINYINT путаница


Я разрабатывал базу данных для сайта, где мне нужно использовать логический тип данных для хранения только 2 состояний, true или false. Я использую MySQL.
При проектировании базы данных с помощью phpMyAdmin я обнаружил, что у меня есть как логический тип данных, так и тип данных TINYINT.
Я просмотрел разные статьи, некоторые сказали, что TINYINT такой же, как BOOLEAN, никакой разницы. Некоторые говорят, что BOOLEAN преобразуется в TINYINT в MySQL.

мой вопрос, если они оба одинаковы, почему там существуют два? Должен быть только один из них.

вот ссылка на статьи I read:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

5 73

5 ответов:

MySQL не имеет внутреннего логического типа данных. Он использует наименьший целочисленный тип данных-TINYINT.

BOOLEAN и BOOL являются эквивалентами TINYINT(1), потому что они являются синонимами.

попробуйте создать эту таблицу -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

затем запустите SHOW CREATE TABLE, вы получите этот вывод -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)

просто Примечание Для разработчиков 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).

Это гнида, но достаточно, чтобы заставить модульные тесты потерпеть неудачу.

самые новые версии MySQL имеют новый BIT тип данных, в котором можно указать количество бит в поле, например BIT(1) использовать как Boolean тип, потому что это может быть только 0 или 1.

начиная с версии 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

обзор числового типа для состояний MySQL: БООЛ, ЛОГИЧЕСКОЕ: Эти типы являются синонимами для TINYINT (1). Нулевое значение считается ложным. Ненулевые значения считаются истинными.

см. здесь: https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html