@LakeForest

Есть ли разница в БД Postgres: хранить string(255) или string?

Я понимаю, что в одном случае длина строки ограничена, в другом нет (это классы из AlchemySQL Python).
На парах изучал Oracle, и нам рассказывали, что если мы не будем задавать кол-во символов, то в итоге может иметь просадку по производительности БД.
Но сейчас пытаюсь найти эквивалетно ли данное утверждение для Postgres и нашел только такое:

Tip: There is no performance difference among these three types, apart from increased storage space when using the blank-padded type, and a few extra CPU cycles to check the length when storing into a length-constrained column. While character(n) has performance advantages in some other database systems, there is no such advantage in PostgreSQL; in fact character(n) is usually the slowest of the three because of its additional storage costs. In most situations text or character varying should be used instead.

То есть в postgres-е ограничение длины влияет только на объем, занимаемой памяти, созданной базы (каждая колонка String будет весить 1 Гб и состоять в большинстве своем из пробелов)?
Или я неправильно понимаю?
Все равно лучше вообще не ограничивать??
  • Вопрос задан
  • 2961 просмотр
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
Для начала, в postgresql нет типа данных string. (а если это самодельный тип, что postgresql сделать тоже позволяет, то смотреть надо как он реализован у вас)

Для текстовых данных в postgresql есть:
- text. Просто text, без специфических ограничений на содержимое
- varchar - это всё тот же самый text. К varchar можно добавить указание ограничения максимальной длины хранимого текста в символах. Почему это отдельный тип данных? Потому что такого требование стандарта SQL
- char - фиксированный длины (в символах! в байтах они всё равно динамической длины получатся для того же utf8). Смысла его использовать в postgresql, как вы сами процитировали документацию, нет. Зачем он нужен? Потому что описан в стандарте.

В отличии от, например, mysql, для postgresql нет ничего особого в значении 255. Если в определении таблицы видно такое ограничение на 255 символов - обычно это означает именно "никто не обдумывал цель такого ограничения для этого поля, просто какое-то число"

Говоря о выборе между text или varchar(N) - varchar(N) с разумным для этих данных N предпочтительнее для коротких строк, потому что не даст записать 10мб туда где должно быть, например, не более 64 символов (это не совсем шутка, случай из практики). А по ошибке в месте записи дебажить логику приложения куда как проще, чем искать потом откуда такое взялось.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы