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

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

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

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

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

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

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

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

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

Кроме того, Tantor SE предоставляет тип 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) не может быть сохранен. Дополнительную информацию см. в разделе Раздел 23.3.

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

Подсказка

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

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

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