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