Я погоджуюся з усім, що сказано a_horse_with_no_name, і я, як правило, погоджуюся з порадою щодо коментарів Ервіна:
Ні, char є неповноцінним (і застарілим). текст і варчар виконують (майже) те саме.
Метадані
За одним незначним винятком, я використовую єдиний раз 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)
. Однак я не можу придумати нічого, що відповідає цим критеріям.
Додаткові нотатки
Питання та відповіді: