Enum или Bool в MySQL? - PullRequest
       24

Enum или Bool в MySQL?

7 голосов
/ 15 ноября 2010

Простой глупый вопрос.Что лучше?

Bool или Enum ('y', 'n')?

Ответы [ 7 ]

18 голосов
/ 15 ноября 2010

BOOLEAN является псевдонимом для TINYINT (1) и сохраняется как один байт данных.
ENUM ('y', 'n') также сохраняется как 1 байт данных.

Итак, с точки зрения размера хранилища, ни тот, ни другой лучше.
Однако вы можете сохранить 9 в BOOLEAN поле, и оно примет это. Поэтому, если вы хотите форсировать только два состояния, перейдите к ENUM.

6 голосов
/ 15 ноября 2010

TINYINT(1) - это выглядит как логическое значение, поэтому сделайте его одним.

Никогда не сравнивайте внутренне с такими вещами, как y, когда доступно логическое значение (0/1).

4 голосов
/ 02 июля 2011

Вот проблема с сохранением логических значений в виде перечисления:

SELECT count(*) FROM people WHERE is_active = true; # => Возвращает 0, потому что true! = 'True'

Что вводит в заблуждение, потому что:

SELECT count(*) FROM people WHERE is_active = 'true'; # => Возвращает 10

Если вы пишете все свои собственные запросы SQL, вы бы знали, что не должны передавать выражение в свой запрос, но если вы используете ORM, вы столкнетесь с проблемами, поскольку ORM обычно преобразовать выражение во что-то, что база данных, которую он запрашивает, может понять ('t' / 'f' для SQLite; 0/1 для MySQL и т. д.)

Короче говоря, хотя одно не может быть быстрее другого на уровне байтов, логические значения должны храниться как выражения, чтобы их можно было сравнивать с другими выражениями.

По крайней мере, так я это вижу.

2 голосов
/ 09 марта 2012

Ни один из них не подходит для хранения одного бита (или логического значения). Перечисление имеет таблицу поиска и хранит ответ в виде целого числа. Логическое значение на самом деле является просто псевдонимом для «TINYINT (1)», который является технически 8 битами информации. Битовый тип данных будет хранить только столько битов, сколько указано в его определении (как в типе varchar), поэтому бит (1) будет буквально хранить только один бит. Однако, если у вас есть только одно из этих полей, то вопрос спорный, так как ничто не заполнит оставшиеся биты, поэтому они будут занимать неиспользуемое пространство в каждой строке (объем пространства в каждой строке округляется до как минимум байта, как правило 8 бит на строку).

0 голосов
/ 14 марта 2019

Ислам и тогда придет МахдиЕсть 8 причин для неиспользования ENUM типа данных;Поэтому вместо ENUM используйте логическое или справочную внешнюю таблицу .

0 голосов
/ 31 августа 2016

По умолчанию рекомендуется использовать BOOL / TINYINT(1), но, как указано в ответе на https://stackoverflow.com/a/4180982/2045006, это допускает 9 вариантов TRUE.

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

В случае, если вы будете использовать столбец в уникальном индексе, я бы рекомендовал использовать BIT(1).

ENUM также будет хорошо работать с уникальным индексом (при условии, что у вас есть подходящий набор режимов SQL). Однако я бы использовал ENUM, только если вы хотите работать со строковыми представлениями true / false, а не с действительными логическими значениями.

0 голосов
/ 15 ноября 2010

В зависимости от языка, который вы используете для взаимодействия с базой данных, вы можете столкнуться с проблемами чувствительности к регистру, используя enum, например, если ваша база данных использует строчную букву «y», но ваш код ожидает прописную букву «Y».Значение bool / tinyint всегда будет равно 0 или 1 (или NULL), поэтому оно позволяет избежать этой проблемы.

...