↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 数据类型 / 字符串

text

变长字符串

当前查看 PostgreSQL 18.6。

PG10–20 核心源码清单。类型转换与操作符类列出源码显式声明的关系;缺少记录不能排除通过其他机制进行转换或使用索引。

定义

变长字符串

text
目录名称
pg_catalog.text
类型 OID
25
类型种类
基础类型
声明长度
变长(varlena)
存储策略
扩展
输入函数
textin
输出函数
textout
手册中的声明
文本
手册说明
无限长度的变长

中文手册

阅读完整手册章节

阅读来源定义

8.3. 字符类型

表 8.4. 字符类型

名字 说明
character varying(n), varchar(n) 有长度限制的变长
character(n), char(n), bpchar(n) 定长,空格填充
bpchar 无限长度的变长,忽略尾随空格
文本 无限长度的变长

表 8.4显示了在PostgreSQL里可用的一般用途的字符类型。

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,则它必须大于零且不能超过 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) 会返回真,即使 C 区域设置认为空格大于换行符。把 character 值转换为其他字符串类型之一时,尾随空格会被移除。请注意,在 character varying 和 text 值中,以及进行模式匹配(即 LIKE 和正则表达式)时,尾随空格在语义上是有意义的。

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

短字符串(最多 126 字节)的存储空间为实际字符串大小加 1 字节;对于 character,实际字符串包含补齐的空格。更长的字符串开销为 4 字节,而非 1 字节。系统会自动压缩长字符串,因此实际磁盘占用可能更小。很长的值还会存储在后台表中,避免影响较短列值的快速访问。无论如何,可存储字符串的最大长度约为 1 GB。(类型声明中 n 的最大允许值更小。改变这一点没有意义,因为多字节编码中字符数与字节数可能相差很大。如果希望存储没有明确上限的长字符串,应使用 text 或不带长度的 character varying,而非随意指定一个长度上限。)

提示

这三种类型之间没有性能差别,除了使用空格填充类型时会占用更多存储空间,以及在写入带长度约束的列时需要少量额外 CPU 周期来检查长度。虽然在某些其他数据库系统中,character(n) 可能有一定性能优势,但在 PostgreSQL 中并不存在这种优势。事实上,由于额外的存储开销,character(n) 通常反而是三者中最慢的。大多数情况下,应优先使用 text 或 character varying。

关于字符串常量的语法,请参见第 4.1.2.1 节;关于可用的操作符和函数,请参见第 9 章。

例 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)

函数char_length在第 9.4 节中讨论。


PostgreSQL 还有另外两种定长字符类型,见表 8.5。它们只用于内部系统目录,不适合通用用途。name 用来存储标识符,当前长度定义为 64 字节,即 63 个可用字符加终止符,但 C 源码中应使用 NAMEDATALEN 常量引用。长度在编译时设定,因此可为特殊用途调整;默认最大长度可能在未来版本中变化。"char" 类型(注意双引号)与 char(1) 不同,只占一个字节,因此只能存储一个 ASCII 字符;它在系统目录中用作简单的枚举类型。

表 8.5. 特殊字符类型

名字 存储大小 说明
"char" 1 字节 单字节内部类型
name 64 字节 用于对象名的内部类型

系统目录属性

此构建的源码初始化值。字段含义参见 pg_type 。包含头文件默认值;依赖构建的常量保留符号形式,不作为服务器运行时实测。

oid
25
descr
variable-length string, no limit specified
typacl
_null_
typlen
-1
typelem
0
typname
text
typsend
textsend
typtype
b
typalign
i
typarray
0
typbyval
f
typdelim
','
typinput
textin
typmodin
-
typndims
0
typowner
POSTGRES
typrelid
0
typmodout
-
typoutput
textout
typtypmod
-1
typanalyze
-
typdefault
_null_
typnotnull
f
typreceive
textrecv
typstorage
x
typbasetype
0
typcategory
S
typcollation
default
typisdefined
t
typnamespace
pg_catalog
typsubscript
-
typdefaultbin
_null_
array_type_oid
1009
typispreferred
t
array_type_name
_text

类型转换 18

与此类型相关的显式 pg_cast 记录。PostgreSQL 还支持 pg_cast 之外的类型转换,缺少记录不能证明转换不可能。

源类型目标类型转换上下文转换方式函数
textregclass隐式函数regclass
textbpchar隐式二进制兼容0
textvarchar隐式二进制兼容0
bpchartext隐式函数text(bpchar)
varchartext隐式二进制兼容0
chartext隐式函数text(char)
nametext隐式函数text(name)
textchar赋值函数char(text)
textname隐式函数name(text)
pg_node_treetext隐式二进制兼容0
pg_ndistincttext隐式输入/输出0
pg_dependenciestext隐式输入/输出0
pg_mcv_listtext隐式输入/输出0
cidrtext赋值函数text(inet)
inettext赋值函数text(inet)
booltext赋值函数text(bool)
xmltext赋值二进制兼容0
textxml显式函数xml

