Логическая или 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 ответов:
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