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