Похоже, MySQL прозрачно трактует booleanкак tinyint(1). Таким образом, вы можете использовать boolean, trueи falseMySQL обрабатывает их как tinyint(1), 1и 0.
ADTC
Другой случай - char 1 с Y & N, который, по мнению некоторых, работает быстрее.
Я бы не сказал, что типы данных являются синонимами - tinyint (1) совпадает с bool, но tinyint и bool - это не одно и то же. Незначительное замечание, но ваш ответ сбил меня с
Кайл Чадха
2
Это не отвечает на вопрос. Хотя это правда, что tinyint (1) функционально идентичен bool, OP спросил, что лучше использовать. Ответ от @dj_segfault правильно объясняет, почему при сохранении логического значения следует отдавать предпочтение bool перед tinyint (1).
Кайл Морган
88
Я собираюсь применить здесь другой подход и предположить, что для ваших коллег-разработчиков так же важно понимать ваш код, как и для компилятора / базы данных. Использование boolean может делать то же самое, что и tinyint, однако оно имеет то преимущество, что семантически передает ваши намерения, и это чего-то стоит.
Если вы используете tinyint, не очевидно, что единственные значения, которые вы должны видеть, - это 0 и 1. Логическое значение ВСЕГДА истинно или ложно.
Лично я бы предложил использовать tinyint в качестве предпочтения, потому что логическое значение не делает то, что, по вашему мнению, оно делает из имени, поэтому оно потенциально вводит в заблуждение код. Но на практическом уровне это действительно не имеет значения - они оба делают одно и то же, поэтому вы ничего не получите и не потеряете, используя их.
Мы не можем использовать enum, так как наша база данных также должна поддерживать sqlite
том
11
Если вы используете InnoDB, бит в конечном итоге использует столько же места, сколько и tinyint. Из High Performance MySQL (ребята из percona) «InnoDB хранит [s] каждый [бит] столбец как наименьший целочисленный тип, достаточно большой, чтобы содержать биты, поэтому вы не экономите место для хранения». Единственный выигрыш - если вы сохраняете несколько логических значений в столбце BIT (более 1). Итак, если у вас есть только одно логическое поле, использование tinyint аналогично bit в InnoDB и предпочтительнее, поскольку с tinyint обычно легче работать.
Хотя это правда , что boolи tinyint(1)является функционально идентичными, boolдолжна быть предпочтительным вариантом , поскольку он несет в себе смысловое значение , что вы пытаетесь сделать. Кроме того, многие ORM преобразуются boolв логический тип вашего языка программирования.
Мой опыт использования Dapper для подключения к MySQL показывает , что это имеет значение . Я изменил бит, не допускающий значения NULL (1), на tinyint (1), допускающий значение NULL, используя следующий сценарий:
ALTERTABLE TableName MODIFY Setting BOOLEAN null;
Затем Dapper начал выбрасывать исключения. Я попытался посмотреть разницу до и после сценария. И заметил, что бит (1) изменился на tinyint (1).
boolean
какtinyint(1)
. Таким образом, вы можете использоватьboolean
,true
иfalse
MySQL обрабатывает их какtinyint(1)
,1
и0
.Ответы:
Эти типы данных являются синонимами.
источник
Я собираюсь применить здесь другой подход и предположить, что для ваших коллег-разработчиков так же важно понимать ваш код, как и для компилятора / базы данных. Использование boolean может делать то же самое, что и tinyint, однако оно имеет то преимущество, что семантически передает ваши намерения, и это чего-то стоит.
Если вы используете tinyint, не очевидно, что единственные значения, которые вы должны видеть, - это 0 и 1. Логическое значение ВСЕГДА истинно или ложно.
источник
boolean
не является отдельным типом данных в MySQL; это просто синонимtinyint
. См. Эту страницу в руководстве по MySQL .Лично я бы предложил использовать tinyint в качестве предпочтения, потому что логическое значение не делает то, что, по вашему мнению, оно делает из имени, поэтому оно потенциально вводит в заблуждение код. Но на практическом уровне это действительно не имеет значения - они оба делают одно и то же, поэтому вы ничего не получите и не потеряете, используя их.
источник
используйте enum, это самый простой и быстрый
я не буду рекомендовать enum или tinyint (1), так как bit (1) нужен только 1 бит для хранения логического значения, а tinyint (1) требует 8 бит.
ссылка
TINYINT против ENUM (0, 1) для логических значений в MySQL
источник
BIT(M) - approximately (M+7)/8 bytes
см .: dev.mysql.com/doc/refman/8.0/en/storage-requirements.htmlХотя это правда , что
bool
иtinyint(1)
является функционально идентичными,bool
должна быть предпочтительным вариантом , поскольку он несет в себе смысловое значение , что вы пытаетесь сделать. Кроме того, многие ORM преобразуютсяbool
в логический тип вашего языка программирования.источник
Мой опыт использования Dapper для подключения к MySQL показывает , что это имеет значение . Я изменил бит, не допускающий значения NULL (1), на tinyint (1), допускающий значение NULL, используя следующий сценарий:
Затем Dapper начал выбрасывать исключения. Я попытался посмотреть разницу до и после сценария. И заметил, что бит (1) изменился на tinyint (1).
Затем я побежал:
Что и решило проблему.
источник