# 8.3条。字符类型

表8.4.字符类型

姓名 说明
字符变化(*)*)(三)瓦尔查尔(**) 可变长度,带限制
字符(*)*)(三)字符(*)*) 固定-长度,空白填充
文本 可变无限长

表8.4显示PostgreSQL中可用的通用字符类型。

SQL定义了两种主要字符类型:字符变化(*)*)性格(*n*)哪里*n是一个正整数。这两种类型都可以存储多达个字符串n*长度为个字符(不是字节)。尝试将较长的字符串存储到这些类型的列中会导致错误,除非多余的字符都是空格,在这种情况下,字符串将被截断到最大长度。(这个有点奇怪的异常是SQL标准所要求的。)如果要存储的字符串短于声明的长度,则类型为性格将被空间填充;类型的值性格多变将只存储较短的字符串。

如果一个显式地向性格多变(*n*)性格(*n*),则超长值将被截断为*n*不引发错误的字符。(这也是SQL标准所要求的。)

符号瓦尔查尔(*n*)炭(*n*)你的别名是什么性格多变(*n*)性格(*n*)分别地性格没有长度说明符相当于人物(1)如果性格多变如果不使用长度说明符,则该类型接受任何大小的字符串。后者是PostgreSQL的扩展。

此外,PostgreSQL还提供文本类型,它存储任意长度的字符串。虽然类型文本不在SQL标准中,其他几个SQL数据库管理系统也有。

类型的值性格用空格填充到指定的宽度*n,并以这种方式存储和显示。然而,在比较两个类型的值时,尾随空格在语义上被视为无关紧要的,并且被忽略性格.在空白比较重要的排序中,这种行为可能会产生意外的结果;例如选择“a”::字符(2)整理“C”<E'a\n”::字符(2)返回true,尽管C区域设置会考虑一个空间大于换行符。转换文件时,将删除尾随空格性格值转换为其他字符串类型之一。注意,尾随空格是*语义上有意义的性格多变文本值,当使用模式匹配时喜欢还有正则表达式。

这些数据类型中可以存储的字符由数据库字符集决定,数据库字符集在创建数据库时被选中。无论特定的字符集是什么,都无法存储代码为零的字符(有时称为NUL)。有关更多信息,请参阅第24.3节.

短字符串(最多126字节)的存储要求是1字节加上实际字符串,其中包括性格.较长字符串的开销为4字节,而不是1字节。长字符串由系统自动压缩,因此对磁盘的物理要求可能会降低。很长的值也存储在后台表中,这样它们就不会干扰对较短列值的快速访问。在任何情况下,可以存储的最长字符串大约为1GB。(将允许的最大值)*n*在数据类型声明中小于此值。改变这一点是没有用的,因为对于多字节字符编码,字符和字节的数量可能会有很大的不同。如果希望存储没有特定上限的长字符串,请使用文本性格多变没有长度说明符,而不是构成任意长度限制。)

# 提示

这三种类型之间没有性能差异,除了在使用空白填充类型时增加存储空间,以及在存储到长度受限制的列时检查长度的几个额外CPU周期。虽然性格(*n*)在其他一些数据库系统中有性能优势,但在PostgreSQL中没有这样的优势;事实上性格(*n*)由于额外的存储成本,它通常是三款中速度最慢的。在大多数情况下文本性格多变应该改用。

提到第4.1.2.1节有关字符串文本语法的信息,请参阅第九章有关可用运算符和函数的信息。

例8.1.使用字符类型

CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; -- (1)

  a   | char_length