Вот проблема с сохранением логических значений в виде перечисления:
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 и т. д.)
Короче говоря, хотя одно не может быть быстрее другого на уровне байтов, логические значения должны храниться как выражения, чтобы их можно было сравнивать с другими выражениями.
По крайней мере, так я это вижу.