Путаница с BOOLEAN или TINYINT


92

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

МОЙ вопрос: если они оба одинаковые, почему их два? Их должен быть только один.

Вот ссылка на статьи, которые я читал:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

Ответы:


137

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

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

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

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

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

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

1
Но во всем остальном ваш ответ верен. Что, кажется, сбивает ОП, так это наличие синонимов.
ypercubeᵀᴹ

2
Похоже, это сделано для обратной совместимости. Тип данных BOOLEAN был до MySQL 5 и не был оптимизированным типом BIT, он также был TINYINT. Из документации - Новые функции, запланированные в версии 5.1: Оптимизация типа BIT, чтобы он занимал один бит. (BIT теперь занимает один байт; он рассматривается как синоним TINYINT.).
Devart

5
Да, вы можете знать, есть BIT(1)или BIT(17)дажеBIT(64)
ypercubeᵀᴹ

3
@Devart - там, где ваш ответ набирает наибольшее количество голосов и появляется первым (в любом случае в моем списке) и прошло какое-то время, есть ли шанс, что вы захотите добавить к своему ответу обсуждение типа BIT в MySQL 5.1 и позже?
Джонатан

3
@Jonathan Возможно, упоминание об этом полезно, однако BIT (1) на самом деле не использует меньше места, чем TINYINT (1), и не отображается, как большинство людей ожидает при использовании стандартной консоли mysql. Из-за этого недостатка и отсутствия выгоды от хранения просто использование TINYINT (1) или BOOLEAN кажется наиболее распространенным в моем опыте.
Тайлер Смит

31

Просто примечание для разработчиков php (мне не хватает необходимых точек stackoverflow, чтобы опубликовать это как комментарий) ... автоматическое (и тихое) преобразование в TINYINT означает, что php извлекает значение из столбца "BOOLEAN" как "0" или «1», а не ожидаемое (мной) истина / ложь.

Разработчик, который смотрит на SQL, используемый для создания таблицы, и видит что-то вроде: «some_boolean BOOLEAN NOT NULL DEFAULT FALSE», может разумно ожидать увидеть истинные / ложные результаты при извлечении строки, содержащей этот столбец. Вместо этого (по крайней мере, в моей версии PHP) результатом будет «0» или «1» (да, строка «0» или строка «1», а не int 0/1, спасибо, php).

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


2
В качестве дополнительного примечания, драйверы PHP mysql извлекают все целочисленные типы как строки.
kojow7

24

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


7

Ссылка на версию 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


1
В вашей ссылке указано, что на самом деле требуется «примерно (M + 7) / 8 байт». т.е. округляется до следующего полного байта. Таким образом, это не занимает 1 бит.
mpen

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.