8.3. Символьные типы #
Таблица 8.4. Символьные типы
Имя | Описание |
---|---|
character varying( , varchar( | строка ограниченной переменной длины |
character( , char( , bpchar( | строка фиксированной длины, дополненная пробелами |
bpchar | строка неограниченной переменной длины с удалением пробелов |
text | строка неограниченной переменной длины |
В Таблице 8.4 перечислены символьные типы общего назначения, доступные в PostgreSQL.
SQL определяет два основных символьных типа: character varying(
и n
)character(
, где n
)n
— положительное число. Оба эти типа могут хранить текстовые строки длиной до n
символов (не байт). Попытка сохранить в столбце такого типа более длинную строку приведёт к ошибке, если только все лишние символы не являются пробелами (тогда они будут усечены до максимально допустимой длины). (Это несколько странное исключение продиктовано стандартом SQL.) Однако если явно привести значение к типу character varying(
или n
)character(
, то слишком длинное значение будет усечено до n
)n
символов без возникновения ошибки. (Это также является требованием стандарта SQL.) Если длина сохраняемой строки оказывается меньше объявленной, значения типа character
будут дополнятся пробелами, а тип character varying
просто сохранит короткую строку.
Помимо этого, PostgreSQL предлагает тип text
, в котором можно хранить строки произвольной длины. Хотя тип text
не описан в стандарте SQL, его поддерживают и некоторые другие СУБД SQL. Тип text
— это встроенный строковый тип данных PostgreSQL, и большинство встроенных функций, работающих со строками, объявляются принимающими или возвращающими text
, а не character varying
. Во многих случаях character varying
действует так, как если бы это был домен поверх text
.
Имя типа varchar
является псевдонимом для character varying
, а char
и bpchar
(с указанием длины) — для character
. Псевдонимы varchar
и char
определены в стандарте SQL, но bpchar
— это расширение PostgreSQL.
Если n
задано, оно должно быть больше нуля и меньше или равно 10485760. При использовании типов character varying
(или varchar
) без указания длины принимаются строки любой длины. При использовании типа bpchar
без указания длины также принимаются строки любой длины, но конечные пробелы семантически не учитываются. Записи character
(или char
) без указания длины соответствует character(1)
.
Значения типа character
физически дополняются пробелами до n
символов и хранятся, а затем отображаются в таком виде. Однако при сравнении двух значений типа character
дополняющие пробелы считаются незначащими и игнорируются. С правилами сортировки, где пробельные символы являются значащими, это поведение может приводить к неожиданным результатам, например SELECT 'a '::CHAR(2) collate "C" < E'a\n'::CHAR(2)
вернёт true (условие будет истинным), хотя в локали C символ пробела считается больше символа новой строки. При приведении значения character
к другому символьному типу дополняющие пробелы отбрасываются. Заметьте, что эти пробелы несут смысловую нагрузку в типах character varying
и text
и в проверках по шаблонам, то есть в LIKE
и регулярных выражениях.
Какие именно символы можно сохранить в этих типах данных, зависит от того, какой набор символов был выбран при создании базы данных. Однако символ с кодом 0 (иногда называемый NUL) сохранить нельзя, вне зависимости от выбранного набора символов. За подробностями обратитесь к Разделу 24.3.
Для хранения короткой строки (до 126 байт) требуется дополнительный 1 байт плюс размер самой строки, включая дополняющие пробелы для типа character
. Для строк длиннее требуется не 1, а 4 дополнительных байта. Система может автоматически сжимать длинные строки, так что физический размер на диске может быть меньше. Очень длинные текстовые строки переносятся в отдельные таблицы, чтобы они не замедляли работу с другими столбцами. В любом случае максимально возможный размер строки составляет около 1 ГБ. (Допустимое значение n
в объявлении типа данных меньше этого числа. Это объясняется тем, что в зависимости от кодировки каждый символ может занимать несколько байт. Если вы желаете сохранять строки без определённого предела длины, используйте типы text
или character varying
без указания длины, а не задавайте какое-либо большое максимальное значение.)
Подсказка
По быстродействию эти три типа практически не отличаются друг от друга, не считая большего размера хранения для типа с дополняющими пробелами и нескольких машинных операций для проверки длины при сохранении строк в столбце с ограниченной длиной. Хотя в некоторых СУБД тип character(
работает быстрее других, в PostgreSQL это не так; на деле n
)character(
обычно оказывается медленнее остальных типов из-за большего размера данных и более медленной сортировки. В большинстве случаев вместо него лучше применять n
)text
или character varying
.
За информацией о синтаксисе строковых констант обратитесь к Подразделу 4.1.2.1, а об имеющихся операторах и функциях вы можете узнать в Главе 9.
Пример 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');ОШИБКА: значение не умещается в тип 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
Функция |
В PostgreSQL есть ещё два символьных типа фиксированной длины, приведённые в Таблице 8.5. Они предназначены не для широкого применения, а для использования только во внутренних системных каталогах. Тип name
создан для хранения идентификаторов. В настоящее время его длина составляет 64 байта (63 ASCII-символа плюс завершающий ноль), но в исходном коде C
она задаётся константой NAMEDATALEN
. Эта константа определяется во время компиляции (и её можно менять в особых случаях), а кроме того, максимальная длина по умолчанию может быть увеличена в следующих версиях. Тип "char"
(обратите внимание на кавычки) отличается от char(1)
тем, что он занимает только один байт хранилища и поэтому может хранить только один ASCII-символ. Он используется в системных каталогах для простых перечислений.
Таблица 8.5. Специальные символьные типы
Имя | Размер | Описание |
---|---|---|
"char" | 1 байт | внутренний однобайтный тип |
name | 64 байта | внутренний тип для имён объектов |