Table 8.4. 字符类型
| 名字 | 描述 |
|---|---|
character varying(, varchar( |
有长度限制的变长 |
character(, char( |
定长,空白填充 |
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)n 必须大于 0,且不能 超过 10485760。character 若不带长度说明则等同于 character(1)。如果 character varying 不带长度说明,则该类型接受任意长度的字符串。这是 PostgreSQL 的扩展。
此外,PostgreSQL 还提供 text 类型,用于存储任意长度的字符串。虽然 text 类型不在 SQL 标准中, 但其他若干 SQL 数据库管理系统也提供了它。
character 类型的值在物理存储时会在右侧用空格填充到 指定宽度 n,并且也会按这种形式显示。 但是,在比较两个 character 值时,尾随空格在语义上 被视为不重要并会被忽略。在空白字符有区分意义的排序规则中,这种 行为可能产生意外结果;例如, SELECT 'a '::CHAR(2) collate "C" < E'a\n'::CHAR(2) 会返回真,即使 C 区域设置认为空格大于换行符。把 character 值转换为其他字符串类型之一时,尾随空格会 被移除。请注意,在 character varying 和 text 值中,以及进行模式匹配(即 LIKE 和正则表达式)时,尾随空格 在语义上是有意义的。
可以存储在这些数据类型中的字符由数据库字符集确定,该数据库字符集在创建数据库时选择。无论特定的字符集是什么,都无法存储代码为零的字符(有时称为NUL)。有关更多信息,请参阅Section 23.3。
短字符串(最长 126 字节)的存储需求是 1 个字节,再加上实际 字符串本身;对 character 而言,这其中还包括填充的 空格。更长的字符串则需要 4 个字节的额外开销,而不是 1 个字节。 长字符串会被系统自动压缩,因此在磁盘上的实际占用可能更小。 非常长的值还会被存储在后台表中,以免影响对较短列值的快速访问。 无论如何,可存储的最长字符串大约为 1 GB。(数据类型声明中 n 允许的最大值比这还小。更改这个限制 并没有意义,因为在多字节字符编码下,字符数和字节数可能差异很大。 如果你想存储没有明确上限的长字符串,应使用 text 或未指定长度的 character varying,而不是随意给出 一个长度上限。)
这三种类型之间没有性能差别,除了使用空白填充类型时会占用更多存储 空间,以及在写入带长度约束的列时需要少量额外 CPU 周期来检查长度。 虽然在某些其他数据库系统中,character( 可能有一定性能优势,但在 PostgreSQL 中并不存在这种优势。事实上,由于额外的存储开销, n)character( 通常反而是三者中最慢的。 大多数情况下,应优先使用 n)text 或 character varying。
关于字符串常量的语法,请参见 Section 4.1.2.1;关于可用的操作符和函数, 请参见 Chapter 9。
Example 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),因为它只使用 1 个字节存储,因此只能保存 单个 ASCII 字符。它在系统目录中被用作一种简单的枚举类型。
Table 8.5. 特殊字符类型
| 名字 | 存储尺寸 | 描述 |
|---|---|---|
"char" |
1字节 | 单字节内部类型 |
name |
64字节 | 用于对象名的内部类型 |
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。