运算符重载 58

每种操作数签名均为独立重载。实现函数和返回类型来自同一源码构建。

运算符左操作数右操作数返回类型含义实现函数
=texttextbool等于texteq
^@texttextbool以前缀开头starts_with
=nametextbool等于nameeqtext
<nametextbool小于namelttext
<=nametextbool小于等于nameletext
>=nametextbool大于等于namegetext
>nametextbool大于namegttext
<>nametextbool不等于namenetext
=textnamebool等于texteqname
<textnamebool小于textltname
<=textnamebool小于等于textlename
>=textnamebool大于等于textgename
>textnamebool大于textgtname
<>textnamebool不等于textnename
<>texttextbool不等于textne
~nametextbool匹配正则表达式,区分大小写nameregexeq
!~nametextbool不匹配正则表达式,区分大小写nameregexne
~texttextbool匹配正则表达式,区分大小写textregexeq
!~texttextbool不匹配正则表达式,区分大小写textregexne
||texttexttext连接textcat
<texttextbool小于text_lt
<=texttextbool小于等于text_le
>texttextbool大于text_gt
>=texttextbool大于等于text_ge
~bpchartextbool匹配正则表达式,区分大小写bpcharregexeq
!~bpchartextbool不匹配正则表达式,区分大小写bpcharregexne
~~nametextbool匹配 LIKE 表达式namelike
!~~nametextbool不匹配 LIKE 表达式namenlike
~~texttextbool匹配 LIKE 表达式textlike
!~~texttextbool不匹配 LIKE 表达式textnlike
~~bpchartextbool匹配 LIKE 表达式bpcharlike
!~~bpchartextbool不匹配 LIKE 表达式bpcharnlike
~*nametextbool匹配正则表达式,不区分大小写nameicregexeq
!~*nametextbool不匹配正则表达式,不区分大小写nameicregexne
~*texttextbool匹配正则表达式,不区分大小写texticregexeq
!~*texttextbool不匹配正则表达式,不区分大小写texticregexne
~*bpchartextbool匹配正则表达式,不区分大小写bpcharicregexeq
!~*bpchartextbool不匹配正则表达式,不区分大小写bpcharicregexne
~~*nametextbool匹配 LIKE 表达式,不区分大小写nameiclike
!~~*nametextbool不匹配 LIKE 表达式,不区分大小写nameicnlike
~~*texttextbool匹配 LIKE 表达式,不区分大小写texticlike
!~~*texttextbool不匹配 LIKE 表达式,不区分大小写texticnlike
~~*bpchartextbool匹配 LIKE 表达式,不区分大小写bpchariclike
!~~*bpchartextbool不匹配 LIKE 表达式,不区分大小写bpcharicnlike
~<~texttextbool小于text_pattern_lt
~<=~texttextbool小于等于text_pattern_le
~>=~texttextbool大于等于text_pattern_ge
~>~texttextbool大于text_pattern_gt
||textanynonarraytext连接textanycat
||anynonarraytexttext连接anytextcat
@@texttextbool全文检索匹配ts_match_tt
@@texttsquerybool全文检索匹配ts_match_tq
->jsontextjson获取 json 对象字段json_object_field
->>jsontexttext获取 json 对象字段并返回文本json_object_field_text
->jsonbtextjsonb获取 jsonb 对象字段jsonb_object_field
->>jsonbtexttext获取 jsonb 对象字段并返回文本jsonb_object_field_text
?jsonbtextbool键存在jsonb_exists
-jsonbtextjsonb删除对象字段jsonb_delete(jsonb,text)

操作符类 11

声明输入类型与此类型相符的操作符类。多态操作符类、类型转换和表达式索引还可能提供其他索引路径;不能仅凭此表判断是否支持索引。

操作符类索引方法输入类型操作符族默认存储类型
text_opsbtreetextbtree/text_ops是与输入类型相同
text_opshashtexthash/text_ops是与输入类型相同
varchar_opsbtreetextbtree/text_ops否与输入类型相同
varchar_opshashtexthash/text_ops否与输入类型相同
text_pattern_opsbtreetextbtree/text_pattern_ops否与输入类型相同
varchar_pattern_opsbtreetextbtree/text_pattern_ops否与输入类型相同
text_pattern_opshashtexthash/text_pattern_ops否与输入类型相同
varchar_pattern_opshashtexthash/text_pattern_ops否与输入类型相同
text_opsspgisttextspgist/text_ops是与输入类型相同
text_minmax_opsbrintextbrin/text_minmax_ops是text
text_bloom_opsbrintextbrin/text_bloom_ops否text

版本比较

PostgreSQL 17.11 → 18.6。属性比较不包含构建标识和说明正文;原始目录字段与源描述保留原文。

这两个样本的系统目录和结构化属性没有变化。

这些构建的文档也有差异,请查看对应版本的手册定义。

文档与源码

构建
18.6 · https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f

相关条目

全部数据类型 · 下载此版本 JSON · 最早收录的样本不代表该类型的实际引入版本。