У PostgreSQL text, varchar і varchar(n) зберігаються однаково й працюють з однаковою швидкістю. Різниця лише в тому, що varchar(n) додає перевірку довжини.
text- рядок довільної довжини.varchar(n)- рядок не довший заnсимволів (не байтів). Довший - помилка.varcharбез довжини - те саме, щоtext.char(n)- доповнюється пробілами доn. Майже ніколи не потрібен: займає не менше місця і має дивну семантику порівнянь.
Звідки звичка до varchar(255): у MySQL та інших СУБД довжина впливає на зберігання, індекси й тимчасові таблиці. У PostgreSQL такої причини немає.
Як обирати:
text- для більшості рядків. Обмеження довжини - якщо воно справді є правилом домену.- Бізнес-обмеження - через
CHECK, його легше змінити:
title text NOT NULL CHECK (char_length(title) <= 200)
Збільшити ліміт varchar(n) у сучасних версіях можна без переписування таблиці, але зменшення вимагає повної перевірки даних.
Що варто знати:
- Довгі значення (понад ~2 КБ) автоматично стискаються й виносяться в TOAST - таблиця не роздувається.
- Laravel
$table->string('name')створюєvarchar(255)- на PostgreSQL це лише обмеження, а не оптимізація. Для довгих текстів -$table->text(). - Валідація довжини в застосунку все одно потрібна, щоб користувач отримав зрозуміле повідомлення, а не помилку бази.