Часто при работе с PostgreSQL у разработчиков возникает путаница в выборе строковых типов данных. В проектах можно встретить и TEXT, и VARCHAR, и даже просто CHAR. Нередко возникает вопрос: какой тип лучше, и есть ли вообще между ними разница с точки зрения производительности и хранения данных?
Эксперт сообщества Spring АйО Михаил Поливаха решил внести ясность и подготовил для вас небольшой ликбез, основанный на внутренней реализации этих типов в PostgreSQL.
–––
Какие типы поддерживает PostgreSQL:
CHAR - Это специфичный для PostgreSQL тип. Он создан, чтобы хранить один символ.CHAR(N) - Хранит строку из символов длины N. При этом на диске физически выделяется фиксированное место для хранения N символов. Оно может быть больше, чем N. VARCHAR - Функционально полностью эквивалентен типу TEXT.VARCHAR(N) - Функционально эквивалентен типу TEXT, за исключением дополнительной функциональности по проверке длины входящей строки.TEXT - Этот тип реализован через VLA (Variable Length Array). Позволяет хранить строки произвольной длины. Он выступает некоторой альтернативой типу CLOB в других СУБД. Пример приведён на картинке.Обратите внимание, что
TEXT, CHAR(N), VARCHAR и VARCHAR(N) в рамках PostgreSQL реализованы одинаково: через VLA, где VARCHAR(N) лишь обладает дополнительной логикой проверки длины строки в символах, а CHAR(N) аллоцирует фиксированный массив под хранение информации.Поэтому не стоит опасаться использовать
TEXT: он ничем не уступает VARCHAR(N) и CHAR(N) ни по производительности, ни по объёму хранения данных.P.S: При работе с PostgreSQL через Hibernate, в общем случае, Вы можете не указывать явно конкретный
java.sql.SQLType при маппинге. Hibernate способен самостоятельно смапить String на текстовые типы данных в PostgreSQL. 🔖 Сохраняйте, чтобы не потерять!
