8.3. 字符类型 #
表 8.4. 字符类型
| 名字 | 描述 |
|---|---|
character varying(, varchar( | 有长度限制的变长 |
character(, char( | 定长,空白填充 |
text | 无限长度的变长 |
表 8.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 类型,用于存储任意长度的字符串。虽然
text 类型不在 SQL 标准中,但其他若干 SQL 数据库管理系统也提供了它。
这些类型的数据的存储需求是 4 个字节加上实际的字符串本身,对 character 而言,还要加上填充的空格。长字符串会被系统自动压缩,因此在磁盘上的实际占用可能更小。非常长的值还会被存储在后台表中,以免影响对较短列值的快速访问。无论如何,可存储的最长字符串大约为 1 GB。(数据类型声明中
n 允许的最大值比这还小。更改这个限制并没有意义,因为在多字节字符编码下,字符数和字节数可能差异很大。如果你想存储没有明确上限的长字符串,应使用 text
或未指定长度的 character 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 | 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 PostgreSQL 中还有两种固定长度字符类型,如表 8.5所示。name
类型仅用于在内部系统目录中存储标识符,并非供一般用户使用。它的长度目前定义为 64 字节(63 个可用字符加结束符),但应使用常量
NAMEDATALEN 来引用。这个长度是在编译时设定的(因此可以针对特殊用途调整);默认最大长度在未来版本中可能会变化。类型 "char"(注意带引号)不同于 char(1),因为它只使用
1 个字节存储。它在系统目录中被用作一种简单的枚举类型。
表 8.5. 特殊字符类型
| 名字 | 存储尺寸 | 描述 |
|---|---|---|
"char" | 1字节 | 单字节内部类型 |
name | 64字节 | 用于对象名的内部类型 |