Я согласен со всем, что говорит a_horse_with_no_name, и в целом согласен с комментарием Эрвина:
Нет, чарс уступает (и устарел). текст и varchar выполняют (почти) одно и то же.
Метаданные
За одним небольшим исключением, я использую только один раз char()
, когда я хочу, чтобы метаданные сказали, что это ДОЛЖНО иметь x-символы. Хотя я знаю, что char()
жалуется , только если входное значение превышает предел, я буду часто защищать от недогрузок в CHECK
ограничении. Например,
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
Я делаю это по нескольким причинам,
char(x)
иногда определяется загрузчиками схемы как столбец с фиксированной шириной. Это может иметь значение в языке, который оптимизирован для строк фиксированной ширины.
- Он устанавливает соглашение, которое имеет смысл и легко исполняется. Я могу написать загрузчик схемы на языке, чтобы сгенерировать код из этого соглашения.
Нужен пример, где я могу это сделать,
- Двухбуквенные сокращения состояний, хотя этот список можно перечислить, я обычно делаю это с помощью
ENUM
.
- Идентификационные номера транспортных средств
- Номера моделей (фиксированного размера)
На ошибки
Обратите внимание, что некоторым людям может быть неудобно из-за несоответствия сообщений об ошибках по обе стороны предела, но меня это не беспокоит
test=# INSERT INTO foo VALUES (repeat('x', 9));
ERROR: new row for relation "foo" violates check constraint "foo_x_check"
DETAIL: Failing row contains (xxxxxxxxx ).
test=# INSERT INTO foo VALUES (repeat('x', 11));
ERROR: value too long for type character(10)
Контраст с varchar
Кроме того, я думаю, что вышеупомянутое предложение действительно хорошо согласуется с соглашением о почти всегда использованииtext
. Вы varchar(n)
тоже спрашиваете об этом . Я никогда не использую это . По крайней мере, я не могу вспомнить последний раз, когда я использовал varchar(n)
.
- Если спецификация имеет статическую ширину поля , которое я доверяю, я использую
char(n)
,
- В противном случае я использую
text
что эффективно varchar
(без ограничений)
Если бы я нашел спецификацию, которая имела бы текстовые клавиши переменной длины, которые были бы значимыми и которые я доверял, чтобы иметь постоянную максимальную длину, я бы varchar(n)
тоже использовал . Однако я не могу придумать ничего, что соответствует этим критериям.
Дополнительные замечания
Связанные вопросы и ответы: