8.3. Типы символов#

8.3. Типы символов

8.3. Типы символов #

Таблица 8.4. Типы символов

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

Таблица 8.4 показывает доступные в Tantor SE-1C общие типы символов.

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

Кроме того, Tantor SE-1C предоставляет тип text, который хранит строки любой длины. Хотя тип text не является стандартом SQL, он также присутствует в нескольких других системах управления базами данных SQL. text является родным строковым типом данных Tantor SE-1C, так как большинство встроенных функций, работающих со строками, объявлены для приема или возврата text, а не character varying. Для многих целей character varying действует так, как если бы это был домен над text.

Имя типа varchar является псевдонимом для character varying, в то время как bpchar (с указанием длины) и char являются псевдонимами для character. Псевдонимы varchar и char определены в стандарте SQL; bpchar является расширением Tantor SE-1C.

Если указано, длина n должна быть больше нуля и не может превышать 10,485,760. Если используется 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 и регулярных выражений.

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

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

Подсказка

Между этими тремя типами нет разницы в производительности, за исключением увеличенного объема хранения при использовании типа с пробелами, а также нескольких дополнительных тактов процессора для проверки длины при сохранении в ограниченный по длине столбец. В то время как тип character(n) имеет преимущества в производительности в некоторых других системах управления базами данных, в Tantor SE-1Cтакого преимущества нет; на самом деле тип 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');
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

(1)

Функция char_length описана в Раздел 9.4.


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

Таблица 8.5. Типы специальных символов

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