表 8.4. 字符类型
名称 | 描述 |
---|---|
character varying( , varchar( |
可变长度,带限制 |
character( , char( , bpchar( |
固定长度,用空格填充 |
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 数据库管理系统也具有此类型。text
是 PostgreSQL 的原生字符串数据类型,因为大多数对字符串进行操作的内置函数都被声明为接受或返回 text
而不是 character varying
。在许多情况下,character varying
的作用就像它是 text
上的一个 域。
类型名称 varchar
是 character varying
的别名,而 bpchar
(带有长度说明符)和 char
是 character
的别名。varchar
和 char
别名在SQL标准中定义;bpchar
是 PostgreSQL 的扩展。
如果指定,长度 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 varying
和 text
值以及使用模式匹配(即 LIKE
和正则表达式)时,在语义上是重要的。
可以在这些数据类型中的任何一种中存储的字符由数据库字符集确定,该字符集在创建数据库时选择。无论具体的字符集是什么,都无法存储代码为零的字符(有时称为 NUL)。有关更多信息,请参阅 第 23.3 节。
短字符串(最多 126 个字节)的存储要求是 1 个字节加上实际字符串,其中包括 character
的空格填充。较长的字符串有 4 个字节的开销而不是 1 个字节。系统会自动压缩长字符串,因此磁盘上的物理需求可能会更少。非常长的值也存储在后台表中,这样它们就不会干扰对较短列值的快速访问。无论如何,可以存储的最长字符字符串大约为 1 GB。(数据类型声明中允许的 n
的最大值小于该值。更改此值没有意义,因为使用多字节字符编码时,字符数和字节数可能大不相同。如果您希望存储没有特定上限的长字符串,请使用不带长度说明符的 text
或 character varying
,而不是指定任意长度限制。)
这三种类型之间没有性能差异,除了使用空格填充类型时存储空间增加,以及在存储到长度受限的列中时检查长度需要一些额外的 CPU 周期。虽然 character(
在其他一些数据库系统中具有性能优势,但在 PostgreSQL 中没有这种优势;实际上,n
)character(
通常是这三种类型中最慢的,因为它有额外的存储成本。在大多数情况下,应该使用 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 | 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 中还有两种其他固定长度的字符类型,如表 8.5所示。这些类型不打算用于通用用途,仅用于内部系统目录。 name
类型用于存储标识符。它的长度目前定义为 64 个字节(63 个可用字符加上终止符),但应使用 C
源代码中的常量 NAMEDATALEN
引用。长度在编译时设置(因此可以针对特殊用途进行调整);默认最大长度可能会在未来的版本中更改。"char"
类型(请注意引号)与 char(1)
不同,因为它只使用一个字节的存储空间,因此只能存储单个 ASCII 字符。它在系统目录中用作简单的枚举类型。
表 8.5. 特殊字符类型
名称 | 存储大小 | 描述 |
---|---|---|
"char" |
1 字节 | 单字节内部类型 |
name |
64 字节 | 对象名称的内部类型 |
如果您在文档中发现任何不正确、与您特定功能的使用体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。