Содержание

Предыдущий раздел

Временные интервалы. Хранение и применение в версии PostgreSQL до 9.2

Следующий раздел

Возврат данных из хранимых процедур

Выбор типа данных для строк/текста (char vs varchar vs text)

В PostgreSQL есть три типа данных для хранения текстовой информации:

  • character(n), char(n) - текст фиксированной длины (строка всегда имеет строго заданный размер)
  • character varying(n), varchar(n) - текст с ограничением по длине (максимальная длина строка может быть ограничена)
  • text - текст неограниченной длины

Физически максимальный размер любых строк в PostgreSQL ограничен одним гигабайтом (1GB).

Примечание

Логическое ограничение на максимальный размер строки (char(n), varchar(n), где n - логическое ограничение), задаваемое пользователем для конкретного поля, лимитирует количество символов в строке, а не длину строки в байтах. Поэтому, несмотря на физический лимит на максимальный размер строки в 1GB, реальное максимальное количество символов в строке может быть меньше, так как различные кодировки символов могут использовать больше одного байта для представления одного символа.

CHAR(N)

Этот тип всегда имеет ограничение по длине. Даже, если длина не задана (char), то подразумевается, что она равна единице, то есть char ~ char(1).

Тип имеет одну особенность, которая выделяет есть среди других текстовых типов. Так как поля с этим типом имеют фиксированный размер (не больше / не меньше заданного), то, при сохранении в таблицу у всех строк, длина которых меньше этого размера, оставшееся пустое место в конце строки заполняется пробелами. Поэтому при сохранении значения '123' в поле с типом char(6) в таблицу реально сохранится '123___'. Это может стать неприятным сюрпризом.

При операциях сравнения полей с типом char(n) пробелы в конце строки игнорируются.

denis=# SELECT '123   '::char(6) = '123';
 ?column?
----------
 t
(1 row)

VARCHAR

Тип без заданной длины интерпретируется PostgreSQL, как безразмерная строка эквивалентная типу text. При попытке записать в текстовое поле ограниченной длины значение, которое превышает заданные размеры, генерируется ошибка. Строка этого типа хранится в базе данных без изменений (в отличии от char(n)), поэтому нагрузка на процессор при обработке varchar-строк немного меньше, чем при работе с char(n).

TEXT

Этот тип позволяет сохранять строки размером до одного гигабайта. Поэтому его часто используют для хранения текстов, html-страниц и прочей тестовой информации размер которой превышает одну строку текста.

Предупреждение

Тип text является специфическим типом PostgreSQL, поэтому при разработке приложений для работы с разными СУБД, лучше использовать безразмерный varchar для лучшей переносимости бизнес-логики.

Резюме

Все текстовые поля имеют практически одинаковый формат хранения на диске, поэтому разницы в скорости обработки полей с разными текстовыми типами практически нет. А поля с ограничением по длине обрабатываются даже чуть дольше, чем поля неограниченной длины.

Для хранения строк довольно комфортным выбором будет тип varchar без ограничения по длине (если нет жесткого условия, которое не в коем случае нельзя нарушить). Тип char имеет ряд специфических особенностей, которые в большинстве случаев будут только мешать при работе с базой данных. Тип text является специфическим для PostrgeSQL и не имеет никаких преимуществ/недостатком перед типом varchar без ограничения по длине.

Дополнительные материалы

PostgreSQL Documentation: Character Types

PostgreSQL Documentation: TOAST

comments powered by Disqus