BOOLEAN або TINYINT плутанина


92

Я розробляв базу даних для сайту, де мені потрібно використовувати логічний тип дати, щоб зберігати лише 2 стани, 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

Відповіді:


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
Але ваша відповідь правильна у всіх інших аспектах. Що, здається, бентежить OP, - це існування синонімів.
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", а не очікуване (мною) true / false.

Розробник, який розглядає SQL, що використовується для створення таблиці, і бачить щось на зразок: "some_boolean BOOLEAN NOT NULL DEFAULT FALSE", може обгрунтовано очікувати побачити істинні / хибні результати при отриманні рядка, що містить цей стовпець. Натомість (принаймні в моїй версії PHP) результат буде "0" або "1" (так, рядок "0" або рядок "1", а не int 0/1, спасибі php).

Це гнида, але достатня, щоб змусити модульні тести провалитися.


2
Як додаткове зауваження, драйвери mysql PHP вводять усі цілі типи у вигляді рядків.
kojow7


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.