↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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
历史版本。 PostgreSQL 7.3 已结束支持。 请参阅 当前版本手册.

5.3. 字符类型 #

表 5.4. 字符类型

类型名描述
character varying(n), varchar(n)有长度限制的变长
character(n), char(n)定长,空白填充
text无限长度的变长

表 5.4显示了在PostgreSQL里可用的一般用途的字符类型。

SQL 定义了两种主要字符类型:character varying(n) 和 character(n),其中 n 是正整数。这两种类型都可以存储长度最多为 n 个字符的字符串。试图把更长的字符串存入这些类型的列时会报错,除非超出的字符全部都是空格,在这种情况下字符串会被截断到最大长度。(这一多少有些奇怪的例外是 SQL 标准要求的。)如果要存储的字符串短于声明长度,character 类型的值会用空格填充;character varying 类型则只是简单地存储较短的字符串。

注意

如果显式把一个值转换为 character varying(n) 或 character(n),那么超长的值会被截断为 n 个字符而不会报错。(这同样是 SQL 标准要求的。)

注意

在 PostgreSQL 7.2 之前,无论显式还是隐式转换的上下文中,过长的字符串总是被截断而不报错。

记法 varchar(n) 和 char(n) 分别是 character varying(n) 和 character(n) 的别名。不带长度说明符的 character 等价于 character(1);不带长度说明符的 character varying 则接受任意大小的字符串。后者是 PostgreSQL 的一个扩展。

此外,PostgreSQL 还支持更通用的 text 类型,它可以存储任意长度的字符串。与 character varying 不同,text 不要求为字符串大小显式声明上限。尽管 text 类型不在 SQL 标准中,许多其他 RDBMS 软件包也有它。

这些类型的数据的存储需求是 4 字节加实际字符串,对于 character 再加填充。长字符串会被系统自动压缩,因此磁盘上的物理需求可能更少。长值还会存储在后台表中,这样它们不会妨碍对较短列值的快速访问。在任何情况下,可存储的最长字符串约为 1 GB。(数据类型声明中允许的 n 最大值比这还小。更改这个限制并没有意义,因为在多字节字符编码下,字符数和字节数可能差异很大。如果你想存储没有明确上限的长字符串,应使用 text 或未指定长度的 character varying,而不是随意给出一个长度上限。)

提示

除了使用空格填充的类型会增加存储尺寸之外,这三种类型没有性能差异。

关于字符串字面量的语法,参见第 1.1.2.1 节;关于可用的运算符和函数,参见第 6 章。

例 5.1. 使用字符类型

CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; -- (1)
  a   | char_length
------+-------------
 ok   |           4

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在第 6.4 节中讨论。


PostgreSQL 中还有另外两种定长字符类型,如表 5.5所示。name 类型仅用于存储内部系统目录的名称,并非供普通用户使用。其长度目前定义为 64 字节(63 个可用字符加终止符),但应使用常量 NAMEDATALEN 引用。该长度在编译时设定(因此可为特殊用途调整);默认的最大长度在未来的版本中可能改变。类型 "char"(注意引号)与 char(1) 的不同之处在于它只使用一个字节的存储。它在系统目录内部被用作一种简易的枚举类型。

表 5.5. 特殊字符类型

类型名存储描述
"char"1字节单字符内部类型
name64字节63 字符内部类型

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.