2024 年 9 月 26 日: PostgreSQL 17 发布!
受支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本: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

类型名称 varcharcharacter varying 的别名,而 bpchar(具有长度说明符)和 charcharacter 的别名。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) 会返回真,即使 C 语言环境会认为空格比换行符更大。在将 character 值转换为其他字符串类型之一时,将删除尾随空格。请注意,尾随空格在 character varyingtext 值中以及在使用模式匹配(即 LIKE 和正则表达式)时在语义上是有意义的。

任何这些数据类型中可以存储的字符由数据库字符集决定,该字符集在创建数据库时选择。与特定字符集无关,带有零代码的字符(有时称为 NUL)无法存储。有关详细信息,请参阅第 23.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)

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


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

表 8.5. 特殊字符类型

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

提交更正内容

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