Ответ 1
PostgreSQL (в отличие от Oracle) имеет полноценный boolean
type. Как правило, флаг "да/нет" должен быть boolean
. Это правильный тип для использования!
Как насчет размера/хранения?
В принципе, столбец boolean
занимает 1 байт на диске,
в то время как text
или character varying
(цитируя руководство здесь)...
требование хранения для короткой строки (до 126 байтов) - 1 байт плюс фактическая строка
Это 2 байта для простого символа. Таким образом, вы можете сократить хранение этого столбца пополам.
Фактическое хранение более сложное. Существует некоторая фиксированная накладная плата за стол, страница и строка, есть специальный NULL
storage, а для некоторых типов требуется выравнивание данных. Общее воздействие будет очень ограниченным - если вообще это заметно.
Подробнее о том, как измерить фактическое пространство.
Кодирование UTF8
здесь не имеет никакого значения. Основные ASCII-символы совместимы с другими кодировками, такими как LATIN-1
.
В вашем случае, согласно вашему описанию, вы должны сохранить NOT NULL constraint, который у вас уже есть, - независимо от базового типа.
Производительность запроса?
Будет немного лучше в любом случае с булевым. Кроме того, немного меньше, логика для boolean
проще, а varchar
или text
также обычно обременены специальными правилами COLLATION. Но не ожидайте многого для чего-то простого.
Вместо
WHERE consistency = 'Y'
Вы можете написать:
WHERE consistency = TRUE
Но, действительно, вы можете упростить просто:
WHERE consistency
Никакой дальнейшей оценки не требуется.
Изменить тип
Преобразование таблицы просто:
ALTER TABLE tbl ALTER consistency TYPE boolean
USING CASE consistency WHEN 'Y' THEN TRUE ELSE FALSE END;
Это выражение CASE
сбрасывает все, что не является TRUE
('Y'), на FALSE
. Ограничение NOT NULL остается.