2012-06-23 3 views
67

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

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

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

ответ

101

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

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

Попытка создать эту таблицу -

CREATE TABLE table1 (
    column1 BOOLEAN DEFAULT NULL 
); 

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

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

Существует [BIT] (HTTP: //dev.mysql.com/doc/refman/5.5/en/bit-type.html) –

+0

Да, действительно. Не думал о BIT. – Devart

+1

Но ваш ответ верен во всех других аспектах. Кажется, что смущает ОП - существование синонимов. –

21

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

7

По MySql версии 5.1 reference

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

+0

@mpen tnx, я обновил ответ. – fortune

25

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

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

Это нит, но достаточно, чтобы вызвать единичные тесты.

+1

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

0

В числовом виде для MySQL указано: BOOL, BOOLEAN: Эти типы являются синонимами для TINYINT (1). Значение нуля считается ложным. Ненулевые значения считаются истинными.

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

Смежные вопросы