название | описание |
---|---|
character varying(n) , varchar(n) | variable-length with limit |
character(n) , char(n) | fixed-length, blank padded |
text | variable unlimited length |
SQL определяет два основных типа символов: и , где — положительное целое число. Оба этих типа могут хранить строки длиной до символов (не байтов). Попытка сохранить более длинную строку в столбец этих типов приведет к ошибке, если только лишние символы не являются пробелами, и в этом случае строка будет усечена до максимальной длины. (Это несколько странное исключение требуется стандартом SQL .) Если сохраняемая строка короче объявленной длины, значения типа будут дополнены пробелами; значения типа будут просто хранить более короткую строку.character varying(n)character(n)nncharactercharacter varying
Если явно привести значение к или , то слишком длинное значение будет усечено до символов без возникновения ошибки. (Это также требуется стандартом SQL .)character varying(n)character(n)n
Обозначения и являются псевдонимами для и соответственно. без спецификатора длины эквивалентно . Если используется без спецификатора длины, тип принимает строки любого размера. Последний является расширением PostgreSQL .varchar(n)char(n)character varying(n)character(n)charactercharacter(1)character varying
Кроме того, PostgreSQL предоставляет 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) не может быть сохранен.
Требование к памяти для короткой строки (до 126 байтов) составляет 1 байт плюс фактическая строка, которая включает заполнение пробелом в случае character
. Более длинные строки имеют 4 байта служебных данных вместо 1. Длинные строки автоматически сжимаются системой, поэтому физические требования к диску могут быть меньше. Очень длинные значения также хранятся в фоновых таблицах, чтобы они не мешали быстрому доступу к более коротким значениям столбцов. В любом случае максимально длинная строка символов, которую можно сохранить, составляет около 1 ГБ. (Максимальное значение, которое будет разрешено дляn
в объявлении типа данных меньше. Было бы бесполезно изменять это, потому что при многобайтовых кодировках количество символов и байтов может сильно различаться. Если вы хотите хранить длинные строки без определенного верхнего предела, используйте спецификатор длины text
или character varying
без него, а не придумывайте произвольный предел длины.)
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
В PostgreSQL есть два других типа символов фиксированной длины. Тип name
существует только для хранения идентификаторов во внутренних системных каталогах и не предназначен для использования обычным пользователем. Его длина в настоящее время определена как 64 байта (63 используемых символа плюс терминатор), но на нее следует ссылаться, используя константу NAMEDATALEN
в C
исходном коде. Длина устанавливается во время компиляции (и, следовательно, регулируется для специальных целей); максимальная длина по умолчанию может измениться в будущем выпуске. Тип "char"
(обратите внимание на кавычки) отличается от char(1)
тем, что использует только один байт памяти. Он используется внутри системных каталогов как упрощенный тип перечисления.
название | размер | описание |
---|---|---|
"char" | 1 byte | single-byte internal type |
name | 64 bytes | internal type for object names |
0 комментариев