PostgreSQL 中的字符类型
类型名称 | 描述 |
---|---|
varchar(n) , character varying(n) |
有限制的可变长度 |
char(n) , character(n) , bpchar(n) |
固定长度,空格填充 |
bpchar |
无限可变长度,空格填充 |
text |
无限可变长度 |
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,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
)不能被存储。有关更多信息,请参阅 PostgreSQL: Documentation: 16: 24.3. Character Set Support
对于短字符串(最多 126 字节)存储需求是 1 字节加上实际字符串,当字符类型是 character
时包括空格填充。较长的字符串则有 4 字节的额外开销而不是 1 字节。长字符串会被系统自动压缩,因此实际磁盘上占用的存储空间可能会更少。非常长的值也会存储在后台表中,以避免干扰对较短列值的快速访问。无论如何,可以存储的最长字符字符串约为 1 GB。(在数据类型声明中允许的最大值 n
小于这个值。改变这一点是没有用的,因为在多字节字符编码中,字符数和字节数可能相差很大。如果你希望存储没有特定上限的长字符串,请使用 text
或 character varying
而不是指定一个任意的长度限制。)
Tip: 这三种类型的性能差异不大,除了使用空格填充类型时会增加存储空间,以及在存储到长度受限的列时会多花费一些 CPU 周期来检查长度。虽然在其他一些数据库系统中 character(n)
有性能优势,但在 PostgreSQL 中并没有这种优势;实际上,由于其额外的存储成本,character(n)
通常是三种类型中最慢的。在大多数情况下,应该使用 text
或 character varying
而不是指定长度限制。
在 PostgreSQL 中还有两种固定长度的字符类型:
name
,64 字节,对象名称的内部使用类型"char"
,1 字节,单字节内部类型
这些类型并不是为了通用目的设计的,而是用于内部系统目录。name
类型用于存储标识符。其长度目前定义为 64 字节(63 个可用字符加上终止符),但在 C 源代码中应使用常量 NAMEDATALEN
来引用。长度是在编译时设置的(因此可以根据特殊用途进行调整);默认的最大长度在未来版本中可能会发生变化。"char"
类型(注意这里的引号)与 char(1)
不同,因为它只使用一个字节的存储空间,因此只能存储一个 ASCII 字符。它在系统目录中用作一种简单的枚举类型。
相关链接
PostgreSQL: Documentation: 16: 24.3. Character Set Support
OB links
OB tags
#PostgreSQL