类型名称 描述
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 类型的一个域。

类型名 varcharcharacter varying 的别名,而 bpchar(带长度说明符)和 charcharacter 的别名。varcharchar 别名在 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 varyingtext 类型的值在使用模式匹配(即 LIKE 和正则表达式)时,尾随空格在语义上是重要的。

这些数据类型可以存储的字符由数据库字符集确定,该字符集在创建数据库时选择。无论具体的字符集如何,代码为零的字符(有时称为 NUL)不能被存储。有关更多信息,请参阅 PostgreSQL: Documentation: 16: 24.3. Character Set Support

对于短字符串(最多 126 字节)存储需求是 1 字节加上实际字符串,当字符类型是 character 时包括空格填充。较长的字符串则有 4 字节的额外开销而不是 1 字节。长字符串会被系统自动压缩,因此实际磁盘上占用的存储空间可能会更少。非常长的值也会存储在后台表中,以避免干扰对较短列值的快速访问。无论如何,可以存储的最长字符字符串约为 1 GB。(在数据类型声明中允许的最大值 n 小于这个值。改变这一点是没有用的,因为在多字节字符编码中,字符数和字节数可能相差很大。如果你希望存储没有特定上限的长字符串,请使用 textcharacter varying 而不是指定一个任意的长度限制。)

Tip: 这三种类型的性能差异不大,除了使用空格填充类型时会增加存储空间,以及在存储到长度受限的列时会多花费一些 CPU 周期来检查长度。虽然在其他一些数据库系统中 character(n) 有性能优势,但在 PostgreSQL 中并没有这种优势;实际上,由于其额外的存储成本,character(n) 通常是三种类型中最慢的。在大多数情况下,应该使用 textcharacter varying 而不是指定长度限制。

在 PostgreSQL 中还有两种固定长度的字符类型:

  • name,64 字节,对象名称的内部使用类型
  • "char",1 字节,单字节内部类型

这些类型并不是为了通用目的设计的,而是用于内部系统目录。name 类型用于存储标识符。其长度目前定义为 64 字节(63 个可用字符加上终止符),但在 C 源代码中应使用常量 NAMEDATALEN 来引用。长度是在编译时设置的(因此可以根据特殊用途进行调整);默认的最大长度在未来版本中可能会发生变化。"char" 类型(注意这里的引号)与 char(1) 不同,因为它只使用一个字节的存储空间,因此只能存储一个 ASCII 字符。它在系统目录中用作一种简单的枚举类型。

相关链接

PostgreSQL: Documentation: 16: 24.3. Character Set Support

OB tags

#PostgreSQL