8.3. 字符类型

表 8.4. 字符类型

NameDescription
character varying(n) , varchar(n)有限制的可变长度
character(n) , char(n)定长,空白填充
text可变的无限长度

Table 8.4显示了 PostgreSQL 中可用的通用字符类型。

SQL 定义了两种主要字符类型:character varying(n)character(n),其中* n 是正整数。这两种类型都可以存储长度不超过 n *个字符(不是字节)的字符串。尝试将更长的字符串存储到这些类型的列中将导致错误,除非多余的字符全部为空格,在这种情况下,字符串将被截断为最大长度。 (SQL 标准要求此异常怪异的异常.)如果要存储的字符串短于声明的长度,则character类型的值将用空格填充;否则,将使用空格填充。 character varying类型的值将仅存储较短的字符串。

如果将一个值显式地转换为character varying(n)character(n),则超长值将被截断为* n *个字符而不会引发错误。 (这也是 SQL 标准所必需的.)

标记varchar(n)char(n)分别是character varying(n)character(n)的别名。没有长度说明符的character等效于character(1)。如果使用character varying而不使用长度说明符,则该类型接受任何大小的字符串。后者是 PostgreSQL 扩展。

另外,PostgreSQL 提供了text类型,该类型存储任何长度的字符串。尽管text类型不在 SQL 标准中,但其他几个 SQL 数据库 Management 系统也有它。

character类型的值在物理上用空格填充到指定的宽度* n ,并以这种方式存储和显示。但是,当比较类型为character的两个值时,尾随空格被视为语义上无关紧要的并且被忽略。在空白很重要的排序规则中,此行为会产生意外的结果;例如SELECT 'a '::CHAR(2) collate "C" < E'a\n'::CHAR(2)返回 true,即使C语言环境认为空格大于换行符也是如此。将character值转换为其他字符串类型之一时,将删除尾部空格。请注意,尾随空格character varyingtext值中在语义上很重要*,并且在使用模式匹配时,即LIKE和正则表达式。

短字符串(最多 126 个字节)的存储要求是 1 个字节加上实际的字符串,其中包括character情况下的空格填充。较长的字符串的开销为 4 个字节,而不是 1 个字节。较长的字符串由系统自动压缩,因此对磁盘的物理需求可能会更少。非常长的值也存储在后台表中,这样它们就不会干扰对较短列值的快速访问。在任何情况下,可以存储的最长字符串约为 1 GB。 (数据类型声明中* n *所允许的最大值小于该值.更改此值将无用,因为使用多字节字符编码时,字符和字节数可能会大不相同.如果需要要存储没有特定上限的长字符串,请使用不带长度说明符的textcharacter varying,而不是设置任意长度限制.)

Tip

这三种类型之间没有性能差异,除了使用空白填充类型时增加的存储空间,以及在存储到受长度限制的列中时需要一些额外的 CPU 周期来检查长度。 character(n)在其他一些数据库系统中具有性能优势,而在 PostgreSQL 中则没有这种优势。实际上character(n)通常是三个中最慢的,因为它会增加存储成本。在大多数情况下,应改用textcharacter varying

有关字符串 Literals 的语法的信息,请参阅Section 4.1.2.1;有关可用运算符和函数的信息,请参阅Chapter 9。数据库字符集确定用于存储文本值的字符集;有关字符集支持的更多信息,请参考Section 23.3

实施例 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

PostgreSQL 中还有其他两种定长字符类型,如Table 8.5所示。 name类型仅在内部系统目录中用于存储标识符,而仅供普通用户使用。当前将其长度定义为 64 个字节(63 个可用字符加终止符),但应在C源代码中使用常量NAMEDATALEN进行引用。该长度是在编译时设置的(因此可以针对特殊用途进行调整);默认最大长度在将来的版本中可能会更改。 "char"类型(请注意引号)与char(1)类型不同,因为它仅使用一个字节的存储空间。在系统目录中内部使用它作为一种简单的枚举类型。

表 8.5. 特殊字符类型

NameStorage SizeDescription
"char"1 byte单字节内部类型
name64 bytes对象名称的内部类型