Skip to content

8.3. 字符类型#

表 8.4. 字符类型

名称描述
character varying(n), varchar(n)可变长度,有长度限制
character(n), char(n), bpchar(n)固定长度,空格填充
bpchar可变长度,无限制,空格修剪
text可变长度,无限制

表 8.4显示了PostgreSQL中可用的通用字符类型。

SQL定义了两种主要字符类型:character varying(*n*)character(*n*),其中*n是正整数。这两种类型都可以存储长度最长为n个字符(不是字节)的字符串。尝试将更长的字符串存储到这些类型的列中会导致错误,除非多余的字符都是空格,在这种情况下,字符串将被截断为最大长度。(SQL标准要求此类有些奇怪的例外情况。)但是,如果将值显式强制转换为character varying(*n*)character(*n*),则超长值将被截断为n*个字符,而不会引发错误。(SQL标准也要求这样做。)如果要存储的字符串短于声明的长度,character类型的将用空格填充;character varying类型的将简单地存储较短的字符串。

此外,PostgreSQL提供text类型,用于存储任意长度的字符串。虽然text类型不在SQL标准中,但其他一些 SQL 数据库管理系统也有此类型。text是PostgreSQL的原生字符串数据类型,因为大多数对字符串进行操作的内置函数都声明为获取或返回text,而不是character varying。对于许多目的,character varying的作用就像text上的

类型名称varcharcharacter varying的别名,而bpchar(带有长度说明符)和charcharacter的别名。varcharchar别名在SQL标准中定义;bpchar是PostgreSQL扩展。

如果指定,长度*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 varyingtext值中以及在使用模式匹配(即LIKE和正则表达式)时具有*语义意义。

可以在这些数据类型中存储的字符由数据库字符集决定,该字符集在创建数据库时选择。无论具体字符集如何,都不能存储代码为零的字符(有时称为 NUL)。有关更多信息,请参阅第 24.3 节

短字符串(最多 126 个字节)的存储要求是 1 个字节加上实际字符串,在character的情况下包括空格填充。较长的字符串有 4 个字节的开销,而不是 1 个字节。长字符串由系统自动压缩,因此磁盘上的物理要求可能更少。非常长的值也存储在后台表中,以便它们不会干扰对较短列值的快速访问。在任何情况下,可以存储的最长可能的字符串大约为 1 GB。(数据类型声明中*n*允许的最大值小于该值。更改此值没有用,因为使用多字节字符编码时,字符数和字节数可能非常不同。如果您希望存储没有特定上限的长字符串,请使用textcharacter varying而不要长度说明符,而不是制定一个任意的长度限制。)

提示

除使用空白填充类型时存储空间增加以及在存储到长度受限的列时检查长度需要一些额外的 CPU 周期外,这三种类型之间没有性能差异。虽然在一些其他数据库系统中character(*n*)具有性能优势,但在PostgreSQL中没有这种优势;事实上character(*n*)通常是三种类型中最慢的,因为它的存储成本较高。在大多数情况下,应改用textcharacter 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)

第 9.4 节 中讨论了 char_length 函数。

PostgreSQL中还有两种其他固定长度字符类型,如表 8.5中所示。这些类型并非用于通用目的,仅用于内部系统目录。name类型用于存储标识符。它的长度当前定义为 64 字节(63 个可用字符加终止符),但应使用C源代码中的常量NAMEDATALEN进行引用。长度在编译时设置(因此可针对特殊用途进行调整);默认最大长度可能会在未来版本中更改。类型"char"(注意引号)不同于char(1),因为它仅使用一个字节的存储空间,因此只能存储单个 ASCII 字符。它在系统目录中用作简单的枚举类型。

表 8.5. 特殊字符类型

名称存储大小描述
"char"1 字节单字节内部类型
name64 字节对象名称的内部类型