Boolean vs tinyint (1) для логических значений в MySQL

124

Какой тип столбца лучше всего использовать в базе данных MySQL для логических значений? Я использую, booleanно мой коллега использует tinyint(1).

Том
источник
3
Похоже, MySQL прозрачно трактует booleanкак tinyint(1). Таким образом, вы можете использовать boolean, trueи falseMySQL обрабатывает их как tinyint(1), 1и 0.
ADTC
Другой случай - char 1 с Y & N, который, по мнению некоторых, работает быстрее.
Zon

Ответы:

154

Эти типы данных являются синонимами.

Марис Киселев
источник
6
Я бы не сказал, что типы данных являются синонимами - tinyint (1) совпадает с bool, но tinyint и bool - это не одно и то же. Незначительное замечание, но ваш ответ сбил меня с
Кайл Чадха
2
Это не отвечает на вопрос. Хотя это правда, что tinyint (1) функционально идентичен bool, OP спросил, что лучше использовать. Ответ от @dj_segfault правильно объясняет, почему при сохранении логического значения следует отдавать предпочтение bool перед tinyint (1).
Кайл Морган
88

Я собираюсь применить здесь другой подход и предположить, что для ваших коллег-разработчиков так же важно понимать ваш код, как и для компилятора / базы данных. Использование boolean может делать то же самое, что и tinyint, однако оно имеет то преимущество, что семантически передает ваши намерения, и это чего-то стоит.

Если вы используете tinyint, не очевидно, что единственные значения, которые вы должны видеть, - это 0 и 1. Логическое значение ВСЕГДА истинно или ложно.

dj_segfault
источник
36

booleanне является отдельным типом данных в MySQL; это просто синоним tinyint. См. Эту страницу в руководстве по MySQL .

Лично я бы предложил использовать tinyint в качестве предпочтения, потому что логическое значение не делает то, что, по вашему мнению, оно делает из имени, поэтому оно потенциально вводит в заблуждение код. Но на практическом уровне это действительно не имеет значения - они оба делают одно и то же, поэтому вы ничего не получите и не потеряете, используя их.

Spudley
источник
8

используйте enum, это самый простой и быстрый

я не буду рекомендовать enum или tinyint (1), так как bit (1) нужен только 1 бит для хранения логического значения, а tinyint (1) требует 8 бит.

ссылка

TINYINT против ENUM (0, 1) для логических значений в MySQL

Прамендра Гупта
источник
Мы не можем использовать enum, так как наша база данных также должна поддерживать sqlite
том
11
Если вы используете InnoDB, бит в конечном итоге использует столько же места, сколько и tinyint. Из High Performance MySQL (ребята из percona) «InnoDB хранит [s] каждый [бит] столбец как наименьший целочисленный тип, достаточно большой, чтобы содержать биты, поэтому вы не экономите место для хранения». Единственный выигрыш - если вы сохраняете несколько логических значений в столбце BIT (более 1). Итак, если у вас есть только одно логическое поле, использование tinyint аналогично bit в InnoDB и предпочтительнее, поскольку с tinyint обычно легче работать.
billmalarky
Неправда для MySQL: BIT(M) - approximately (M+7)/8 bytesсм .: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens
6

Хотя это правда , что boolи tinyint(1)является функционально идентичными, boolдолжна быть предпочтительным вариантом , поскольку он несет в себе смысловое значение , что вы пытаетесь сделать. Кроме того, многие ORM преобразуются boolв логический тип вашего языка программирования.

Кайл Морган
источник
0

Мой опыт использования Dapper для подключения к MySQL показывает , что это имеет значение . Я изменил бит, не допускающий значения NULL (1), на tinyint (1), допускающий значение NULL, используя следующий сценарий:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

Затем Dapper начал выбрасывать исключения. Я попытался посмотреть разницу до и после сценария. И заметил, что бит (1) изменился на tinyint (1).

Затем я побежал:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

Что и решило проблему.

smerlung
источник