pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
表 3.4. 字符类型
| 类型名 | 描述 |
|---|---|
character(, char( |
定长,空白填充 |
character varying(, varchar( |
有长度限制的变长 |
text |
无限长度的变长 |
SQL 定义了两种主要的字符类型: character( 和 n)character varying(,其中 n)n 是一个正整数。这两种类型最多都能存储长度为 n 个字符的字符串。试图把更长的字符串存入这些类型的列将导致错误,除非超出的字符全都是空格——此时字符串会被截断到最大长度。(这一多少有些奇怪的例外是 SQL 标准要求的。)如果要存储的串比声明的长度短,character 类型的值会以空格填充;character varying 类型的值则直接存储较短的串。
在 PostgreSQL 7.2 之前,过长的字符串会被静默截断而不引发错误。
记法 char( 和 n)varchar( 分别是 n)character( 和 n)character varying( 的别名。 不带长度说明符的 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 节;关于可用的运算符和函数,参见 第 4 章。
例 3.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)
SELECT b, char_length(b) FROM test2;
b | char_length
-------+-------------
ok | 2
good | 5
PostgreSQL 中还有另外两种定长字符类型。name 类型仅用于存储内部系统目录的名称,并非供普通用户使用。其长度目前定义为 32 字节(31 个可用字符加终止符),但应使用宏 NAMEDATALEN 引用。该长度在编译时设定(因此可为特殊用途调整);默认的最大长度在未来的版本中可能改变。类型 "char"(注意引号)与 char(1) 的不同之处在于它只使用一个字节的存储。它在系统目录内部被用作一种简易的枚举类型。
表 3.5. 特殊字符类型
| 类型名 | 存储尺寸 | 描述 |
|---|---|---|
| "char" | 1字节 | 单字符内部类型 |
| name | 32字节 | 31 字符内部类型 |
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。