受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

8.3. 字符类型 #

Table 8.4. 字符类型

名字 描述
character varying(n), varchar(n) 有长度限制的变长
character(n), char(n), bpchar(n) 定长,空白填充
bpchar 无限长度的变长,忽略尾随空白
text 无限长度的变长

Table 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 数据库管理系统也提供了它。textPostgreSQL 的原生字符串数据类型, 因为大多数对字符串进行操作的内置函数都声明为接受或返回 text,而不是 character varying。 在很多场景下,character varying 的行为就像是建立在 text 之上的一个

类型名 varcharcharacter varying 的 别名,而 bpchar(带长度说明时)和 charcharacter 的别名。varcharchar 这两个别名由 SQL 标准定义; bpchar 则是 PostgreSQL 的扩展。

如果指定了长度,n 必须大于 0,且不能 超过 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) 会返回真,即使 C 区域设置认为空格大于换行符。把 character 值转换为其他字符串类型之一时,尾随空格会 被移除。请注意,在 character varyingtext 值中,以及进行模式匹配(即 LIKE 和正则表达式)时,尾随空格 在语义上是有意义的

可以存储在这些数据类型中的字符由数据库字符集确定,该数据库字符集在创建数据库时选择。无论特定的字符集是什么,都无法存储代码为零的字符(有时称为NUL)。有关更多信息,请参阅Section 23.3

短字符串(最长 126 字节)的存储需求是 1 个字节,再加上实际 字符串本身;对 character 而言,这其中还包括填充的 空格。更长的字符串则需要 4 个字节的额外开销,而不是 1 个字节。 长字符串会被系统自动压缩,因此在磁盘上的实际占用可能更小。 非常长的值还会被存储在后台表中,以免影响对较短列值的快速访问。 无论如何,可存储的最长字符串大约为 1 GB。(数据类型声明中 n 允许的最大值比这还小。更改这个限制 并没有意义,因为在多字节字符编码下,字符数和字节数可能差异很大。 如果你想存储没有明确上限的长字符串,应使用 text 或未指定长度的 character varying,而不是随意给出 一个长度上限。)

Tip

这三种类型之间没有性能差别,除了使用空白填充类型时会占用更多存储 空间,以及在写入带长度约束的列时需要少量额外 CPU 周期来检查长度。 虽然在某些其他数据库系统中,character(n) 可能有一定性能优势,但在 PostgreSQL 中并不存在这种优势。事实上,由于额外的存储开销, character(n) 通常反而是三者中最慢的。 大多数情况下,应优先使用 textcharacter varying

关于字符串常量的语法,请参见 Section 4.1.2.1;关于可用的操作符和函数, 请参见 Chapter 9

Example 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_lengthSection 9.4中讨论。


PostgreSQL 中还有两种固定长度字符类型, 如 Table 8.5 所示。它们 并非供一般用途使用,而仅用于内部系统目录。name 类型用于存储标识符。它的长度目前定义为 64 字节 (63 个可用字符加结束符),但在 C 源代码中 应使用常量 NAMEDATALEN 来引用。这个长度是在 编译时设定的(因此可以针对特殊用途调整);默认最大长度在未来 版本中可能会变化。类型 "char"(注意带引号)不同于 char(1),因为它只使用 1 个字节存储,因此只能保存 单个 ASCII 字符。它在系统目录中被用作一种简单的枚举类型。

Table 8.5. 特殊字符类型

名字 存储尺寸 描述
"char" 1字节 单字节内部类型
name 64字节 用于对象名的内部类型

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。