2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

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

varchar 类型名是 character varying 的别名,而(带有长度说明符的)bpcharcharcharacter 的别名。varcharchar 别名定义在SQL标准中;bpcharPostgreSQL 的扩展。

如果指定了长度 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)都不能存储。有关更多信息,请参阅 第 23.3 节

短字符串(最多 126 字节)的存储需求是 1 字节加上实际字符串,对于 character 类型,这包括了空格填充。更长的字符串有 4 字节的开销而不是 1 字节。长字符串会被系统自动压缩,因此磁盘上的实际需求可能会更少。非常长的值也会存储在后台表中,这样它们就不会干扰对较短列值的快速访问。无论哪种情况,可以存储的最长字符字符串大约是 1 GB。(数据类型声明中允许的 n 的最大值小于这个值。更改这个值没有意义,因为使用多字节字符编码时,字符数和字节数可能差异很大。如果你希望存储没有特定上限的长字符串,请使用 text 或不带长度说明符的 character 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)

char_length 函数在 第 9.4 节 中进行了讨论。


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

表 8.5. 特殊字符类型

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

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。