Таблица 2.5.4. Символьные типы
| Имя | Описание |
|---|---|
character varying(, varchar( | переменная длина с ограничением |
character(, char(, bpchar( | фиксированная длина, дополненная пробелами |
bpchar | неограниченная переменная длина с удалением пробелов |
текст | неограниченная переменная длина |
Таблица 2.5.4 приведены символьные типы общего назначения, доступные в Digital Q.DataBase.
SQL определяет два основных символьных типа:
character varying( и
n)character(, где n)n
является положительным целым числом. Оба этих типа могут хранить строки длиной до
n символов (не байтов). Попытка сохранить более длинную строку в столбец этих типов приведет к ошибке, за исключением случаев, когда все лишние символы являются пробелами — в этом случае строка будет усечена до максимальной длины. (Данное довольно
необычное исключение диктуется SQL
стандартом.)
Однако, если значение явно приводится к типу character
varying( или
n)character(, то значение, превышающее допустимую длину, будет усечено до n)n символов без
генерации ошибки. (Это также требуется
SQL стандартом.)
Если сохраняемая строка короче объявленной
длины, значения типа character будут дополнены пробелами;
значения типа character varying будут просто хранить
короткую
строку.
Кроме того, Digital Q.DataBase поддерживает
текст тип, предназначенный для хранения строк произвольной длины.
Хотя текст тип не входит в
SQL стандарт, однако он поддерживается и в некоторых других системах управления базами данных SQL.
текст является Digital Q.DataBaseсобственный строковый тип данных, в котором большинство встроенных функций обработки строк определены как принимающие или возвращающие текст не character
varying. Во многих случаях character varying
функционирует так же, как домен
над текст.
Имя типа varchar является псевдонимом для character
varying, в то время как bpchar (со спецификатором длины) и
char являются псевдонимами для character. Данные
varchar и char псевдонимы определены в
SQL стандарте; bpchar является
Digital Q.DataBase расширением.
Если указан, параметр длины 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 и текст значениях, а также
при сопоставлении с образцом, то есть в операторе LIKE и
регулярных выражениях.
Набор символов, которые могут храниться в любом из этих типов данных, определяется кодировкой базы данных, выбираемой при её создании. Независимо от конкретной кодировки, сохранение символа с кодом ноль (иногда называемого NUL) не допускается. Дополнительная информация приведена в Раздел 3.8.3.
Объем памяти, необходимый для хранения короткой строки (до 126 байт), составляет 1 байт
плюс сама строка, включая дополнение пробелами для типа
character. Для более длинных строк объем служебных данных составляет 4 байта вместо 1. Длинные строки сжимаются системой автоматически, поэтому фактический объем занимаемого дискового пространства может быть меньше. Очень длинные значения также хранятся в фоновых таблицах, чтобы они не препятствовали быстрому доступу к более коротким значениям столбцов. В любом случае максимально возможная длина сохраняемой символьной строки составляет около 1 ГБ. (Максимальное значение, допустимое для n в объявлении типа данных, меньше этой величины. Менять этот порядок было бы нецелесообразно, поскольку в многобайтовых кодировках количество символов и байтов может существенно различаться. Если требуется
хранить длинные строки без конкретного верхнего предела, используйте
текст или character varying без
указателя длины, вместо того чтобы устанавливать произвольное ограничение.)
Между этими тремя типами нет разницы в производительности, за исключением повышенного расхода дискового пространства при использовании типа с дополнением пробелами и нескольких дополнительных циклов процессора для проверки длины при записи в столбец с ограничением по длине. Хотя
character( имеет преимущества в производительности в некоторых других системах баз данных, в
Digital Q.DataBase; фактически
n)character( обычно является самым медленным из трех типов из-за дополнительных затрат на хранение данных. В большинстве ситуаций
n)текст или character varying следует использовать
вместо этого.
Обратитесь к Раздел 2.1.1.2.1 для получения информации о синтаксисе строковых литералов, а также к Глава 2.6 для получения информации о доступных операторах и функциях.
Пример 2.5.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
Функция |
В Digital Q.DataBase существуют два других символьных типа фиксированной длины, приведенные в Таблица 2.5.5.
Они не предназначены для общего использования и применяются только
во внутренних системных каталогах.
Тип name используется для хранения идентификаторов. Его
длина в настоящее время составляет 64 байта (63 доступных символа плюс
терминатор), но на неё следует ссылаться через константу
NAMEDATALEN в C в исходном коде.
Длина устанавливается при компиляции (и,
следовательно, может быть изменена для особых задач); максимальная длина по умолчанию может измениться в будущих версиях. Тип "char"
(в кавычках) отличается от типа char(1) тем, что он занимает всего один байт и может хранить только один символ ASCII. Используется в системных каталогах как упрощенный перечислимый тип.
Таблица 2.5.5. Специальные символьные типы
| Имя | Размер | Описание |
|---|---|---|
"char" | 1 байт | внутренний однобайтовый тип |
name | 64 байта | внутренний тип для имен объектов |