Символьные типы

8.3. Символьные типы

Table 8-4. Символьные типы

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

Таблица Table 8-4 показывает наиболее часто используемые символьные типы, доступные в PostgreSQL.

Стандарт SQL определяет два первичных символьных типа: character varying(n) и character(n), где n является положительным целым числом. Оба эти типа могут хранить строки длиной до n символов (не байт). Попытка сохранить строку длиннее приведёт к ошибке, если только избыточные символы не являются пробелами, в этом случае строка будет усечена до максимальной длины. (Это до некоторой степени причудливое исключение требуемое стандартом SQL.) Если сохраняемая строка короче, чем заданная длина, то значение типа character будет дополнено пробелами, а значение типа character varying будет сохранено просто как более короткая строка.

Если осуществляется явное приведение значения типа character varying(n) или character(n), то значения с большей длиной будут усечены до n символов без возникновения ошибки. (Это также требуется стандартом SQL.)

Нотации varchar(n) и char(n) являются псевдонимами соответственно для character varying(n) и character(n). Указание character без длины эквивалентно character(1). Если character varying используется без указания длины, то допускаются строки любой длины. Это является расширением PostgreSQL.

В дополнение, PostgreSQL предоставляет тип text, который хранит строки любой длины. Хотя тип text отсутствует в стандарте SQL, некоторые другие SQL СУБД также поддерживают его.

Значения типа character физически дополняются пробелами до заданной длины n и хранятся и отображаются в этом виде. Однако, эти дополнительные пробелы считаются семантически неважными. При сравнении двух значений типа character конечные пробелы игнорируются и они будут удалены при преобразовании значений типа character в любые другие строковые типы. Обратите внимание, что конечные пробелы являются семантически значимыми в значениях character varying и text и при использовании шаблонов, например таких как регулярные выражения LIKE.

Для хранения короткой строки (до 126 байт) необходим 1 байт плюс сама строка, которая включает в случае типа character заполняющие пробелы. Более длинным строкам необходимо дополнительно 4 байта вместо 1. Длинные строки автоматически сжимаются системой, так что физически места на диске может потребоваться меньше. Очень длинные значения также хранятся в фоновых таблицах, и таким образом они не влияют на высокоскоростной доступ к коротким значениям в колоноках. В любом случае, наибольшая по длине строка, которая может быть сохранена, будет около 1Гбайта. (Максимальное значение, которое можно указать для n в описании типа будет меньше. Изменять значение длины неудобно, потому что в кодировках, которые работают с мультибайтными символами количество символов и количество занимаемых ими байт может существенно различаться. Если вы желаете хранить строки без ограничения длины, то используйте тип text или тип character varying без указания длины, вместо того, чтобы точно указывать предельную длину).

Tip: С точки зрения производительности, разницы при работе СУБД с этими тремя типами нет, кроме увеличения размера хранения, при использовании типа с заполнением пробелами и несколькими дополнительными циклами процессора для проверки длины, когда происходит сохранение колонки ограниченной длины. Хотя в некоторых СУБД работа с типом character(n) более производительна, но в PostgreSQL этого нет; фактически character(n) обычно самый медленный из трёх, из-за дополнительных затрат на его хранение. В большинстве случаев вместо этого типа можно использовать типы text или character varying. instead.

Информацию о синтаксисе строковых литералов смотрите в Section 4.1.2.1, а информацию о доступных операторах и функциях смотрите в Chapter 9. Набор символов базы данных определяет тот набор символов, который используется для хранения текстовых значений; больше информации о поддержке наборов символов можно найти в Section 22.3.

Example 8-1. Использование символьных типов

CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; -- (1)
  a   | char_length
------+-------------
 ok   |           2

CREATE TABLE test2 (b varchar(5));
INSERT INTO test2 VALUES ('ok');
INSERT INTO test2 VALUES ('good      ');
INSERT INTO test2 VALUES ('too long');
ERROR:  value too long for type character varying(5)
INSERT INTO test2 VALUES ('too long'::varchar(5)); -- явное усечение
SELECT b, char_length(b) FROM test2;
   b   | char_length
-------+-------------
 ok    |           2
 good  |           5
 too l |           5
(1)
О функции The char_length рассказывается в Section 9.4.

В PostgreSQL существует два других символьных типа с фиксированной длиной, о которых можно прочесть в Table 8-5. Тип name существует только для хранения идентификаторов во внутренних системных каталогах и не задумывался для использования обычными пользователями. Его длина в настоящий момент определена в 64 байта (63 обычных символа плюс символ окончания строки), но фактически указывается с помощью использования константы NAMEDATALEN в исходных текстах на C. Эта длина устанавливается в момент компиляции (и таким образом может меняться в специальных случаях); данное значение максимальной длины по умолчанию может быть изменено в будущих версиях. Тип "char" (обратите внимание на кавычки) отличается от char(1) тем, что для хранения его значений используется только один байт. Это тип для внутреннего использования в системных каталогах в качестве упрощённого типа перечисления.

Table 8-5. Специальные символьные типы

ИмяРазмер храненияОписание
"char"1 байтоднобайтный внутренний тип
name64 байтавнутренний тип для имён объектов

Back to top

(С) Виктор Вислобоков, 2008-2023