On this page
8.3. 字符类型
表 8.4. 字符类型
Name | Description |
---|---|
character varying(n) , varchar(n) |
有限制的可变长度 |
character(n) , char(n) |
定长,空白填充 |
text |
可变的无限长度 |
Table 8.4显示了 PostgreSQL 中可用的通用字符类型。
SQL 定义了两种主要字符类型:character varying(n)
和character(n)
,其中* n
是正整数。这两种类型都可以存储长度不超过 n
*个字符(不是字节)的字符串。尝试将更长的字符串存储到这些类型的列中将导致错误,除非多余的字符全部为空格,在这种情况下,字符串将被截断为最大长度。 (SQL 标准要求此异常怪异的异常.)如果要存储的字符串短于声明的长度,则character
类型的值将用空格填充;否则,将使用空格填充。 character varying
类型的值将仅存储较短的字符串。
如果将一个值显式地转换为character varying(n)
或character(n)
,则超长值将被截断为* n
*个字符而不会引发错误。 (这也是 SQL 标准所必需的.)
标记varchar(n)
和char(n)
分别是character varying(n)
和character(n)
的别名。没有长度说明符的character
等效于character(1)
。如果使用character varying
而不使用长度说明符,则该类型接受任何大小的字符串。后者是 PostgreSQL 扩展。
另外,PostgreSQL 提供了text
类型,该类型存储任何长度的字符串。尽管text
类型不在 SQL 标准中,但其他几个 SQL 数据库 Management 系统也有它。
character
类型的值在物理上用空格填充到指定的宽度* n
,并以这种方式存储和显示。但是,当比较类型为character
的两个值时,尾随空格被视为语义上无关紧要的并且被忽略。在空白很重要的排序规则中,此行为会产生意外的结果;例如SELECT 'a '::CHAR(2) collate "C" < E'a\n'::CHAR(2)
返回 true,即使C
语言环境认为空格大于换行符也是如此。将character
值转换为其他字符串类型之一时,将删除尾部空格。请注意,尾随空格在character varying
和text
值中在语义上很重要*,并且在使用模式匹配时,即LIKE
和正则表达式。
短字符串(最多 126 个字节)的存储要求是 1 个字节加上实际的字符串,其中包括character
情况下的空格填充。较长的字符串的开销为 4 个字节,而不是 1 个字节。较长的字符串由系统自动压缩,因此对磁盘的物理需求可能会更少。非常长的值也存储在后台表中,这样它们就不会干扰对较短列值的快速访问。在任何情况下,可以存储的最长字符串约为 1 GB。 (数据类型声明中* n
*所允许的最大值小于该值.更改此值将无用,因为使用多字节字符编码时,字符和字节数可能会大不相同.如果需要要存储没有特定上限的长字符串,请使用不带长度说明符的text
或character varying
,而不是设置任意长度限制.)
Tip
这三种类型之间没有性能差异,除了使用空白填充类型时增加的存储空间,以及在存储到受长度限制的列中时需要一些额外的 CPU 周期来检查长度。 character(n)
在其他一些数据库系统中具有性能优势,而在 PostgreSQL 中则没有这种优势。实际上character(n)
通常是三个中最慢的,因为它会增加存储成本。在大多数情况下,应改用text
或character varying
。
有关字符串 Literals 的语法的信息,请参阅Section 4.1.2.1;有关可用运算符和函数的信息,请参阅Chapter 9。数据库字符集确定用于存储文本值的字符集;有关字符集支持的更多信息,请参考Section 23.3。
实施例 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
- ((1)) Section 9.4中讨论了
char_length
函数。
PostgreSQL 中还有其他两种定长字符类型,如Table 8.5所示。 name
类型仅在内部系统目录中用于存储标识符,而仅供普通用户使用。当前将其长度定义为 64 个字节(63 个可用字符加终止符),但应在C
源代码中使用常量NAMEDATALEN
进行引用。该长度是在编译时设置的(因此可以针对特殊用途进行调整);默认最大长度在将来的版本中可能会更改。 "char"
类型(请注意引号)与char(1)
类型不同,因为它仅使用一个字节的存储空间。在系统目录中内部使用它作为一种简单的枚举类型。
表 8.5. 特殊字符类型
Name | Storage Size | Description |
---|---|---|
"char" |
1 byte | 单字节内部类型 |
name |
64 bytes | 对象名称的内部类型 |