Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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) 返回 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 字节 对象名称的内部类型