названиеописание
character varying(n), varchar(n)variable-length with limit
character(n), char(n)fixed-length, blank padded
textvariable unlimited length

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

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

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

Кроме того, PostgreSQL предоставляет textтип, в котором хранятся строки любой длины. Хотя этот тип textне входит в стандарт SQL , он также есть в нескольких других системах управления базами данных SQL.

Значения типа characterфизически дополняются пробелами до указанной ширины nи сохраняются и отображаются таким образом. Однако конечные пробелы рассматриваются как семантически незначимые и игнорируются при сравнении двух значений типа character. В сопоставлениях, где пробелы значительны, такое поведение может привести к неожиданным результатам; например SELECT 'a '::CHAR(2) collate "C" < E'a\n'::CHAR(2), возвращает true, даже если Cлокаль считает, что пробел больше, чем новая строка. Конечные пробелы удаляются при преобразовании characterзначения в один из других типов строк. Обратите внимание, что конечные пробелы семантически значимы в значенияхcharacter varying и text, а также при использовании сопоставления с образцом, то есть LIKEи регулярных выражениях.

Символы, которые могут храниться в любом из этих типов данных, определяются набором символов базы данных, который выбирается при создании базы данных. Независимо от конкретного набора символов, символ с нулевым кодом (иногда называемый NUL) не может быть сохранен.

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

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)); -- explicit truncation
SELECT b, char_length(b) FROM test2;

   b   | char_length
-------+-------------
 ok    |           2
 good  |           5
 too l |           5

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

названиеразмерописание
"char"1 bytesingle-byte internal type
name64 bytesinternal type for object names