diff --git a/docs/calibration-20260914-status.md b/docs/calibration-20260914-status.md
new file mode 100644
index 00000000..65368df0
--- /dev/null
+++ b/docs/calibration-20260914-status.md
@@ -0,0 +1,199 @@
+PG10—PG20 校准阶段报告(2026-09-14T14:42:30.720497+08:00)
+
+原清单 F-001—F-026 均已有逐版修复、原已正确或不适用的源码记录及分批核验。后续审校继续发现并修复了配置、函数、psql、pgbench、数据类型及其四个包含文件中的问题。**全书逐句语义校准、最终独立对账和 33 项最终构建仍未完成。** 本报告不将机器扫描、历史通过记录或台账数量当作全文验收。
+
+最新完成范围是 libpq、大对象和前后端协议三章的十一版完整校准。libpq 已核验提交 `73975603fb7706520b66c3b416b594a28ffd0f9e`;本阶段交付包含大对象与协议的 24 个正文文件和 4 份报告。协议新增修复包括 PG18—20 密钥字段类型、PG18 启动协议编码、PG14—17 次版本、PG14 缺失认证消息及未来 MERGE/两阶段说明、PG18+ 过时的生成列限制。逐项十一版矩阵见 [协议全章报告](/Users/vonng/pgsty/pgdoc/docs/calibration-protocol-whole-20260914.md);大对象 API 类型与操作系统用户权限见 [大对象报告](/Users/vonng/pgsty/pgdoc/docs/calibration-lobj-20260914.md)。两章当前正文均已通过本批原生核验。
+
+英文固定为 10.23、11.22、12.22、13.23、14.24、15.19、16.15、17.11、18.6、19beta3 和 PG20 提交 86f7c82cf1023e3599f40f939727791a7090cd44。PG18 优先阅读;其他版本逐一核对完整段落、表格行和版本差异,同义英文共用译文,保留自身功能、签名、默认值、限制、代码和链接。遵守 exclude、glossary 及语境规则、style 的优先顺序。
+
+阶段提交已核验:`d961bc1f3652f667f2a48b5638111ed099177ce4`(143 个文件),以及 `cfdd4bea4eca0eae6503d3ea36c5070e458cfc14`(355 个 PG10—20 正文文件和 3 份报告)。后一个提交的 358 个路径、提交 blob 与审定记录逐一相同。已核验阶段提交 `46de150b9b3a4d3ed1b677c0189ef9cfb9ecef03`(16 个文件)另含 libpq 连接、状态、执行、异步、管道、分块读取与取消接口的修复及四份对应报告;这些范围均已完成本批新快照核验。其他任务的 PG9.6 工作保留,没有推送或发布。
+
+下表“修”表示本项或其横向核查中同范围的关联问题已修复;“核”表示针对该问题原本正确;“—”表示同版不适用;“例”表示明确保留的项目例外。“分项”表示一个原始问题包含多种版本状态,详见其子表。**这些是修复台账状态,最终当前源码对账进度另列,不能合并理解为最终通过。**
+
+| 问题 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| F-001 链接、术语链接和相关缺句 | 修 | 修 | 修 | 修/例 | 修/例 | 修/例 | 修/例 | 修/例 | 修/例 | 修/例 | 修/例 |
+| F-002 锁表容量公式 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-003 pgbench greatest / least 返回类型 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-004 pg_split_walfile_name 换算说明 | — | — | — | — | — | — | 修 | 修 | 修 | 修 | 修 |
+| F-005 SQL/JSON 引言 | — | — | — | — | — | — | 修 | 修 | 修 | 修 | 修 |
+| F-006 复制配置引言 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-007 通用文件访问函数 EXECUTE 权限 | — | — | — | — | — | — | 修 | 修 | 修 | 修 | 修 |
+| F-008 EXTRACT(WEEK) | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-009 系统信息与对象标识 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 |
+| F-010 未来版本表行、列及相关语义 | 分项 | 分项 | 分项 | 分项 | 分项 | 分项 | 分项 | 分项 | 分项 | 分项 | 分项 |
+| F-011 PG14 备份控制函数表 | 核 | 核 | 核 | 修 | 修 | — | — | — | — | — | — |
+| F-012 element_types.domain_default | 修 | 修 | 修 | 修 | 修 | 修 | 修 | — | — | — | — |
+| F-013 协议变更总结 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-014 pgoutput 参数 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-015 配置章缺段、示例和版本差异 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-016 postgres_fdw ON CONFLICT 及相关说明 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-017 并行受限清单 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-018 SHOW 的区域设置变量 | 核 | 核 | 核 | 核 | 修 | 修 | 核 | 核 | 核 | 核 | 核 |
+| F-019 操作符族/类 RECHECK 说明 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| F-020 to_hex(-1234) 示例 | — | — | — | — | — | — | — | 核 | 核 | 核 | 核 |
+| F-021 文档指南“纯文本文件” | 核 | 核 | 核 | 核 | 修 | 修 | 修 | — | — | — | — |
+| F-022 NLS、pg_dump、CancelRequest 与锚点 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-023 polygon(circle) 示例损坏 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-024 libpq 参数状态和协议状态 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-025 句级与示例杂项 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| F-026 PG15 pg_walinspect | — | — | — | — | — | 修 | 核 | 核 | 核 | 核 | 核 |
+
+**F-001:链接、术语链接和相关缺句。** 恢复同版 xref/link/glossterm 与缺文,保留 PG13–20 已核实的 role/instance 链接例外;链接计数本身不作为语义证明。
+
+**F-002:锁表容量公式。** max_locks_per_transaction / max_pred_locks_per_transaction 使用各自版本的公式;PG16 起的新公式与旧版分开,补齐谓词锁节。
+
+**F-003:pgbench greatest / least 返回类型。** 按“任一参数为 double 时返回 double,否则返回 integer”定译;PG10–12 对应旧版结构核验。
+
+**F-004:pg_split_walfile_name 换算说明。** 补齐备份节末的换算段、wal_segment_size、\gset 示例;PG16 起适用,PG19 原有示例保留并校准上下文。
+
+**F-005:SQL/JSON 引言。** 补齐数据模型及相关能力说明;保留 PG16 与 PG17+ 各自项目数量和链接,不把新版引言灌入旧版。
+
+**F-006:复制配置引言。** 补齐逻辑复制段,核准流复制、物理复制、逻辑复制的同版原文关系;未机械套用原报告对首段关系的判断。
+
+**F-007:通用文件访问函数 EXECUTE 权限。** 原文说可选参数由独立的物理函数实现,因此需要分别授予权限;已按该含义修复 PG16–20,避免误解为 SQL 默认参数。
+
+**F-008:EXTRACT(WEEK)。** 补齐 PG18–20 interval 按整周计算的单句;其余版本核对原有周编号说明。
+
+**F-009:系统信息与对象标识。** 系统信息引言在 PG16+ 补齐。对象标识引导句在十一版原本都有;pg_get_acl 示例缺口实际涉及 PG18/20,PG19 原有。
+
+**F-010:未来版本表行、列及相关语义。** 按 20 个表主题、关联段落和表头拆分核验:AT LOCAL、^@、MERGE 策略、系统目录/视图列、substream、pg_stat_statements 列名等。各版本具体处理见分项矩阵。
+
+**F-011:PG14 备份控制函数表。** PG14 实际缺三行,包含 pg_stop_backup() 重载,并有旧版 start/stop 签名问题;同时修正 PG13 pg_is_in_backup 说明。PG15+ 按已移除功能处理。
+
+**F-012:element_types.domain_default。** PG14–16 补行;PG10–13 虽有该行,却误写为数据库名,已改为同版英文的“尚未实现”。PG17+ 不适用。
+
+**F-013:协议变更总结。** 恢复 PG14 完整清单,校准各版 BinaryRow 说明;从 PG15–17 移除误入的 PG18 COPY/CSV 说明。
+
+**F-014:pgoutput 参数。** PG14 恢复 binary/messages;PG15 移除未来的协议版本 4、parallel/origin 内容;PG19/20 按拆分后的完整参数节核对。
+
+**F-015:配置章缺段、示例和版本差异。** ANY/FIRST、fsync()/initdb --sync-only、O_DIRECT 等已核对。原“约 25 组”残余信号收敛为 15 个实际检查范围;之后已完成十一版 config.sgml 的完整共用单元审校。
+
+**F-016:postgres_fdw ON CONFLICT 及相关说明。** 恢复 PG17 缺段,随后通读十一版 postgres_fdw 及 dblink;按版本保留连接、权限、事务和参数差异。
+
+**F-017:并行受限清单。** PG14–16 补齐 InitPlan 等旧版项目及相关限制;其他版本严格按本版清单,保留 PG17+ 的变更。
+
+**F-018:SHOW 的区域设置变量。** PG14/15 补齐 LC_COLLATE、LC_CTYPE;其余九版核验原有条目。
+
+**F-019:操作符族/类 RECHECK 说明。** 补齐并统一 PG10–17 的旧版说明;PG18+ 原文已移除,核验后保持自己的结构。
+
+**F-020:to_hex(-1234) 示例。** PG17–20 缺失的负数示例在阶段提交 d961bc1 中已修复;本轮复核时记为已正确。PG10–16 无此同版示例。
+
+**F-021:文档指南“纯文本文件”。** 重新纠正旧台账:该节在 PG10–16 都存在。PG10–13 原已有;PG14/15 的并行修复已保留复核;PG16 已补齐。Pandoc >=1.13 仅 PG12–16 要求。PG17+ 已移除该节。
+
+**F-022:NLS、pg_dump、CancelRequest 与锚点。** 恢复 PG14 AVAIL_LANGUAGES、--no-synchronized-snapshots 和 Int32(16);恢复 PG14/16 strict-and-lax-modes 上游锚点。后续 JSON 全节审校已覆盖正文。
+
+**F-023:polygon(circle) 示例损坏。** 修复 PG14–20 七版的损坏数字输出,逐版保留同版完整结果;PG10–13 核验原样正确。
+
+**F-024:libpq 参数状态和协议状态。** scram_iterations 缺口实际涉及 PG16–18,另补 PG18 search_path;清除 PG14–17 的未来协议字段,并统一同版指针有效期说明。
+
+**F-025:句级与示例杂项。** 核对 --geqo 形式、pgpass HOME 句、BinaryRow、回归测试 screen;横向修复所有适用位置。
+
+**F-026:PG15 pg_walinspect。** 恢复两个 till_end 函数,移除未来的 pg_get_wal_block_info;完整核对 PG15 五个函数及 end_lsn 行为。其他适用版本按自身函数集合保留。
+
+完整原始修复依据见 [26 项状态与证据索引](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/status.json);[F-021 十一版完整中英段落](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/f021-current-complete-parents-20260914.json) 和 [F-021 当前快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/f021-current-native-proof-20260914.json) 已更新。原始独立审查材料保留不改;本轮更正只写入执行台账。
+
+F-010 的 20 个表主题分别核对如下,关联说明和表头另有逐版记录。
+
+| F-010 表主题 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| acl | — | — | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| crypt-algorithms | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 核 | 核 | 核 | 核 |
+| crypt-iterations | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 核 | 核 | 核 | 核 |
+| pg_backend_memory_contexts | — | — | — | — | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| pg_constraint | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| pg_hba_file_rules | 核 | 核 | 核 | 核 | 修 | 修 | 核 | 核 | 核 | 核 | 核 |
+| pg_ident_file_mappings | — | — | — | — | — | 修 | 核 | 核 | 核 | 核 | 核 |
+| pg_index | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| pg_prepared_statements | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| pg_stat_statements | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 |
+| pg_stats | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| pg_stats_ext | — | — | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| pg_stats_ext_exprs | — | — | — | — | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| pg_subscription | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| policy | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| privilege-summary | — | — | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| string-other | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| timezone | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| typcategory | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| views | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 核 | 核 | 修 | 核 |
+
+数据类型四个包含文件中,下面 35 个问题或一致性检查组均有十一格记录。44 个文件以及 11 个 pg_lsn 表行补充已经应用;55 个范围与当前源码、固定英文及新解析快照精确一致,六个原有额外 ID 逐一复核后保留。1882 个完整父单元和 1114 处代码有精确证据;这些不是独立缺陷数量。
+
+| 后续数据类型问题/检查组 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| JSON 词元术语 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| JSON 原生类型映射 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| JSON 原子业务数据 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| JSON 两个子对象的包含关系 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| jsonb_path_ops 的具体性 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| JSON 排序解释 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| JSON 下标 | — | — | — | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| PL/Perl hash | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| jsonpath 与 SQL 下划线区别 | — | — | — | — | — | — | 修 | 修 | 修 | 修 | 修 |
+| GIN 同版等号示意记法 | — | — | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| jsonpath 命名变量说明 | — | — | 修 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 |
+| jsonpath 最深嵌套层 | — | — | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| jsonpath 数组下标转换 | — | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| JSON null 与 SQL NULL | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 数组字面量显式类型 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 数组维数与同版错误输出 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 矩形数组切片与按日项目 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 数组元素 NULL 行为 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 数组切片 NULL 与空数组 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 数组扩展后的 NULL 填充 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 数组下界与下标 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 复合值显式目标类型 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 复合类型与记法术语 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| LATERAL 单次函数调用 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| RETURNING 的同版语句范围 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 计算字段可见索引 | 修 | 修 | 修 | 修 | 修 | 核 | 修 | 修 | 修 | 修 | 修 |
+| 多范围列表数量 | — | — | — | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 无界范围与显式无穷值 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 范围的 hash 术语 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 范围操作符列表标点 | 修 | 修 | 修 | 修 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| 旧版 JSON 键操作符标点 | 修 | 修 | 修 | 修 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| JSON 可见注释及索引 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 数组可见注释及索引 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 复合类型可见标题 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 范围可见索引及内置函数 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+
+各格的原文路径、修改前后哈希、共用单元、适用范围和验证理由见 [数据类型逐格证据](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/datatype-included-issue-version-matrix.json)。较早关闭的 datatype.sgml 主文件另有 197 个范围核验,清除了旧版混入的 POSIX、XML 和 UUID 新版说明,并修正 numeric 舍入、interval 无穷值等语义。
+
+psql 已完整核对命令、变量、正文、框架和示例,修复 AUTOCOMMIT 否定条件、命令输入和引用、正则模式、管道模式语义以及旧版混入的新选项;[173 个命令/变量/段落检查组 × 11 版](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/psql-full-issue-version-matrix.json) 对应 209 个精确范围。pgbench 已修复参数、返回类型、日志格式、可见注释和版本限制;[30 个问题组 × 11 版](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/pgbench-full-issue-version-matrix.json) 与 244 个含关联修复的范围核验对应。
+
+全量记录按 [问题/共用单元逐项索引](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/status-report-20260914/ALL-ISSUES.md) 查看,逐格原始证据在 [当前对账数据](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/status-report-20260914/all-version-cells-reconciled.json)。当前共有 3537 个任务或共用单元、38907 个版本格;不能说成发现了 3537 个缺陷。
+
+本次重新对账当前源码,25495 格直接精确匹配,188 格仅有受保护代码之外的行尾空白差异,531 格可由已记录的后续修复组合得到当前范围,1430 格由已核验的当前完整范围覆盖;290 格生成表记录已通过当前本地化输入重放并与新快照核对。另有 8113 格不适用记录、394 格误入/过时内容删除记录,保留各自的英文缺席证据。**仍有 2466 格需要重新绑定当前范围;这是证据对账待办,不能直接算成同数量的新缺陷,也不能当作通过。**
+
+下述历史对账快照之后,全文检索主章及关联校准已完成;当前继续从 libpq 推进完整中英阅读,并随每个问题横向覆盖十一版;其余未读范围包括部分系统目录、information_schema、libpq、ECPG、协议、命令参考和发行说明等。同时继续处理历史范围与当前源文的对账。最终还需完成十一版全书检查、HTML/A4/US 共 33 个构建及页面视检。现有分批解析退出码为 PG10–12 的 3、PG13–20 的 1,含合法差异及尚未关闭的全书信号,不能报告成全书检查通过。
+
+后续进展(2026-09-14T15:08:46+08:00):全文检索章节现已完成十一版正文修复及新快照核验,新增 [37 个检查组的逐版说明](/Users/vonng/pgsty/pgdoc/docs/calibration-textsearch-20260914.md),包含具体缺陷、同版不适用项和英文疑点。函数表、系统目录、配置、SQL 命令参考及扩展文档的相关位置继续校准;这部分不包含在前述历史 38907 格的统计快照中。
+
+后续进展(2026-09-14T15:45:49+08:00):已完成 [initdb、unaccent 与全文检索关联章节的 23 组 × 11 版核验](/Users/vonng/pgsty/pgdoc/docs/calibration-textsearch-followup-20260914.md)。257 个文件、1466 个完整父单元与当前/审定/新快照及固定英文一致,334 个提示逐项核定,0 漂移。移除 PG14—17 的 16 个未来 initdb 参数条目及 PG14—16 的未来 unaccent 引号规则,修正校验和、有效用户、词典权限、解析器说明与共同术语。本批 253 格另行记录,未计入前述历史 38907 格;全书余项、旧范围对账和 33 构建仍继续。
+
+后续进展:已完成 [libpq 连接控制节 47 组 × 11 版核验](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-connection-20260914.md)。517 格包含 399 个修复、50 个原本正确和 68 个不适用记录;11 个新快照精确一致,100 个提示逐项绑定完整已读父块。该统计仅为连接节,未计入历史 38907 格。继续完整阅读连接状态和其余接口,并横向同步所有适用版本。
+
+后续进展:已完成 [libpq 连接状态节 27 组 × 11 版核验](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-status-20260914.md)。297 格为 180 个修复、84 个原本正确和 33 个不适用;259 个完整 API 条目、270 个原样代码块及十一版新快照已核准,29 个既有属性锚点逐项绑定。继续执行查询节及其余全文;最终构建仍未完成。
+
+后续进展:[libpq 执行与结果处理 69 组 × 11 版](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-execution-20260914.md)已完成正文及范围内新快照核验,759 格(600 修复、126 原本正确、33 不适用)。包括错误条件反译、未来 MERGE/分块状态、Oid 大小写与标识符转义否定句等。继续异步及其余接口;全书和最终 33 构建仍未完成。
+
+后续进展:[libpq 异步、管道、分块读取和取消接口](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-flow-20260914.md)新增 55 组 × 11 版记录,605 格(297 修复、131 原本正确、170 不适用、7 固定英文疑义)。四个范围的正文及新快照核验已完成;继续快速路径、通知、COPY 和余下章节。
+
+后续进展:[libpq 快速路径、通知与 COPY](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-transfer-20260914.md)新增 32 组 × 11 版记录,352 格(263 修复、62 原本正确、27 不适用)。32 个完整父节和新快照精确一致,零漂移、零范围提示;继续控制函数、杂项函数及余下全文。
+
+后续进展:[libpq 控制、杂项、通知与事件](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-control-events-20260914.md)新增 54 组 × 11 版,594 格(357 修复、190 原本正确、42 不适用、5 源码例外)。44 个完整父节新快照核验零漂移,唯一提示已用本版源码分类;继续环境与构建说明等余下全文,最终 33 项构建尚未启动。
+
+后续进展:[libpq 环境与构建说明](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-environment-20260914.md)新增 36 组 × 11 版,396 格(220 修复、118 原本正确、58 不适用);66 个完整范围通过新快照核验,零漂移、零范围提示。SSL 与 OAuth 等余下全文继续。
+
+后续进展:[libpq SSL](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-ssl-20260914.md)新增 37 组 × 11 版,407 格(247 修复、133 原本正确、27 不适用)。十一版完整 SSL 节新快照零漂移,37 条提示均以原有锚点或逐行全文配对分类,零未决。OAuth 与跨文件问题继续。
+
+后续进展:[OAuth 跨文件校准](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-oauth-20260914.md)新增 26 组、286 格(58 修复、19 原本正确、209 不适用)。PG18—20 四类文件的 15 个完整父块已应用并通过新快照核验,三组原生提示逐条完成全文配对;PG10—17 明确无此功能。示例章节发现的本版代码差异继续处理。
+
+本阶段完成:[libpq 全章校准](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-whole-20260914.md),537 个节范围、2079 个本版英文代码块与审定父块对应;222 条新快照提示全部按当前行号匹配审定全文或源码勘误证据,零未决、零漂移。[示例与章首](/Users/vonng/pgsty/pgdoc/docs/calibration-libpq-examples-20260914.md)补齐最后范围。当前全章累计 398 个检查组、4378 个逐版格,包含正确项和例外,不是缺陷总数。全书校准、历史独立对账与最终33项构建继续。
+
+[大对象全章校准](/Users/vonng/pgsty/pgdoc/docs/calibration-lobj-20260914.md)已完成十一版阅读、修订及新快照核验:25 组275格(95修复、158原本正确、11不适用、11源文疑点),176节和231代码块完整绑定,零范围提示、零漂移。API类型与文件权限依据各版头文件和后端实现核实;本章尚未纳入最终构建。
+
+[协议概述与消息流校准](/Users/vonng/pgsty/pgdoc/docs/calibration-protocol-front-20260914.md)已完成十一版完整阅读和新快照核验,61组671格(516修复、89原本正确、66不适用),189节及11外框精确绑定;169提示逐项关闭。该范围之外的协议章节与全书仍在继续。
+
+协议全章已完成十一版完整对照及本批原生验收:324 个协议范围、2 个迁移 pgoutput 参数节、51 个代码块,13 个目标文件与新快照精确一致;2725 条范围提示已逐项绑定,0 未决、0 漂移。139 个问题/回归组的十一格矩阵和新增字段错误详见 [协议全章报告](/Users/vonng/pgsty/pgdoc/docs/calibration-protocol-whole-20260914.md)。本次完成范围包括 SASL、复制命令、逻辑复制和全部消息格式;全书、历史最终对账与33最终构建仍未完成。
diff --git a/docs/calibration-libpq-connection-20260914.md b/docs/calibration-libpq-connection-20260914.md
new file mode 100644
index 00000000..78a0665a
--- /dev/null
+++ b/docs/calibration-libpq-connection-20260914.md
@@ -0,0 +1,65 @@
+**PG10—PG20:libpq 连接控制章节校准**
+
+本批按 PG18 优先完整阅读连接控制节,再逐一核对其余十版的完整条目与版本差异。47 个检查组、517 个版本格包含语义缺陷、缺句、版本适用性和术语校准,不是 47 个独立新增缺陷。已完成十一版正文修复及本批新快照核验。原 26 项及前序批次见[阶段总报告](/Users/vonng/pgsty/pgdoc/docs/calibration-20260914-status.md)。
+
+主要语义修复包括:PG13—20 的 `PQconninfo` 应返回实际连接值;SSL 私钥回调不得通过异常或 `longjmp` 跳出,原译文表达了相反限制;PG14—20 的重置轮询对照函数应为 `PQconnectPoll`;PG18—20 补齐 `PQsocketPoll` 引导句;PG17—20 移除本版英文已删的两秒超时下限,并补足 SNI 代理与 `direct` 协商条件。较旧版本保留各自英文仍有的规则。
+
+修=本轮修复;核=对照本版英文后原本正确;无=本版没有相应定义。每项均保存了英文、修复前后完整父块及哈希。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LQ-001 参数数组长度、NULL 与空值的说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-002 首个 dbname 的连接字符串展开规则 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-003 参数数组与连接字符串的覆盖优先级 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-004 PQconnectdb 的空白分隔说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-005 PQsetdbLogin 其余参数按规则应用 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-006 非阻塞连接的追踪输出目的流 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-007 非阻塞连接遗漏 PQsocketPoll 引导句 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 修 | 修 | 修 |
+| C19-LQ-008 中间连接状态的出现顺序和值均无保证 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-009 非阻塞连接的空指针、非阻塞及释放表述 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-010 PQconndefaults 后备值与结构字段说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-011 PQconninfo 返回实际使用值而非默认值 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-012 PQconninfoParse 内存不足时的两个 NULL | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-013 PQresetStart 对照的建连函数是 PQconnectPoll | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-014 SSL 密钥回调禁止通过异常或 longjmp 跳出 | P2 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-015 SSL 密钥回调替代默认处理的强调标记 | P3 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-016 host 与 hostaddr 的默认平台范围 | P3 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-017 host 的套接字目录与绝对路径说明 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-018 hostaddr 与 host 同时指定时的认证条件 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-019 DNS 查询可能长时间阻塞 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-020 require_auth 必须恰好采用一种允许方法 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-021 connect_timeout 保留旧版下限、移除新版旧说明 | P2 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 |
+| C19-LQ-022 keepalive 重传间隔的秒数含义 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-023 TCP keepalive 术语与已审配置章一致 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-024 tcp_user_timeout 未确认数据的时限 | P3 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-025 gssencmode 禁用的是 GSSAPI 加密 | P2 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-026 GSSAPI 优先级不受 sslmode 参数值影响 | P2 | 无 | 无 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-027 requiressl 弃用状态与编译条件 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-028 SSL 压缩改善响应时间的方向 | P3 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-029 sslpassword 提示抑制句与 libpq 标记 | P3 | 无 | 无 | 无 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-030 sslcrl 的存在条件修饰文件 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-031 sslcrldir 的存在条件修饰目录 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-032 SNI 代理需要 direct 协商的新版条件 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-LQ-033 SNI 标题词与索引的中文名称 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-034 SSL 最大协议版本的后端上限条件 | P3 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-035 Kerberos 服务名通过 configure 选项设置 | P3 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-036 GSS 委派的 credentials 统一译为凭据 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-037 SCRAM 透传密钥不应由用户直接指定 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQ-038 OAuth 授权范围及客户端类型的可读说明 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQ-039 fork 与可执行程序的说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-040 关键词示例 literal 与可翻译占位符区分 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-041 JDBC 兼容例外的条件与转换方向 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-042 主机名解析术语 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-043 URI 语法中三处说明性短语翻译 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-044 连接引言的同时保持多个连接与内存不足 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-045 非阻塞连接索引翻译 | P3 | 修 | 修 | 修 | 修 | 修 | 核 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-046 外部 SSL 引擎的指定形式 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQ-047 fallback_application_name 的后备值说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+
+完整阅读覆盖 110 个条目变体、38 个外层段落、11 个节框架和 604 个实际条目;68 个最终条目变体、12 个外层修改、4 个框架及 11 个措辞精炼已复读。256 个代码/语法块逐版校验,仅本地化 `PQconninfoOption` 的可读注释和 URI 语法内说明性 `phrase`;函数签名、URI 标识符和其余代码保持对应版本。
+
+十一版当前源码、审定稿、新解析快照、固定英文及原生解包英文精确一致,零漂移。100 个范围内提示分别是 94 个既有本地锚点、6 组旧版未命名小节;全部逐项绑定到 106 个完整已读父块,核对模式名、相邻项目顺序和自身中英正文后保留。`git diff --check` 通过。
+
+本批仅关闭 `libpq-connect` 范围。OAuth 授权范围在认证钩子中的三处关联说明仍随后续整节阅读处理。libpq 其余章节、全书其他待读范围、历史证据对账和最终 33 项 HTML/A4/US 构建均未完成。全书原始结构检查退出码仍为 PG10—12 的 3、PG13—20 的 1,不代表全书通过。
+
+详细证据:[逐问题十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-connect-full-issue-version-matrix.json)、[完整审定父块](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-connect-full-finalized-parent-plans.json)、[604 条目绑定](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-connect-full-finalized-entry-proof.json)、[新快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-connect-native-current-snapshot-proof.json)、[100 条逐项处置](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-connect-native-dispositions.json)、[106 完整父块](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-connect-native-parent-proof.json)。
diff --git a/docs/calibration-libpq-control-events-20260914.md b/docs/calibration-libpq-control-events-20260914.md
new file mode 100644
index 00000000..93f97b51
--- /dev/null
+++ b/docs/calibration-libpq-control-events-20260914.md
@@ -0,0 +1,72 @@
+**PG10—PG20:libpq 控制函数、杂项函数、通知与事件系统校准**
+
+从 PG18 开始完整中英对照,并逐项核对其余十版。54 个检查组、594 个版本格:357 格修复、190 格原本正确、42 格不适用、5 格经源码核实的例外。检查组包含技术错误、措辞和版本边界,不等于 54 个新增缺陷。
+
+主要修复包括:十一版将事件函数的“conn 参数可以为 NULL”误作返回 NULL;通知处理器的 void 指针误作空指针;事件注册数量“只受内存限制”被误译。PG16—20 补齐 PQconninfoFree 的 NULL 参数无操作说明。PG14 移除混入的未来事件规则,恢复本版连接重置失败状态、结果复制失败和清理责任。PG14—20 将结果实例数据错误地说成在连接中注册的问题已修正。同步核准错误详细程度、CONTEXT 条件、跟踪字段、阻塞查询、结果字段与内存归属。
+
+固定英文 PG10—14 将 PQresultSetInstanceData 错写为不存在的 PQsetResultInstanceData;已逐版核对头文件、实现及导出表。PG10—13 修正正文与示例,PG14 保留既有正确译文和链接,英文快照未改。五格记为有证据的源码例外,未当成五个翻译缺陷。
+
+修=已修复;核=该项原本正确;无=不适用;例=对应源码核实的例外。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LQCM-001 编码名称重复字词和 ID 说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-002 设置客户端编码、返回值与当前值接口 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQCM-003 SQLSTATE 可用条件误作任一项可用 | P2 | 无 | 无 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-004 错误详细程度重复旧句、字段和已有结果 | P3 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-005 CONTEXT ALWAYS 条件与显示模式 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-006 PG10/11 无 SQLSTATE 的模式集合 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQCM-007 跟踪行的方向、分隔和消息类型 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-008 Windows 跟踪编译标志与文件指针 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-009 回归跟踪隐去字段的含义 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-010 停止跟踪和引言措辞 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-011 内存释放和 Windows DLL 条件 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-012 PQconninfoFree 缺 NULL 参数无操作句 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-013 附属字符串误作子字符串 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-014 查询可能阻塞、调用者自行查询算法 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-015 密码算法版本、兼容别名、内存与错误 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQCM-016 PG17 起修改密码 API 及错误返回 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 |
+| C19-LQCM-017 空结果对象与 conn 不为 null 的区别 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-018 事件 conn 可为 NULL 误作返回 NULL | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-019 先填充结果再触发事件及防重复调用 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-020 PG14 混入未来 PGEVT_RESULTCOPY 说明 | P2 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQCM-021 结果副本释放、标志、事件过程措辞 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-022 设置属性的忽略条件及返回值 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQCM-023 元组字段、下标位置和 SQL null 值 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-024 附属存储生命周期与类型对齐 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-025 结果内存统计以分配字节求和 | P3 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-026 运行时版本、两位数字、连接选项和标记 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQCM-027 PG17 起微秒时间与套接字超时接口 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 |
+| C19-LQNE-001 通知传递必然性与处理函数返回后的继续执行 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-002 接收器 void 指针误作空指针 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-003 处理器 void 指针误作空指针 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-004 消息传给接收器的主被动关系 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-005 错误字段与预格式化消息 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-006 通知回调仍可能被调用的生命周期 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-007 设置处理函数、NULL 指针及两层处理 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQNE-008 通知可见索引及 PG10 短结束标签 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-009 事件系统销毁与用途术语 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-010 两类数据及透传指针注册说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-011 PG14 注册事件混入未来表述 | P3 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQNE-012 PG18 起 CONNECTION_OK 上游标记 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQNE-013 PG14 连接重置失败与状态缺失 | P2 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQNE-014 创建结果时失败传播和 PG15 起行为 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQNE-015 PG14 复制失败及清理责任被新版替换 | P2 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQNE-016 销毁事件清理责任、无法报告失败 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-017 回调 typedef 是函数指针类型 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-018 Windows 回调地址必须始终一致 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-019 事件注册数量仅受内存限制 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-020 结果实例数据误说在 conn 中注册 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-021 实例数据是否计入内存统计 | P3 | 无 | 无 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-022 逐连接注册、名称生命周期和实例查找 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQNE-023 透传指针与实例数据的生命周期和释放 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQNE-024 事件示例标题、框架引言及可见 C 注释 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQNE-025 固定英文函数名笔误的源码核实例外 | EXCEPTION | 例 | 例 | 例 | 例 | 例 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQNE-026 代码保留自身错误输出、TRUE 和事件行为 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQNE-027 相同英文 API 的共用译文和事件过程术语 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+
+完整阅读 77 个初始 API 变体及全部中文候选、20 个外段变体和 14 个框架,覆盖 343 个实际条目、154 个实际外段;复读 87 个最终 API 变体及全部修改外段、框架,另复读 32 个共用译文调整。387 个代码块保留各版本代码与签名;只本地化原有事件示例注释,并执行上述有源码证据的 API 名称例外。
+
+44 个完整逐版父节与审定稿、固定英文、原生解包英文、新快照逐字一致,零漂移。唯一 PG14 链接提示对应已核实的源码笔误,已单独分类。全书原始审计仍为 PG10—12 退出 3、PG13—20 退出 1;这不是整书验收。余下全书校准与最终 33 项 HTML/PDF 构建仍待完成。
+
+证据:[控制与杂项十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-control-misc-full-issue-version-matrix.json)、[通知与事件十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-notice-events-full-issue-version-matrix.json)、[新快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-control-events-native-validation.json)、[原生提示分类](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-control-events-native-classification.json)、[英文笔误的逐版源码证据](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-events-fixed-source-erratum-proof.json)。
diff --git a/docs/calibration-libpq-environment-20260914.md b/docs/calibration-libpq-environment-20260914.md
new file mode 100644
index 00000000..17c8ced9
--- /dev/null
+++ b/docs/calibration-libpq-environment-20260914.md
@@ -0,0 +1,54 @@
+**PG10—PG20:libpq 环境、连接文件、LDAP、线程与构建说明校准**
+
+从 PG18 开始完整中英对照,并逐项核验其余十版。36 个检查组、396 个版本格:220 格修复、118 格原本正确、58 格不适用。检查组包含技术缺陷、措辞和版本边界,不等于 36 个新增缺陷。正文及本范围原生核验已完成。
+
+主要修复:PG16—18 的 PGLOADBALANCEHOSTS,以及 PG18 的 PGMINPROTOCOLVERSION、PGMAXPROTOCOLVERSION,共五个条目误放在会话默认行为列表,已按本版英文移回连接参数列表。PG18—20 的连接服务文件引言补齐 service 关键字;十一版修正 Either service file、文件与环境变量优先级、密码文件的组及其他用户权限说明。PG14—20 恢复 LDAP 连接失败时的后备说明,并将“与 LDIF 一起创建”改为“使用 LDIF 创建”。
+
+十一版同时校准构建与编译、链接的区别,修正未指定头文件或选项的条件,补译 pg_config/pkg-config 可见索引。保留各版 HOME 查找、servicefile、OAuth 环境变量、PG17 起线程安全及 PG18 起 Curl 条件等边界;恢复三版 Curl 条件强调标签。
+
+修=已修复;核=该项原本正确;无=不适用。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LQEN-001 PGLOADBALANCEHOSTS 混入会话默认行为列表 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 核 | 核 |
+| C19-LQEN-002 PG18 最低与最高协议版本变量列表归属 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 核 | 核 |
+| C19-LQEN-003 连接默认值条件和引言句序 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-004 逐变量参数映射及 TLS、认证、GSS 版本边界 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQEN-005 同时设置 PGREQUIRESSL 与 PGSSLMODE 的效果 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-006 旧版 PGSERVICEFILE 文件名说明标点 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 无 | 无 |
+| C19-LQEN-007 PG19 起 PGSERVICEFILE 使用连接参数 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 |
+| C19-LQEN-008 PG19 起 PGOAUTHCAFILE 变量 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 |
+| C19-LQEN-009 会话默认项、系统配置及本地化目录 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQEN-010 PG18 起 HOME 和有效用户目录查找 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 |
+| C19-LQEN-011 密码文件权限中的所属组及其他用户 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-012 密码文件提示注释、通配与主机匹配说明 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-013 密码文件默认位置、转义与复制专用项 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQEN-014 PG18 起缺 service 关键字 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQEN-015 服务名称关联和无需重新编译的说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-016 Either service file 误作或者服务文件 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-017 服务文件、环境变量和连接字符串的优先级 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-018 逐用户和系统文件路径及 PG19 多余标签 | P3 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 核 |
+| C19-LQEN-019 服务配置示例可见注释 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-020 LDAP 配置段与 RFC 格式引导句 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-021 LDAP 无法连接时继续处理和后备项 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-022 使用 LDIF 创建误作与 LDIF 一起创建 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-023 LDAP 混合配置注释保留参数标识符 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-024 PG17 起始终线程安全与早期编译选项 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQEN-025 PGconn 和 PGresult 并发访问限制 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQEN-026 弃用接口替代说明及 PQcancel 的本版差异 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-027 PG18 起 Curl 初始化条件的强调标签 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQEN-028 Kerberos 协作锁及 PG19 起回调接口 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQEN-029 多线程程序节标题 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-030 构建包含编译和链接的定义 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-031 未包含头文件及未指定选项的条件 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-032 链接 libpq 库误作编译进去 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-033 头文件目录、编译选项和可移植性说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-034 pg_config 与 pkg-config 可见索引漏译 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-035 遗漏 -lpq 说明的正文标点 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEN-036 构建命令、错误输出与选项顺序 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+
+完整阅读 81 个初始段落变体、3 个 API 变体和 15 个框架;按变量名重新配对全部 44 个环境变量变体,核对每版完整列表及顺序。复读 24 个最终修改变体、4 个外层段落变体、4 个线程和构建框架及 3 类标签空白修订。对应 687 个实际叶段、33 个环境外段、11 个 API 条目;209 个代码块保持本版代码和错误输出,仅调整两类原有注释。
+
+66 个完整逐版范围与审定稿、固定英文、原生解包英文和新快照精确一致,零漂移、零范围内提示。`git diff --check` 通过。全书原始审计退出码仍为 PG10—12 的 3 和 PG13—20 的 1;全书语义校准、历史证据对账和最终 33 项构建仍未完成。
+
+证据:[逐问题十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-environment-full-issue-version-matrix.json)、[完整审定父块](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-environment-full-finalized-parent-plans.json)、[变量列表归属](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-environment-full-list-membership-proof.json)、[新快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-environment-native-validation.json)。
diff --git a/docs/calibration-libpq-examples-20260914.md b/docs/calibration-libpq-examples-20260914.md
new file mode 100644
index 00000000..2d22ed78
--- /dev/null
+++ b/docs/calibration-libpq-examples-20260914.md
@@ -0,0 +1,27 @@
+**PG10—PG20:libpq 示例与章首校准**
+
+从 PG18 起完整阅读三个示例,再核对五个英文框架变体、全部十一版中文程序和版本差异。修复 PG16—20 仍保留的 HAVE_SYS_SELECT_H 条件编译;PG19 查询与注释中的 SQL 大小写及多余 standard_conforming_strings 设置按本版英文恢复。保留旧版头文件规则、连接错误输出、字节串转义及各版输出。
+
+41 个原有 C 注释变体均已翻译并复读,内嵌 SQL、输出、文件名和可执行代码单独校验。同步校准示例所在发行包的引言,并恢复 PG13 起章标题的 — 实体。另复读六个章框架和命令执行外层框架,统一五个共用引言段落。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LQEX-001 PG16 起无条件包含 sys/select.h | P2 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEX-002 PG19 查询示例 SQL 及注释大小写 | P3 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 核 |
+| C19-LQEX-003 PG19 多余 standard_conforming_strings 设置 | P3 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 核 |
+| C19-LQEX-004 程序原有可译注释 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEX-005 示例所在源代码发行包的引言 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEX-006 PG13 起章标题的上游 mdash 实体 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQEX-007 旧版连接失败输出与新版本差异 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQEX-008 各版示例字节串、转义与预期输出 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQEX-009 通知次数、事务和资源清理行为 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQEX-010 三个程序的接口、数组、消息与 SQL 顺序 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQOUT-001 章首 C 应用程序编程接口定义 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQOUT-002 底层应用接口与用户可见行为 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQOUT-003 章末示例及源代码发行包引言 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQOUT-004 头文件包含和库链接两项要求 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 核 | 修 | 修 | 修 |
+| C19-LQOUT-005 连接建立后的命令执行引言 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+
+这 15 个检查组包含措辞、已正确条件和本版差异,不能视为 15 个新增缺陷。示例与章首修订已纳入十一版全章新快照核验,代码有完整审定父块及专门的 33 个程序比对记录。`git diff --check` 通过;尚未执行最终 HTML/PDF 构建或示例运行测试。
+
+证据:[全部程序比对](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-examples-full-finalized-raw-proof.json)、[最终注释](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-examples-full-finalized-comment-final-read.json)、[全章源码覆盖](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-whole-source-coverage.json)。
diff --git a/docs/calibration-libpq-execution-20260914.md b/docs/calibration-libpq-execution-20260914.md
new file mode 100644
index 00000000..1df973a6
--- /dev/null
+++ b/docs/calibration-libpq-execution-20260914.md
@@ -0,0 +1,92 @@
+**PG10—PG20:libpq 查询执行、结果读取和转义校准**
+
+本批从 PG18 开始,完整阅读四个执行子节,再逐项核对其余十版。69 个检查组、759 个版本格涵盖技术错误、漏译、版本适用性、术语及措辞;600 格修复、126 格本版原本正确、33 格不适用。这些检查组不等于 69 个新增缺陷。正文与本批新快照核验已完成。
+
+主要修复如下:
+
+- PG13—20 的 `PQresultErrorMessage` 把“没有错误”条件译反;PG14—20 的详细错误消息说明误解了指定详细程度后的假设条件。
+- PG14—16 的主执行节混入未来 `PGRES_TUPLES_CHUNK`,PG17—20 的结果读取引言反而漏列本版已有的分块状态;PG14 的命令行数说明还混入两处未来 `MERGE`。
+- PG14—20 把 C 类型 `Oid` 写成 `oid`;PG13—20 漏译标识符转义条件中的否定,并弱化了释放结果内存的要求。
+- 校准类型修饰符、格式代码、实际数据长度、零字节结尾、null 值与空指针、预备语句、错误字段、bytea 引号和内存有效期。保留本版类型头文件、旧协议限制和命令集合。
+
+修=本轮修复;核=就该问题核对本版英文后原本正确;无=本版不适用。技术上已正确的格子可能同时接受措辞润色。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LQM-001 PQexec 严重错误的举例与空指针含义 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-002 resultFormat 无法逐列选择结果格式 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-003 参数 null、空指针及二进制表示的说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-004 nParams 仅统计预先指定类型的参数 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-005 PQprepare 返回空指针不等于空结果集 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-006 执行预备语句的名称、解析与规划 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-007 PQdescribePrepared 预备语句术语 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-008 PQdescribePortal 遵守 portal 不翻译规则 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-009 关闭预备语句及 portal 时无操作的说明 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-LQM-010 旧版结果状态说明混入 PGRES_TUPLES_CHUNK | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| C19-LQM-011 单行模式统一译名 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-012 状态枚举值与状态码说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-013 PQresultErrorMessage 无错误条件反译 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-014 错误字符串由 PQclear 释放的生命周期 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-015 详细错误消息应按指定详细程度重新生成 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-016 非错误结果的诊断字符串保持本版原样 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-017 错误报告字段与 SQL 域的术语区分 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-018 非本地化严重性及 PostgreSQL 9.6 起的范围 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-019 诊断对象应为现存对象而非同类对象 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-020 错误上下文、事实与数据类型说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-021 错误信息折行与段落分隔 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-022 PQclear 的 NULL 无操作条款仅 PG16 起存在 | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQM-023 参数引用与转义的优势 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-024 类型转换提示中服务器选择类型的主语 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-025 数值形式的类型 OID 与类型不匹配说明 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-026 PGresult 访问函数误译为存储器函数 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQM-027 协议 2.0 限制仅保留在本版原文仍有处 | CHECK | 核 | 核 | 核 | 核 | 无 | 无 | 无 | 无 | 无 | 无 | 无 |
+| C19-LQM-028 描述函数的 NULL 名称在十一版均有效 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQM-029 预备语句删除段落与新关闭函数的版本边界 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQR-001 PG14 命令行数说明混入未来 MERGE | P2 | 无 | 无 | 无 | 无 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQR-002 PG17 起结果读取引言漏列分块状态 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-LQR-003 C 类型 Oid 大小写被误改 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-004 类型修饰符误译为修饰符类型 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-005 多数数据类型不使用修饰符的说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-006 格式代码遵守现行术语表 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-007 查询列与表列的列号区别 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-008 各种数据类型并非多个数据类型 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-009 零字节结尾与二进制数据内嵌零字节 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-010 字段值与 SQL 域术语区分 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-011 null 字段、空字符串与空指针区别 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-012 结果数据所属存储及生命周期 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-013 实际数据长度误作真值长度 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-014 二进制长度为必不可少的信息 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-015 PG16 起其他结果类型不再称查询类型 | P3 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-016 PQfsize 返回内部表示大小 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-017 列名转小写及 SQL 查询结果示例引导 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-018 PQprint 分页器、字段和空指针数组注释 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-019 PQprint 可选列名输出与旧用途 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-020 PQbinaryTuples 弃用范围与推荐函数 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-021 命令行数说明中的预备查询术语 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-022 PQoidStatus 弃用并非删除函数 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-023 索引中残留的英文位置说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-024 null 值的可见索引 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-025 OID 的可见索引 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-026 标识符转义条件漏译否定 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-027 标识符转义结果必须释放 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-028 转义输入长度不包含末尾零字节 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-029 反斜杠和相关例程表述 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-030 字符串字面量与调用者提供的引号 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-031 转义缓冲区至少为两倍长度加一字节 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-032 无效多字节编码、错误消息与输出串 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-033 旧转义函数不接受连接参数 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-034 behind the scenes 与安全隐患措辞 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-035 旧转义函数的弃用关系 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-036 二进制数据转义为 bytea 字面量的含义 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-037 bytea 转义结果不含外围单引号 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-038 bytea 输入输出长度与末尾零字节 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQR-039 PQunescapeBytea 的完整反向转换说明 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQR-040 类型 OID 头文件位置及协议 3.0 前限制 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+
+完整阅读覆盖 103 个英文 API 条目变体及全部中文候选、448 个实际 API 条目、19 个外层段落变体和 5 个节框架。全部最终条目、完整外框及所有权/假设条件精炼均已复读。481 个代码块中仅校准 11 个 `PQprint` 块内原有的可见注释;C/SQL 语法、签名与标识符保持自身版本。
+
+四个子节共 44 个逐版范围与当前源码、审定稿、固定英文和新解析快照一致,零漂移。主执行节的 40 个提示逐项绑定到既有查询参数 ID;另外三个子节没有范围内结构提示。`git diff --check` 通过。
+
+本批仅关闭 `libpq-exec` 下的四个子节。libpq 剩余章节、整书通读、历史证据对账与最终 33 项 HTML/A4/US 构建仍未完成。原始整书结构审计退出码仍为 PG10—12 的 3、PG13—20 的 1,不能报告为整书验收通过。
+
+证据:[主执行逐问题矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-main-full-issue-version-matrix.json)、[结果与转义逐问题矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-result-full-issue-version-matrix.json)、[主执行原生核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-main-native-validation.json)、[结果与转义原生核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-result-native-validation.json)、[完整结果与转义审定稿](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-result-full-approved-parent-plans.json)。
diff --git a/docs/calibration-libpq-flow-20260914.md b/docs/calibration-libpq-flow-20260914.md
new file mode 100644
index 00000000..3d9bde90
--- /dev/null
+++ b/docs/calibration-libpq-flow-20260914.md
@@ -0,0 +1,75 @@
+**PG10—PG20:libpq 异步、管道、分块读取与取消接口校准**
+
+本批从 PG18 开始,完整核对十一版的异步处理、管道模式、单行/分块读取和取消查询。55 个检查组、605 个版本格包含 297 格修复、131 格原本正确、170 格不适用和 7 格固定英文自身疑义;不是 55 个新增缺陷。正文修复及本批原生解析核验均已完成。
+
+主要修复:PG14 的异步与管道使用说明混入后续版本限制;PG17—20 漏译有限行数读取、同步关闭接口和 PQsendPipelineSync 错误恢复说明;PG14—20 将显式事务例外译成“除非”,并将双向阻塞译成“阻止”。同时补齐零行结果立即返回、重复函数和类型标记,校准缓冲区发送、同类函数、取消接口弃用术语及可见索引。
+
+修=已修复;核=就该问题本版原本正确;无=本版不适用;疑=固定英文自身存在待上游澄清的表述,保留忠实译文。管道首次出现在 PG14,分块读取和新取消接口从 PG17 起存在;PG10—13 的协议 2.0 限制、PG10/11 的非阻塞重试文本、PG17 的状态标记均按各自英文保留。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LQA-001 PG14 PQsendQuery 混入 PG15 起的管道限制 | P2 | 无 | 无 | 无 | 无 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQA-002 PG17 起引言遗漏有限行数读取 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-LQA-003 异步提交成功与等待结果的区别 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-004 查询参数独立指定与单命令限制 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-005 预备语句的创建与按名称执行 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-006 portal 遵守不翻译词表 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-007 非空结果指针与读取完成条件 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-008 读取输入与返回值不表示读到数据 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-009 缓冲输入清除 select 可读就绪指示 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-010 非阻塞输出缓冲区等待发送的说明 | P3 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-011 PQflush 发送队列、返回值与非阻塞条件 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-012 大型结果可能不适合完整缓冲 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-013 同步异步接口成对对应关系 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-014 多个命令结果分别读取与重叠处理 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-015 主循环就绪检测与读取调用次序 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-016 发送阻塞、长命令与 COPY IN 的关系 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-017 同时等待读写并读取服务器输出避免互相阻塞 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQA-018 协议 2.0 的版本限制 | CHECK | 核 | 核 | 核 | 核 | 无 | 无 | 无 | 无 | 无 | 无 | 无 |
+| C19-LQA-019 PG17 起异步关闭接口及结果调用列表 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 |
+| C19-LQA-020 管道同步结果与错误后的读取规则 | CHECK | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQA-021 取消后仍须正常读取结果及取消 API 版本 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQA-022 PQisBusy 和 PQisnonblocking 返回语义 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQA-023 PG10/11 旧非阻塞重试段的本版适用性 | CHECK | 核 | 核 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 |
+| C19-LQF-001 PG14 混入后续版本的管道使用限制 | P2 | 无 | 无 | 无 | 无 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQF-002 PG17 起漏列同步关闭预备语句和 portal 接口 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-LQF-003 PG17 起错误恢复漏列 PQsendPipelineSync | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-LQF-004 显式事务例外说明误译为除非 | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-005 双向阻塞误译为阻止操作 | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-006 查询队列、网络往返与两种阻塞模式 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-007 连接状态、进入和退出管道的条件 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-008 同步消息链接文字与同步点作用 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-009 PQsendPipelineSync 不自动发送缓冲数据 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-LQF-010 服务端与客户端缓冲区的发送区别 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-011 管道结果读取与队列匹配 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-012 非阻塞事件循环与交错处理标题 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-013 管道使用场景、延迟与性能代价 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-014 客户端依赖结果与服务器端交换信息 | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-015 读改写示例的两条可见注释 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-016 管道化和批处理模式可见索引 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-017 各版发送 API、同步结果与单行模式位置 | CHECK | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQF-018 固定英文首个错误状态的内部表述疑义 | SOURCE_DOUBT | 无 | 无 | 无 | 无 | 疑 | 疑 | 疑 | 疑 | 疑 | 疑 | 疑 |
+| C19-LQF-019 零行结果立即返回的限定遗漏 | P2 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 |
+| C19-LQF-020 普通 PGresult 类型标记与查询归属 | P3 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 |
+| C19-LQF-021 同类函数译法与单行分块调用时机 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-022 分块上限、零行终止与失败后撤销操作 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQF-023 PGcancelConn 完整类型引用 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-LQF-024 取消轮询遗漏重复函数标记与连接描述 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-LQF-025 旧取消函数弃用术语 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQF-026 取消查询与取消错误消息索引 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-LQF-027 取消连接加密和认证参数适用性 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 |
+| C19-LQF-028 取消请求已发送不保证实际生效 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQF-029 取消超时、状态和套接字有效期 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 |
+| C19-LQF-030 取消对象重置、释放与错误字符串生命周期 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 |
+| C19-LQF-031 旧取消接口的信号处理和线程安全边界 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQF-032 PG17 状态标记与 PG18 起结构差异 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 |
+
+阅读覆盖 68 个完整英文 API 变体及全部中文候选、270 个实际条目、76 个外层段落变体和 20 个框架。修改后的完整单元均已复读,并检查自身版本差异。288 个代码块保持自身 C/SQL 语法,只有 PG14—20 的读改写示例各翻译两条可见 SQL 注释。
+
+40 个完整逐版范围与当前源码、审定稿、固定英文、原生解包英文和新快照精确一致,零漂移。异步节没有范围内结构提示;另三节的 15 个提示均逐项绑定至既有 PQpipelineStatus 状态 ID,已核对完整中英父块、状态名、路径和次序后保留。`git diff --check` 通过。
+
+保留的英文疑义:PG14—20 的结果处理段称首个错误也报告 PGRES_PIPELINE_ABORTED,而错误处理段写首个错误先报告 PGRES_FATAL_ERROR,剩余排队操作才报告 PGRES_PIPELINE_ABORTED。两处本版英文与忠实译文均保留,单独记录,未计为翻译缺陷。
+
+本批不等于全书验收。快速路径、通知和 COPY 修订稿正在复读;libpq 其余章节、全书通读、历史证据对账与最终 33 项 HTML/A4/US 构建仍未完成。整书原始结构审计退出码仍为 PG10—12 的 3、PG13—20 的 1。
+
+证据:[异步矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-async-full-issue-version-matrix.json)、[管道与取消矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-flow-full-issue-version-matrix.json)、[29 完整审定父块](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-flow-full-finalized-parent-plans.json)、[新快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-flow-native-validation.json)、[15 个原生提示逐项处置](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-flow-native-dispositions.json)、[固定英文疑义](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-flow-full-fixed-source-doubts.json)。
diff --git a/docs/calibration-libpq-oauth-20260914.md b/docs/calibration-libpq-oauth-20260914.md
new file mode 100644
index 00000000..eb5e04bf
--- /dev/null
+++ b/docs/calibration-libpq-oauth-20260914.md
@@ -0,0 +1,40 @@
+**PG10—PG20:OAuth 跨文件校准**
+
+从 PG18 起核对 libpq 全部 OAuth 接口、外段、调试项与代码脚注,并扩展到 client-auth、oauth-validators 和 protocol。PG18—20 共 15 个完整父块、12 个文件;PG10—17 根据本版英文确认尚无这些功能。
+
+已修复授权范围、签发者、设备授权的译名不一致,non-NULL 条件、异步回调文件描述符说明和令牌适用组合;恢复协议首次交互第五步的三个原文段落、重新连接说明归属、当前用户有效令牌和两类元数据等限定。保留各版 API、调试行为、八个协议步骤及消息顺序。
+
+26 个检查组 × 11 版,共 286 格:58 格修复、19 格原本正确、209 格不适用。检查组包含缺陷、措辞及已正确的技术边界,不等于 26 个新增缺陷。修=修复;核=原本正确;无=不适用。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LQOA-001 设备授权流程译名及安装说明 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-002 Windows 内置流程限制与自定义流程能力 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 |
+| C19-LQOA-003 认证钩子要求应用程序执行操作及后备行为 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-004 获取钩子、默认行为与进程内生效范围 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 |
+| C19-LQOA-005 完整验证 URI 的 non-NULL 条件 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-006 二维码验证仍显示 URI 和用户代码 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 |
+| C19-LQOA-007 Bearer 令牌适用的用户、签发者与授权范围组合 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-008 异步回调设置 altsock 及轮询顺序 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-009 令牌和清理回调生存期及记录状态措辞 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-010 PG19 起版本 2 结构体强制转换及签发者检查 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 |
+| C19-LQOA-011 调试模式安全与不安全标签、默认值和错误行为 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 |
+| C19-LQOA-012 PG19 起 http 模式与提供者交互的措辞 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 修 | 修 |
+| C19-LQOA-013 OAuth 签名原有 C 注释本地化 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-014 验证器客户端授权的 scope 统一为授权范围 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-015 设备授权客户端与受信任部署脚注 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-016 用户名映射委派中的令牌授权范围 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-017 HBA scope 参数中的授权范围 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-018 无缓存令牌时的两次连接及 libpq 行为 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-019 发现连接的当前用户与有效令牌限定 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-020 GS2 三个可选部分及服务器忽略行为 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-021 不支持通道绑定且不使用 AuthenticationSASLFinal | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 |
+| C19-LQOA-022 首次交互第五步恢复三个完整段落 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-023 客户端已配置及服务器提供的两类元数据 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-024 重新连接说明归位及第六步服务器消息 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-025 OAUTHBEARER 不强制令牌获取方式及结束 SASL | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQOA-026 逐版保留八步骤及协议字段和消息顺序 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 |
+
+全部修改文本及 15 个最终措辞细化绑定复读完成。24 个代码块保留本版代码和输出,仅翻译原有 C 注释;验证器原生提示中的另六个完整条目也已中英对照,语义正确。新快照核验零漂移,三组提示均以三个完整职责条目的精确行号配对关闭;无未决范围提示。全书校准和最终 33 项构建尚未完成。
+
+证据:[逐项十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-oauth-full-issue-version-matrix.json)、[完整审定父块](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-oauth-full-finalized-parent-plans.json)、[新快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-oauth-native-validation.json)、[原生提示全文分类](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-oauth-native-classification.json)。
diff --git a/docs/calibration-libpq-ssl-20260914.md b/docs/calibration-libpq-ssl-20260914.md
new file mode 100644
index 00000000..536c9862
--- /dev/null
+++ b/docs/calibration-libpq-ssl-20260914.md
@@ -0,0 +1,55 @@
+**PG10—PG20:libpq SSL 校准**
+
+从 PG18 起完整阅读 SSL 全节,再逐项核对十个其他版本。37 个检查组、407 个版本格:247 格修复、133 格原本正确、27 格不适用。检查组包括技术缺陷、措辞和版本边界,不等于 37 个新增缺陷。
+
+关键修复:十一版将“不建议依赖 sslmode=require 的兼容验证行为”误译为“鼓励依赖”,现已恢复否定及 verify-ca/verify-full 要求。十一版私钥权限的 world/group 被直译为“世界或组”,已与密码文件统一,并保留 root 所有、0640 和 Windows 例外。PG14 移除混入的 PG15 TLS 引言、SAN/IP 匹配规则及 RFC 6125 注释,恢复其本版说明。
+
+同步修复防护表引导句缺谓语、prefer 将“加密”泛化为“安全性”、冒充攻击译名、CA/MITM 标记,以及信任链、客户端证书、开销和初始化说明。保留 PG18 起旧初始化接口无操作等版本变化。22 个 API 签名块完全不变。
+
+修=已修复;核=该项原本正确;无=不适用。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LQSSL-001 不建议依赖 require 兼容行为被译成鼓励 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-002 PG14 混入未来 TLS 引言与索引 | P2 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQSSL-003 PG14 混入 PG15 SAN 规则和 RFC6125 注释 | P2 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQSSL-004 逐版主机名、通配符和 IP 地址验证边界 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQSSL-005 PG15 起 SAN 缺失条件和匹配对象句序 | P3 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-006 PG15 起 RFC6125 兼容说明和 SAN 复数 | P3 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-007 身份伪造、根自签名证书和信任链 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-008 两端证书链、叶证书与签发共用译文 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-009 沿完整证书链验证与 verify-full 条件 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-010 客户端证书链、私钥和路径主语 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-011 私钥权限 world/group 被译为世界或组 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-012 root 所有者、0640 例外和 Windows 边界 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQSSL-013 PG10 首证书说明恢复上游破折号实体 | P3 | 修 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQSSL-014 PEM 与 DER 支持误作可能格式 | P3 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-015 密钥加密、TTY 和密码回调说明 | P3 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-016 证书创建说明误作指令 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-017 根证书、CRL、环境路径和证书顺序 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQSSL-018 CA 缩写错误使用 literal 标记 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-019 表头缺 MITM 缩写标记 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-020 Impersonation 误作模仿及授权含义 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-021 中间人攻击主体与无法察觉的关系 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-022 三种威胁的译名按序配对及合法本地锚点 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQSSL-023 不同 sslmode 防护级别的引导句 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-024 连接前两端配置 SSL 的前提 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-025 认证后发送敏感数据及此前的顺序 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-026 防护表引导句缺 illustrates 谓语 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-027 prefer 行将 encryption 泛化为安全性 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-028 加密和密钥交换开销的共用译文 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-029 prefer 默认值的兼容目的与建议 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-030 trusted CA 使用规范术语 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQSSL-031 文件用途、证书所有权与信任的区别 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQSSL-032 初始化 API 引言共用译文 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| C19-LQSSL-033 PG18 起初始化接口弃用与无操作语义 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQSSL-034 OpenSSL 1.1.0 例外的 PG10/11 边界 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQSSL-035 PG18 起库名称 literal 被代词省略 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQSSL-036 早期初始化说明统一第二人称 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 无 | 无 | 无 |
+| C19-LQSSL-037 两种表格本版结构与 PG13 起列宽 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+
+阅读 38 个段落变体、12 个 API/威胁条目变体、12 个表行变体、3 个表格框架和 10 个节框架及所有中文候选;复读全部修改文本。覆盖 55 个实际条目、278 个外段、132 个表行及 22 个代码块。
+
+十一版完整 SSL 节与当前审定稿、固定英文、原生解包英文和新快照精确一致,零漂移。37 条原生提示已逐条以行号绑定完整条目或表行:15 个原有本地锚点、11 组三个已翻译威胁标题、11 组按文件名配对的四行文件用途表;无未决范围提示。`git diff --check` 通过。全书审计、剩余校准及最终 33 项构建仍未完成。
+
+证据:[逐问题十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-ssl-full-issue-version-matrix.json)、[完整审定父块](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-ssl-full-approved-parent-plans.json)、[新快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-ssl-native-validation.json)、[逐条原生提示分类及全文证据](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-ssl-native-classification.json)。
diff --git a/docs/calibration-libpq-status-20260914.md b/docs/calibration-libpq-status-20260914.md
new file mode 100644
index 00000000..9ee059a4
--- /dev/null
+++ b/docs/calibration-libpq-status-20260914.md
@@ -0,0 +1,45 @@
+**PG10—PG20:libpq 连接状态章节校准**
+
+本批从 PG18 开始完整阅读连接状态节,再核对其余十版的全部 API 条目、外层段落和版本差异。27 个检查组、297 个版本格包含技术问题、措辞、术语和适用性检查,不代表 27 个独立新增缺陷。180 格修复,84 格原本正确,33 格不适用。正文修复和本批新快照核验均已完成。
+
+主要修复:PG10—14 的 `PQsslAttribute`、`PQsslStruct` 混入了后续版本的返回条件;PG14 多出 PG15 起才有的 SSL 库检测整段;PG13—20 把错误消息“可能包含多行”译成必然包含多行。此外补齐错误消息索引层级,明确 `PQtty` 的 NULL 唯一例外,并校准访问函数、字段、版本号及 NOTIFY 通知等说明。
+
+修=本轮修复;核=就该问题对照本版英文后原本正确;无=本版不适用。F-024 的参数状态列表已重新完整阅读十一版,包括 `scram_iterations`、`search_path`、指针有效期与各自版本范围。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LQS-001 主机名与端口信息生成失败的说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-002 PQhostaddr 的 NULL 与空字符串说明 | P3 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-003 PQtty 的唯一例外与始终为空返回值 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-004 PQoptions 是连接请求中传递的选项 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-005 PQstatus 保留本版状态常量标记 | P3 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 |
+| C19-LQS-006 事务状态的有效事务块措辞 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-007 协议版本说明与旧版协议 2.0 范围 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| C19-LQS-008 服务器版本号两位数字与次版本措辞 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-009 PQerrorMessage 漏译 functions | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-010 错误消息可能含多行而非必然多行 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-011 错误消息索引补齐 PGconn 层级 | P3 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 |
+| C19-LQS-012 PQsocket 的文件描述符编号 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-013 后端 PID 与 NOTIFY 通知的关系 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-014 后端 PID 可见索引未译 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-015 PQsslInUse 布尔返回值语序 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-016 旧版 PQsslAttribute 混入新版返回条件 | P2 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQS-017 PG14 混入 PG15 SSL 库探测整段 | P2 | 无 | 无 | 无 | 无 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQS-018 旧版 PQsslStruct 混入新版 NULL 条件 | P2 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQS-019 PQsslStruct 所请求对象与 SSL 实现的关系 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-020 PG14 OpenSSL 名称应保留同版引号结构 | P3 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQS-021 访问函数获取内容与内部字段术语 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-022 连接与 PGconn 对象的生命周期表述 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQS-023 F024 参数状态列表与指针有效期重新全读 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQS-024 完整协议版本函数仅 PG18 起存在 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 |
+| C19-LQS-025 GSSAPI 认证状态函数仅 PG16 起存在 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQS-026 SSL 属性 ALPN 仅 PG17 起存在 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 |
+| C19-LQS-027 SSL 属性名称扩展说明仅 PG16 起存在 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 | 核 |
+
+完整阅读覆盖 58 个英文条目变体及全部中文候选、9 个外层段落、1 个框架、259 个实际条目;32 个最终条目变体、5 个完整外层框架和 7 个返回条件精炼均已复读。270 个签名/代码块保留原样,除原有可读 C 注释翻译外,与本版英文精确相同。
+
+十一版当前源码、审定稿、固定英文、原生解包英文及新解析快照一致,零漂移。29 个范围内结构提示均为既有 SSL 属性锚点,逐项核对属性名、相邻次序、父路径及完整 API 中英正文后保留。PG14 删除未来段落后遗留的一行空白已单独清理并记录;`git diff --check` 通过。
+
+本批仅关闭 `libpq-status`。执行查询和 libpq 其余节继续校准;全书其他待读范围、历史证据对账和最终 33 项 HTML/A4/US 构建仍未完成。全书原始结构检查退出码仍为 PG10—12 的 3、PG13—20 的 1,不能报告为全书通过。
+
+详细证据:[逐问题十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-status-full-issue-version-matrix.json)、[完整审定父块](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-status-full-accepted-parent-plans.json)、[259 条目绑定](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-status-full-accepted-entry-proof.json)、[新快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-status-native-current-snapshot-proof.json)、[29 条逐项处置](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-status-native-dispositions.json)、[完整父块](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-status-native-parent-proof.json)。
diff --git a/docs/calibration-libpq-transfer-20260914.md b/docs/calibration-libpq-transfer-20260914.md
new file mode 100644
index 00000000..a287b1d1
--- /dev/null
+++ b/docs/calibration-libpq-transfer-20260914.md
@@ -0,0 +1,50 @@
+**PG10—PG20:libpq 快速路径、通知与 COPY 校准**
+
+从 PG18 开始完整阅读三个范围,并逐项核对其余十版。32 个检查组、352 个版本格包含 263 格修复、62 格原本正确和 27 格不适用。这些组包括技术缺陷、措辞和版本边界检查,不等于 32 个新增缺陷。正文及范围内新快照核验已完成。
+
+主要修复:PG14—19 的快速路径参数误允许 1 字节整数,各适用版原文只允许 2 或 4 字节;补齐结果长度的字节单位。PG14—20 的通知通道名称“不必与关系名有关联”被译成绝对无关。十一版的 COPY 终止行“必须仅由反斜杠和点组成”被弱化为包含这两个字符,严重错误被窄化为系统错误。PG13—20 的发送完成主语及显式调用顺序有误,PG18—20 的旧 COPY 接口还漏译 CSV 注意事项。
+
+同步校准数据方向、缓冲指针和内存归属、零字节结尾、读写就绪、已入队与实际发送的区别、可见索引及三条 PGnotify C 注释。保留各自旧协议限制;PG20 英文已移除快速路径整节,故不添加。
+
+修=已修复;核=针对该项原本正确;无=本版不适用。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LQT-001 快速路径误加 1 字节整数参数 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 无 |
+| C19-LQT-002 快速路径结果长度遗漏字节单位 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 无 |
+| C19-LQT-003 快速路径缓冲指针、字节序与结果整数大小 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 无 |
+| C19-LQT-004 快速路径安全警告和替代调用方式 | P3 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 无 |
+| C19-LQT-005 集合值结果与函数种类限制 | P3 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 无 |
+| C19-LQT-006 NULL 参数和结果的旧协议行为 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 无 |
+| C19-LQT-007 快速路径返回状态和结果释放 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 无 |
+| C19-LQT-008 快速路径可见索引 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 无 |
+| C19-LQT-009 通知通道与关系名称不必相关的条件 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-010 PGnotify 字段内存归属与名称 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-011 PGnotify 三条可见 C 注释 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-012 通知函数句中误留英文句点及可见索引 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-013 读取已收通知和轮询方法弃用措辞 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-014 无实际命令时检查通知的条件 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-015 监听、载荷、结果处理与通知读取次序 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LQT-016 COPY 的网络连接和数据传输引言 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-017 COPY 状态和元数据引导 | P3 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-018 COPY 字段函数索引与旧函数弃用说明 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-019 发送缓冲区分块边界没有语义作用 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-020 写就绪、入队和实际发送的区别 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-021 严重错误误作仅限系统错误 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-022 返回缓冲指针与 NULL、完整行接收 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-023 COPY 接收和发送的零字节结尾 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-024 终止行必须仅由反斜杠和点组成 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-025 PQgetline 换行符、长度和返回值 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-026 异步读取整行与部分行、缓冲大小 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-027 PG18 起 PQputline 漏译 CSV 限制 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-LQT-028 应用通知服务器发送完成的主语 | P2 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-029 PQendcopy 的显式调用和多命令结果循环 | P3 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-030 COPY 完成后恢复正常操作的次序 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LQT-031 协议 2.0 元数据及强制失败限制 | CHECK | 核 | 核 | 核 | 核 | 无 | 无 | 无 | 无 | 无 | 无 | 无 |
+| C19-LQT-032 COPY 格式代码、方向与二进制列 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+
+阅读覆盖 25 个完整英文 API 变体及全部中文候选、34 个外层段落变体和 8 个框架;对应 121 个实际条目、238 个外层段落。26 个最终条目变体、24 个修改段落和 6 个修改框架已复读。109 个代码块保持自身 C 签名与语法,仅 11 个 PGnotify 块内各三条原有可见注释本地化。
+
+32 个完整逐版范围与当前源码、审定稿、固定英文、原生解包英文和新快照精确一致,零漂移、零范围内结构提示。`git diff --check` 通过。全书原始审计仍为 PG10—12 退出 3、PG13—20 退出 1;libpq 余下内容、整书语义阅读、历史证据对账与最终 33 项构建尚未完成。
+
+证据:[逐问题十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-transfer-full-issue-version-matrix.json)、[完整审定中英父块](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-transfer-full-parent-plans.json)、[新快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-transfer-native-validation.json)、[代码保护核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-transfer-full-raw-proof.json)。
diff --git a/docs/calibration-libpq-whole-20260914.md b/docs/calibration-libpq-whole-20260914.md
new file mode 100644
index 00000000..dcad7c7e
--- /dev/null
+++ b/docs/calibration-libpq-whole-20260914.md
@@ -0,0 +1,15 @@
+**PG10—PG20:libpq 全章校准结果**
+
+十一版 libpq 全章已按完整中英语义单元完成本阶段校准,并以修订后的新快照核验。原始阅读清单覆盖 468 个条目变体、336 个段落变体、12 个表行变体、3 个表格框架、94 个节框架、6 个章框架及 225 个代码变体;相同英文的所有不同中文候选均按本版核对。
+
+最终源码覆盖 537 个节范围及 2,079 个本版英文代码块。526 个节直接匹配完整审定父块;11 个命令执行父节由已读外层框架和四个完整子节组成。十一版当前源码、审定稿、新快照、固定英文与原生解包英文对应一致。
+
+累计 398 个检查组、4378 个逐版格:ALREADY_CORRECT=987、FIXED=2712、NOT_APPLICABLE=667、RETAINED_SOURCE_DOUBT=7、REVIEWED_EXCEPTION=5。这些格包含缺陷修复、措辞、原本正确的条件、不适用与源文疑点,不能当作新增缺陷数量。
+
+主要修复包括旧版混入未来功能、参数归属、容量与字节单位、返回值和 NULL 条件、内存与对象生存期、读写与发送顺序、并发与回调条件、SSL 反义及版本规则、OAuth 跨文件遗漏、代码示例不同步和原有可译注释。完整逐项状态见[十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-whole-issue-version-matrix.json)。
+
+最初 87 条配对信号中,86 条来自合法的已翻译标签,另 1 条为 PG14 混入未来证书说明,已修复。最终原生检查保留 222 条提示:193 个既有本地 ID、17 组匿名单元配对、11 组文件用途表行、1 条 PG14 英文错误 API 名所致引用差异。每条均重新按当前行号绑定完整审定文本或对应版本源码勘误证据,零未决提示、零源码漂移。
+
+这次关闭的是 libpq 全章的语义及源码结构核验。**其余全书语义校准、历史修复对账和最终 33 项 HTML/A4 PDF/US PDF 构建仍未完成。** 原生工具的全书原始退出码仍保留,不把合法定制忽略掉或降低检查强度;本报告也不把它们冒充全书构建通过。
+
+证据:[全章逐节覆盖](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-whole-source-coverage.json)、[代码覆盖](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-whole-source-raw-coverage.json)、[原始信号处理](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-whole-source-initial-signal-closure.json)、[新快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-whole-native-validation.json)、[222 条全文分类](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/libpq-whole-native-classification.json)。
diff --git a/docs/calibration-lobj-20260914.md b/docs/calibration-lobj-20260914.md
new file mode 100644
index 00000000..17d15bf6
--- /dev/null
+++ b/docs/calibration-lobj-20260914.md
@@ -0,0 +1,41 @@
+**PG10—PG20:大对象全章校准结果**
+
+从 PG18 开始,完整核对十一版 `lobj.sgml` 的本版英文与全部中文变体:57 个段落变体、8 个表行变体、3 个表框架、29 个节框架、1 个章框架和 33 个代码变体。修订稿的八个段落变体、三个旧版接口签名变体及全部注释已复读。最终覆盖 176 个节、522 个段落、44 个表行和 231 个代码块。
+
+主要修复:PG15/16 的 `lo_lseek64`、`lo_tell64`、`lo_truncate64` 误用未来的 `int64_t`,已依据各版头文件恢复 `pg_int64`;PG18 起保留 `int64_t`。十一版服务器端文件导入、导出权限的表述明确为“运行数据库服务器的操作系统用户”,依据各版后端实现核实。另修正 PG16 示例版权年份,校准缓冲区长度、截断对象、零字节、分块建议和原有可译索引、注释。
+
+以下 25 个检查组含缺陷、措辞、原本正确项、版本差异与英文疑点,不是 25 个新增缺陷。修=已修;核=本版原本正确;无=本版没有该说明;源疑=固定英文自身疑点,按源文保留。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-LO-001 lo_lseek64 的本版 64 位类型 | P2 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 核 | 核 | 核 | 核 |
+| C19-LO-002 lo_tell64 的本版 64 位类型 | P2 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 核 | 核 | 核 | 核 |
+| C19-LO-003 lo_truncate64 的本版 64 位类型 | P2 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 核 | 核 | 核 | 核 |
+| C19-LO-004 服务器文件访问使用操作系统账号权限 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LO-005 PG16 示例误用未来版权年份 | P3 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 |
+| C19-LO-006 大对象和 TOAST 对照的可见索引 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LO-007 lo_write 缓冲区长度的指代 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LO-008 截断对象与描述符的关系 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LO-009 扩展大对象时的零字节 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LO-010 读写分块长度的建议措辞 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LO-011 示例所在源代码发行包 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LO-012 原有 C 与 SQL 注释本地化 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-LO-013 读写、截断及所有者权限 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-014 PG11 起 lo_open 的权限检查时机 | CHECK | 无 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-015 PG16 起只读事务限制说明 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-016 PG14 起管道模式限制说明 | CHECK | 无 | 无 | 无 | 无 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-017 PG15 创建接口顺序与 mode 历史兼容 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-018 SQL 表格行、签名及 PG13 布局差异 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-019 2 GB 偏移、长度与错误返回 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-020 4 TB 与 1 GB 容量及稀疏分配 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-021 客户端文件与 PG11 起 GRANT 说明 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-022 实际读写字节数与 INT_MAX 限制 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-023 截断后位置不变及扩展行为 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-024 关闭、移除及事务结束自动关闭 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-LO-025 固定英文示例对负数读返回的处理顺序 | SOURCE | 源疑 | 源疑 | 源疑 | 源疑 | 源疑 | 源疑 | 源疑 | 源疑 | 源疑 | 源疑 | 源疑 |
+
+十一版新快照已完成原生准备和审计。当前中文、审定稿、新快照、固定英文与解包英文精确一致,全部 176 个节精确对应已读父块,范围内零未决提示、零漂移。完整代码与本版英文逐一核验,除已审定的原有注释本地化和上述版本订正外,代码、标识符及输出保持一致。
+
+固定英文示例 `pickout` 在检查 `lo_read` 的负数返回值之前使用 `buf[nbytes]`,十一版均保留本版代码并单列源文疑点;未声称执行测试。大对象范围 `git diff --check` 通过。工作区同期其他任务的 `ddl.sgml` 修改曾产生全局空白提示,未据本批范围检查声称全局通过。全书校准、历史对账及最终 33 项 HTML/A4 PDF/US PDF 构建仍未完成。
+
+证据:[十一版逐项矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/lobj-full-issue-version-matrix.json)、[API 与权限实现](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/lobj-source-api-permission-proof.json)、[完整代码对照](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/lobj-full-raw-proof.json)、[新快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/lobj-native-validation.json)、[176 节绑定](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/lobj-native-scope-coverage.json)。
diff --git a/docs/calibration-protocol-front-20260914.md b/docs/calibration-protocol-front-20260914.md
new file mode 100644
index 00000000..7bab006d
--- /dev/null
+++ b/docs/calibration-protocol-front-20260914.md
@@ -0,0 +1,79 @@
+**PG10—PG20:协议概述与消息流校准结果**
+
+已从 PG18 起完整阅读十一版的协议章首、概述与消息流,包括启动、简单和扩展查询、管道、函数调用、COPY、异步消息、取消、终止、SSL 和 GSSAPI。覆盖 158 个外层段落变体、28 个一般消息条目变体、22 个补充启动条目变体、10 个启动段落变体、14 个表行变体、5 个表框架、33 个节框架及 2 个章框架;20 个 SSL/GSSAPI 完整父节按七组完整差异复读。
+
+主要修复:PG15—17 的启动条目混入 PG18 说明,PG11—17 管道 DDL 条件误用 PG18 规则,PG14—16 混入新版 SSL 握手段落;十一版 RowDescription/DataRow 先后顺序、Sync 消息名、COPY 的或关系与可能性限定、数据字段指代、取消机制效率和 core dump 误译;PG14—20 的 GSSAPI 长度前缀,以及 PG18—20 的协议 3.2 消息变更说明。
+
+修订稿的 61 个变体、8 个精炼变体和 3 个外框变体均已复读。40 个程序块与本版英文精确相同;PG11 仅移除本版英文没有的隐藏注释,保留示例故意写错的 SELCT。删除未来段落后产生的九处空行尾空白已定点清理,协议范围 `git diff --check` 通过。
+
+下面是 61 个检查组、671 个逐版格:修=已修;核=本版原本正确;无=本版没有该处说明。检查组也包含措辞和已正确条件,不能当作新增缺陷数量。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| C19-PF-001 启动时额外认证的方法与可选条件 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-002 NegotiateProtocolVersion 的本版消息流程 | P2 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 |
+| C19-PF-003 BackendKeyData 的本版第三方实现说明 | P2 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 |
+| C19-PF-004 RowDescription 在 DataRow 之前发送 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-005 函数调用仅返回标量,结果集合并非集合类型 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-006 启动与正常操作阶段 | P3 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-007 正常操作的前后端驱动关系 | P3 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-008 连接终止时在进程退出前回滚 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-009 数据值文本表示与空字符 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-010 解析、绑定和执行引言排版 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-011 行集与 COPY 查询响应 | P3 | 修 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-012 状态机接收合理消息而非假设固定顺序 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-013 多语句作为单个事务执行 | P3 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-014 隐式事务块的定义与自动关闭 | P3 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-015 显式事务块的延续和合并 | P3 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-016 无 BEGIN 的提交或回滚可能是误操作 | P2 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-017 首个错误终止多语句消息 | P3 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-018 执行任何语句前先解析整串查询 | P2 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-019 Execute 消息名及响应约束 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-020 Execute 阶段恰好一条终止响应 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-021 必需操作与可选操作 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-022 管道化术语与在途查询 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-023 整组查询作为单个事务 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-024 Sync 消息名与独立提交边界 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-025 各版管道 DDL 执行条件 | P2 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| C19-PF-026 按 Sync 消息数量判断完成 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-027 pg_proc 系统目录与执行权限 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-028 旧函数调用协议的替代方式 | P3 | 核 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 |
+| C19-PF-029 函数调用周期和响应顺序 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-030 CopyDone 允许成功结束 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-031 COPY 输入中 Flush 或 Sync 的例外 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-032 COPY 输出启动和中止传输 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-033 COPY 输出异步消息与可选终止判断 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-034 双向 COPY 的强调标记 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-035 COPY 列数和格式代码字段 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-036 同一通道的 NOTIFY 触发条件 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-037 取消请求使用新连接且无直接响应 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-038 取消请求的密钥数据及中止行为 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-039 取消机制考虑安全性和效率 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-040 core dump 不应译成内核转储 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-041 断连前事务可能提交的限定 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-042 SSL 说明遵守各版适用范围 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| C19-PF-043 GSSAPI 初始化长度前缀及本版 RFC 链接 | P2 | 无 | 无 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-044 SSL 错误不得展示给用户的条件 | P2 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-045 GSSAPI 错误不得展示给用户的条件 | P2 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-046 SSL 单字节握手及额外数据处理 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-047 GSSAPI 单字节握手及额外数据处理 | P3 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-048 新版 SSL 提前协商的断连条件与遗漏标记 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-PF-049 新版直接 SSL 协商及通用工具适用性 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 |
+| C19-PF-050 SSL 取消请求引言 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-051 GSSAPI 取消请求引言 | P3 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-052 SSL 在认证检查中拒绝未加密会话 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-053 GSSAPI 在认证检查中拒绝未加密会话 | P3 | 无 | 无 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-054 SSL 可切换 GSSAPI 段落括号 | P3 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| C19-PF-055 协议 3.2 密钥长度与两种消息变更 | P2 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-PF-056 协议 3.1 保留原因的完整表述 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 修 | 修 |
+| C19-PF-057 协议防僵化测试排版 | P3 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 修 | 核 |
+| C19-PF-058 章首协议 3.0 与 3.2 的版本说明 | P3 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 |
+| C19-PF-059 ParameterStatus 全部参数及历史版本界线 | CHECK | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| C19-PF-060 PG19 beta 默认 3.9999 及显式绕过方式 | CHECK | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 无 | 核 | 无 |
+| C19-PF-061 本版多语句示例中的隐藏注释 | P3 | 无 | 修 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+
+十一版新快照原生核验完成,22 个完整父节、189 个节范围和 11 个章外框与当前源码及审定稿精确一致。169 条范围提示已逐项绑定完整中英文本:165 个既有本地 ID、4 条来自同一个已翻译跨列表行的配对提示。另保留四版原有 ALPN 标识的 literal 加亮,字面值与英文一致;没有遗漏的受保护行内标记。
+
+本报告只关闭上述范围。SASL/SCRAM 修订稿已读、尚未应用;复制协议、消息格式等仍在继续。全书语义校准、历史修复对账和最终 33 项 HTML/A4 PDF/US PDF 构建仍未完成。
+
+证据:[十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/protocol-front-full-accepted-issue-version-matrix.json)、[新快照验证](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/protocol-front-native-validation.json)、[169 条全文分类](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/protocol-front-native-classification.json)、[逐节覆盖](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/protocol-front-full-scope-coverage.json)、[40 个本版代码块](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/protocol-front-full-raw-proof.json)。
diff --git a/docs/calibration-protocol-whole-20260914.md b/docs/calibration-protocol-whole-20260914.md
new file mode 100644
index 00000000..d1ccb141
--- /dev/null
+++ b/docs/calibration-protocol-whole-20260914.md
@@ -0,0 +1,163 @@
+PG10—PG20 协议全章校准记录(2026-09-14)
+
+十一版 `protocol.sgml` 全章已完成中英对照、正文修复、共用译文校准与本批原生解析验收;另核对了 PG19/20 移到 `logicaldecoding.sgml` 的完整 pgoutput 参数节。**全书校准、历史台账最终对账与 33 项最终 HTML/A4/US PDF 构建尚未完成。**
+
+最重要的新增修复是 PG18—20 BackendKeyData 的字段类型仍沿用旧协议:长度字段 Int32(12) 改为本版 Int32,密钥字段 Int32 改为 Byte n;PG17 则移除错误混入的可变长密钥说明,保留本版 4 字节定义。PG18 StartupMessage 编码恢复为 196610;PG14—17 的次版本说明恢复为 0。PG19/20 保留其本版泛化的 Int32 定义。
+
+此外,补齐 PG14 AuthenticationSCMCredential,移除 PG14 CommandComplete 中未来的 MERGE 标签、逻辑复制流程中的 Begin Prepare/Prepare 句及 Relation 中未来的发布列列表限定。PG18—20 Relation/TupleData 移除过时的生成列排除条件;PG10—17 按各自英文保留对应限制。恢复 PG10—17 引言中的 CopyData 例外,明确 NULL 与零长度值、SASL 偏好顺序、初始响应长度、消息名、错误字段关系与现存对象等。
+
+SASL/SCRAM 已校准服务端响应方向、must 限定、通道绑定、UTF-8/SASLprep 回退和 pass-through 随机值;复制命令已修正 PG15 timeline 的 int4 类型、PG15/16 未来 ALTER_REPLICATION_SLOT、PG17 未来 TWO_PHASE 选项、PG17+ 布尔参数省值说明、时间线所属关系、WAL 刷盘及 catalog_xmin 等。本表与证据分别保留各版本的适用性。
+
+完整初读覆盖 284 个条目变体、258 个外段变体、14 个表行变体、5 个表框架、59 个节框架、2 个章框架和 6 个原样代码变体。条目包含其完整内部段落与字段。相同英文复用已读译文,版本差异逐一核对;全部新写译文复读。后六节的 350 个英文文本族、4318 处实际文本均有精确绑定,另有 26 个迁移参数段。
+
+新 checkpoint-protocol-whole-final 以十一份独立中文快照执行准备和原生审计。13 个目标文件的当前正文、审定稿、快照、固定英文与上游解包英文精确一致;324 个协议范围和 2 个迁移参数节、51 个代码块逐一绑定,零漂移。prepare 全部为 0;整书 raw audit 的 3(PG10—12)/1(PG13—20)是既有全书提示,范围通过以逐条分类结果为依据。
+
+2725 条范围提示分别为:2367 个既有自定义 ID、290 个匿名字段组、59 个 PG14 既有段落/列表包装差异、3 组保留的准确附加链接、2 条针对同一个 PG15 兼容锚点的提示,以及 4 条译文跨列表行提示。每条均绑定完整已读中英父块及准确位置,未决项为零。21 条初始路由信号全部处置,其中 11 条是英文自身在两个启动阶段重复列出 ErrorResponse,不计缺陷。
+
+下列 139 个问题或回归组各有十一格,共 1529 格:1000 格修复/校准、388 格原本正确、141 格本版不适用。格数不是独立缺陷数量;CHECK 行为回归核对。修=本组完成修复或措辞校准,核=原本正确,—=同版无此定义。
+
+| 问题 / 检查组 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| 启动时额外认证的方法与可选条件 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| NegotiateProtocolVersion 的本版消息流程 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 |
+| BackendKeyData 的本版第三方实现说明 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 |
+| RowDescription 在 DataRow 之前发送 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 函数调用仅返回标量,结果集合并非集合类型 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 启动与正常操作阶段 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 正常操作的前后端驱动关系 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 连接终止时在进程退出前回滚 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 数据值文本表示与空字符 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 解析、绑定和执行引言排版 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 行集与 COPY 查询响应 | 修 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 状态机接收合理消息而非假设固定顺序 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 多语句作为单个事务执行 | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 隐式事务块的定义与自动关闭 | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 显式事务块的延续和合并 | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 无 BEGIN 的提交或回滚可能是误操作 | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 首个错误终止多语句消息 | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 执行任何语句前先解析整串查询 | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| Execute 消息名及响应约束 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| Execute 阶段恰好一条终止响应 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 必需操作与可选操作 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 管道化术语与在途查询 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 整组查询作为单个事务 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| Sync 消息名与独立提交边界 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 各版管道 DDL 执行条件 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| 按 Sync 消息数量判断完成 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| pg_proc 系统目录与执行权限 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 旧函数调用协议的替代方式 | 核 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 |
+| 函数调用周期和响应顺序 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| CopyDone 允许成功结束 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| COPY 输入中 Flush 或 Sync 的例外 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| COPY 输出启动和中止传输 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| COPY 输出异步消息与可选终止判断 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 双向 COPY 的强调标记 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| COPY 列数和格式代码字段 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 同一通道的 NOTIFY 触发条件 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 取消请求使用新连接且无直接响应 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 取消请求的密钥数据及中止行为 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 取消机制考虑安全性和效率 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| core dump 不应译成内核转储 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 断连前事务可能提交的限定 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| SSL 说明遵守各版适用范围 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| GSSAPI 初始化长度前缀及本版 RFC 链接 | — | — | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| SSL 错误不得展示给用户的条件 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| GSSAPI 错误不得展示给用户的条件 | — | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| SSL 单字节握手及额外数据处理 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| GSSAPI 单字节握手及额外数据处理 | — | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 新版 SSL 提前协商的断连条件与遗漏标记 | — | — | — | — | — | — | — | 修 | 修 | 修 | 修 |
+| 新版直接 SSL 协商及通用工具适用性 | — | — | — | — | — | — | — | 修 | 修 | 修 | 修 |
+| SSL 取消请求引言 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| GSSAPI 取消请求引言 | — | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| SSL 在认证检查中拒绝未加密会话 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| GSSAPI 在认证检查中拒绝未加密会话 | — | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| SSL 可切换 GSSAPI 段落括号 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 协议 3.2 密钥长度与两种消息变更 | — | — | — | — | — | — | — | — | 修 | 修 | 修 |
+| 协议 3.1 保留原因的完整表述 | — | — | — | — | — | — | — | — | 修 | 修 | 修 |
+| 协议防僵化测试排版 | — | — | — | — | — | — | — | — | — | 修 | 核 |
+| 章首协议 3.0 与 3.2 的版本说明 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 |
+| [回归] ParameterStatus 全部参数及历史版本界线 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| [回归] PG19 beta 默认 3.9999 及显式绕过方式 | — | — | — | — | — | — | — | — | — | 核 | — |
+| 本版多语句示例中的隐藏注释 | — | 修 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| SASL 机制数量与本版引导句 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| 初始客户端响应的可选条件 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 挑战与响应的先后流程 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 认证结束消息的数据发送方向与可选条件 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| SASLprep 对 UTF-8 与原始密码的处理 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 通道绑定首现译名与 PG10 未实现说明 | 核 | 修 | 修 | 修 | 修 | 核 | 修 | 修 | 修 | 修 | 修 |
+| 无通道绑定时的随机值转发与重放 | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 通道绑定、证书及密码 hash 术语 | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| SCRAM 引言与 RFC 链接的本版差异 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| [回归] 使用启动消息中的用户名 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| [回归] 服务端机制列表的 SSL 条件 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| [回归] 客户端机制选择与通道绑定类型 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| [回归] SCRAM 后续三步消息顺序 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| IDENTIFY_SYSTEM.timeline 的本版 int4/int8 类型 | 核 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 |
+| ALTER_REPLICATION_SLOT 的版本范围 | — | — | — | — | — | 修 | 修 | 核 | 核 | 核 | 核 |
+| ALTER_REPLICATION_SLOT 的 TWO_PHASE 适用范围 | — | — | — | — | — | — | — | 修 | 核 | 核 | 核 |
+| 布尔参数省略 value 等同 TRUE 的节末说明 | — | — | — | — | — | — | — | 修 | 修 | 修 | 修 |
+| TIMELINE_HISTORY 文件所属时间线及字节返回语义 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 允许复制槽同步到备库与故障切换后的恢复 | — | — | — | — | — | — | — | 修 | 修 | 修 | 修 |
+| START_REPLICATION 错误例举及起始位置 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 热备反馈 catalog_xmin 最小值、禁用过程与纪元标记 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| BASE_BACKUP 压缩级别整数及算法范围 | — | — | — | — | — | 修 | 修 | 修 | 修 | 修 | 修 |
+| libpq 工具归属及测试工具用途 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| WAL 刷盘位置与已写入、已应用位置区分 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| WAL 续接记录、页边界与 XLogData/WALData 版本名 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 命令名索引保留真实标识符 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 时间线与旧时间线末尾的版本行为 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| CopyData 有效载荷和保活、反馈消息的方向及单位 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 旧版 BASE_BACKUP.size 保留 null | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| READ_REPLICATION_SLOT 物理槽限制及返回值 | — | — | — | — | — | 修 | 修 | 修 | 修 | 修 | 修 |
+| PG19+ 主库状态消息事务 ID 与纪元位宽 | — | — | — | — | — | — | — | — | — | 修 | 修 |
+| 已读相同英文的标识、标签、日志与命令措辞复用 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| [回归] CREATE 选项、快照、保留 WAL 与返回字段的版本回归 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| [回归] 逻辑复制 confirmed_flush_lsn 起点及输出插件 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| [回归] 基础备份参数、权限、格式、清单与排除文件的版本回归 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| [回归] DROP 的 WAIT 与跨数据库旧版限制、UPLOAD_MANIFEST 适用性 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| BackendKeyData 可变长密钥字段的 Int32 / Byte n | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 |
+| PG17 BackendKeyData 误入未来可变长密钥说明 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 |
+| StartupMessage 协议版本与编码一致 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 核 | 核 |
+| AuthenticationSCMCredential 本版定义完整 | 核 | 核 | 核 | 核 | 修 | 核 | — | — | — | — | — |
+| CommandComplete MERGE 标签的版本范围 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| PG14 流程移除未来 Begin Prepare / Prepare | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| PG18+ Relation / TupleData 不再排除生成列 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 修 | 修 | 修 |
+| PG14 Relation 移除未来发布列列表限定 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| 逻辑消息字段保留本版 ID/OID 及类型注解 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| PG10—17 消息格式引言恢复 CopyData 例外 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| 消息长度包含长度字段本身 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| SASL 机制按服务器偏好排序 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 认证请求、挑战及 SASL 结果说明 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| SASL 客户端初始响应的长度与 -1 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| Bind/Close/Describe/Execute/Parse/Sync 等消息名 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| Bind NULL 与零长度参数区分 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| FunctionCall/Response NULL 与零长度区分 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| DataRow NULL 与零长度列值区分 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| EmptyQueryResponse 代替 CommandComplete | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| Error/Notice 带标识字段及字段值 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 通知发送者 PID、通道及有效载荷 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 版本号与请求码高低位说明 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 核 |
+| 错误字段标题、标签、S/V 本地化及对象归属 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 错误字段关系与当前存在的数据库对象 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 长行处理与段落分隔 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 逻辑复制消息保留真实名称 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 复制源、源服务器及 Origin 消息 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| Xid 字段仅在流式事务中出现 | — | — | — | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 事务标志含义及旧版 must be 0 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| Relation 标识、列属性与版本元数据 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 事务提交、预备及回滚时间戳 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| TupleData TOAST、文本及二进制值 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 协议版本 4 的并行应用与迁移参数节 | — | — | — | — | — | — | 修 | 修 | 修 | 核 | 核 |
+| 读取完整字符串及丢弃缓冲区容纳不下的尾部 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 逻辑流复制名称、Origin 可选性与下游职责 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| COPY 输入、输出、双向消息方向 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 格式代码术语、参数/结果数量及传输格式 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 启动参数名称、值、对象 ID 与连接选项 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| [回归] INSERT OID、COPY/CSV 和协议 2.0 变更回归 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| PG19/20 迁移参数节的中文断词空格 | — | — | — | — | — | — | — | — | — | 修 | 修 |
+| [回归] 认证标识字节、长度、整数常量及旧协议回归 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+| [回归] 流事务/两阶段/二进制消息的版本字段回归 | — | — | — | — | 核 | 核 | 核 | 核 | 核 | 核 | 核 |
+
+完整逐格证据:[139 组版本矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/protocol-whole-issue-version-matrix.json);[324+2 个范围来源绑定](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/protocol-whole-source-coverage.json);[完整当前快照核验](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/protocol-whole-native-current-snapshot-proof.json);[2725 条逐项分类](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/protocol-whole-native-accepted-classification.json);[后六节全部共用文本](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/protocol-remainder-full-accepted-atom-version-matrix.json)。
+
+固定英文中的 CopyBothResponse / 旧版 CopyResponse 表述按本版保留,另有逐版源文疑点记录。本批原生验收不代表运行时协议测试、全书语义验收或最终 HTML/PDF 构建成功。阶段提交另行核验,未推送。
diff --git a/docs/calibration-textsearch-20260914.md b/docs/calibration-textsearch-20260914.md
new file mode 100644
index 00000000..9f58fac7
--- /dev/null
+++ b/docs/calibration-textsearch-20260914.md
@@ -0,0 +1,55 @@
+全文检索章节十一版校准记录(2026-09-14T15:08:46+08:00)
+
+本批已修复并验证 PG10—PG20 的 `textsearch.sgml`,从 PG18 开始完整阅读所有正文、表格、外层段落和示例,再核对其余十版的差异。下表为 37 个检查组(含一个英文疑点),不是 37 个独立新增缺陷。关联章节中的术语和新发现问题仍在继续处理;全书逐句审校、最终独立对账及 33 项构建尚未完成。
+
+主要修复:PG14—16 词典列表误入 `estonian_stem`;PG10—14 高亮段落误入 PG16 起的说明;PG13—20 的 `siglen` 漏掉字节单位。十一版共用段落还修复了排名重要性、先后匹配方向、同义词与分类词典混淆、过滤词典限制、最长匹配并列选择、NULL、词元类型和复合词构成等问题。
+
+“修”表示该检查组有修复;“核”表示针对该问题原本正确;“—”表示完整同版英文中没有该功能或说明;“例”表示有具体理由的保留译法。
+
+| 检查组 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| 词典列表混入未来版本输出 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| 旧版高亮说明混入新版句子 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| siglen 签名长度漏译字节单位 | — | — | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 排名漏译文档部分的重要程度 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 短语匹配漏译前后方向 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 天文学同义词词典误译为分类词典 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 不起作用误译为禁止放在末尾 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 最长匹配长度相同时采用最后定义 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 跳过对该索引词应用子词典 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 任意停用词通配位置 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 恢复全部变格和变位形式 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 复合词构成误译为复合格式 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 每个词元及每种词元类型的区分 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| NULL 与空值的区分 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 两个字段合并后包含查询词 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| AND 与 OR 返回组合后的查询 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 不同词的数量误译为唯一词 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 构建时间不敏感误译为无关 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| i.e. 误译为例如 | — | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 签名 hash 说明及更小的扫描比例 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 排名数值归一化术语 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 停用词首术语未翻译 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 加引号及未加引号的查询文本 | — | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 省略可选配置误译为忽略参数 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 词干约简说明语序与可选参数 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 解析器对字母的界定 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 配置构成及 C 开发和安装权限说明 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 配置文件基名及安装步骤 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 词典可识别的输入范围 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 词缀类首部与字段 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 查询词、解析及测试说明 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 示例注释与描述性格式占位符 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| ASCII 字母与空白词元类型表 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 保留既有词位 bright 译法并记录英文 noun 疑点 | 例 | 例 | 例 | 例 | 例 | 例 | 例 | 例 | 例 | 例 | 例 |
+| 全文检索、文本检索、词典及标题索引术语 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| URL 规范化术语 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| ts_stat 按权重统计词出现次数 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+
+正文证据包括 285 种英文段落、24 种表格行、2 种表格外层结构、6 种章节外层结构和 157 种示例,以及各自全部中文候选。实际绑定 3023 个段落/表格行和 1230 个示例块。修改后的完整译文与各版差异已复核,SQL、示例输出、版本参数、链接和手动锚点按本版保留。
+
+新快照的十一版解析准备均成功。全书审计仍保留原始非零退出码(PG10—12 为 3,PG13—20 为 1);本章范围内只有 126 个既有中文列表 ID 提示,逐一核对完整父项、函数签名、段落、层级及顺序后保留。十一版中文当前源码、审定稿和新快照一致,固定英文与本次解包英文一致,未发现本章源码漂移。
+
+英文将 `bright` 称为 noun 的疑点保留记录;中文沿用既有“词位”译法。保留原始示例、早期版本的限制及合法排版标签,没有修改固定英文。
+
+完整依据:[问题矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-book-issue-version-matrix.json)、[审定稿](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-book-file-plans.json)、[逐段绑定](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-book-read-unit-proof.json)、[新快照证明](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-book-native-current-snapshot-proof.json)、[126 个锚点的完整中英父项](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-book-native-parent-proof.json)。
diff --git a/docs/calibration-textsearch-followup-20260914.md b/docs/calibration-textsearch-followup-20260914.md
new file mode 100644
index 00000000..0d4b9681
--- /dev/null
+++ b/docs/calibration-textsearch-followup-20260914.md
@@ -0,0 +1,49 @@
+**PG10—PG20:全文检索关联章节与 initdb 补充校准**
+
+更新时间:2026-09-14T15:45:48+08:00。本报告追加 23 个检查组、253 个版本格;检查组包含同一问题的多个表现及术语校准,不等于 23 个新增独立缺陷。
+
+已按 PG18 优先阅读,并对照十一版各自固定英文完成本批正文修复。原 26 项清单和先前批次见[阶段总报告](/Users/vonng/pgsty/pgdoc/docs/calibration-20260914-status.md),全文检索主章见[主章校准报告](/Users/vonng/pgsty/pgdoc/docs/calibration-textsearch-20260914.md)。
+
+**逐问题版本核验**。修=本轮修复;核=对照本版英文后确认原有内容正确;无=本版英文不具备该参数或内容。已经清除的未来内容记为“修”。
+
+| 检查组 | 级别 | PG10 | PG11 | PG12 | PG13 | PG14 | PG15 | PG16 | PG17 | PG18 | PG19 | PG20 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| initdb 混入 PG18 默认启用与性能损失说明 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| initdb 混入 --no-data-checksums | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| initdb 混入 --no-sync-data-files | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 修 | 核 | 核 | 核 |
+| initdb 混入 -c / --set | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 核 | 核 | 核 | 核 | 核 |
+| initdb 混入 -s / --show | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| initdb 混入 --sync-method | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| PG14 认证说明沿用新版段落与链接 | P2 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| PG14 --sync-only 混入新版补充句 | P2 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| 超级用户有效身份;PG15 缺 postgres 名称说明 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 | 核 | 核 |
+| 密码选项保留各版超级用户称谓 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 核 | 核 | 核 | 核 | 核 |
+| initdb 交叉引用标签遗漏与未译 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 无 | 无 | 无 |
+| initdb 默认文本检索配置术语 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| initdb 选项分组与顺序混入新版 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| PG14/15 集簇定义及模板库引言未跟随本版 | P2 | 核 | 核 | 核 | 核 | 修 | 修 | 核 | 核 | 核 | 核 | 核 |
+| PG14 参见列表混入新版链接 | P3 | 核 | 核 | 核 | 核 | 修 | 核 | 核 | 核 | 核 | 核 | 核 |
+| unaccent 混入 PG17 起的带引号转换规则 | P2 | 无 | 无 | 无 | 无 | 修 | 修 | 修 | 核 | 核 | 核 | 核 |
+| 全文/文本检索、词典、词元、解析器及索引标题 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| dict_int 把不同词误译为唯一词 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| pg_ts_config_map 缺解析器限定;恢复查询顺序 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 词典模板实现函数及普通用户说明 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| headline / lextype 回调名称误译 | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| get_current_ts_config 说明标点与 OID | P3 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+| 创建词典模板中普通用户设置参数的含义 | P2 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 | 修 |
+
+**本批阅读与检查证据**:`initdb` 完整对照了 56 个参数/环境变量变体、10 个文件框架、336 个条目,复核 15 组最终改动。共移除 16 个未来参数条目,保留各版 ICU/builtin、校验和、认证、编码和环境变量差异。`unaccent` 十一版全文完成对照,188 个段落绑定,PG14—16 的带引号规则及示例整项删除,PG17—20 保留。
+
+关联术语完成了 182 个初始配对变体、34 个补充变体,以及三个 SQL 参考页的十一版完整对照。235 个文件内有 1444 个完整父单元绑定;48 组补充最终中英对照已复核,1225 处为经过逐组阅读后确定的术语替换。该范围内的 SGML 标签、属性、链接及 3847 个代码块保持原样。范围之外的章节仍按全书待办继续核查。
+
+全项目十一版重新检索“全文搜索、文本搜索、文本检索字典、过滤字典、分类字典”已无残留;该检索结果只作为术语残留检查。新参数在其他章节的三处命中均位于 PG18 发行说明,三个完整中英段落已读,内容与本版一致。差异检查清理了 14 处代码块之外的行尾空白,`git diff --check` 通过。
+
+**本批解析核验完成**:257 个文件、1466 个完整父单元与当前源码、审定稿、固定英文和新快照一致,零漂移。334 个范围内提示已逐项核定,证据见下方文件。全书原始结构检查退出码仍为 PG10—12 的 3、PG13—20 的 1;此处仅声明本批范围内完成核验。
+
+**固定英文疑义已保留并记录**:`pg_ts_parser` 将解析器输出称为 lexeme;`ALTER TEXT SEARCH PARSER/TEMPLATE` 说明仅改名而语法含 `SET SCHEMA`;`dict_int` 的独立示例配置顺序存在歧义;PG11 发行说明将 `json(b)_to_tsvector` 的结果称为 query。没有自行改写固定英文的这些陈述。
+
+**全任务仍在进行**:全书逐章语义核查、历史范围对账及最终 HTML/A4/US 构建继续进行。33 个最终构建目标均尚未完成验收,本报告不将此前构建或本批解析替代最终构建。
+
+详细证据:[逐组十一版矩阵](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-followup-issue-version-matrix.json)、[initdb 全文审定稿](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/initdb-full-file-plans.json)、[unaccent 全文审定稿](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/unaccent-full-finalized-file-plans.json)、[关联父单元绑定](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-terms-followup-finalized-parent-plans.json)、[差异空白修正](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-followup-whitespace-finalization.json)。
+
+解析证据:[当前源码与快照绑定](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-followup-native-current-snapshot-proof.json)、[逐项处置](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-followup-native-dispositions.json)、[完整父块复核](/Users/vonng/pgsty/pgdoc/outputs/pg10-20-calibration-20260911-134417/zcode-followup/textsearch-followup-native-parent-proof.json)。
diff --git a/zh/10/array.sgml b/zh/10/array.sgml
index fd449b60..706c8191 100644
--- a/zh/10/array.sgml
+++ b/zh/10/array.sgml
@@ -4,7 +4,7 @@
数组
- array
+ 数组
PostgreSQL 允许将表列定义为变长多维数组。可以创建任何内置或用户定义的基础类型、枚举类型或复合类型的数组。尚不支持域的数组。
@@ -13,8 +13,8 @@
数组类型的声明
- array
- declaration
+ 数组
+ 声明
@@ -62,8 +62,8 @@ CREATE TABLE tictactoe (
数组值输入
- array
- constant
+ 数组
+ 常量
@@ -84,7 +84,7 @@ CREATE TABLE tictactoe (
(这类数组常量实际上只是中讨论的通用类型常量的一种特例。该常量最初会被当作字符串处理,然后传递给数组输入转换例程。必要时可能需要显式指定类型。)
+ linkend="sql-syntax-constants-generic">中讨论的通用类型常量的一种特例。该常量最初会被当作字符串处理,然后传递给数组输入转换例程。可能需要显式指定类型。)
@@ -116,7 +116,10 @@ SELECT * FROM sal_emp;
- 多维数组在每个维度上的长度必须匹配。不匹配会导致错误,例如:
+
+ 多维数组的各个子数组在每个维度上的长度必须匹配。不匹配会导致错误,例如:
+
+
INSERT INTO sal_emp
VALUES ('Bill',
'{10000, 10000, 10000, 10000}',
@@ -146,8 +149,8 @@ INSERT INTO sal_emp
访问数组
- array
- accessing
+ 数组
+ 访问
@@ -180,9 +183,9 @@ SELECT pay_by_quarter[3] FROM sal_emp;
- 我们还可以访问数组或子数组的任意矩形切片。数组切片通过在一个或多个数组维度上写成
+ 我们还可以访问数组的任意矩形切片,即子数组。数组切片通过在一个或多个数组维度上写成
lower-bound :upper-bound
- 的形式来表示。例如,下面这个查询取回 Bill 在一周前两天日程安排中的第一个项目:
+ 的形式来表示。例如,下面这个查询取回 Bill 在一周中前两天里每天的首项日程:
SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';
@@ -229,11 +232,11 @@ SELECT schedule[:][1:1] FROM sal_emp WHERE name = 'Bill';
- 如果数组本身或任一下标表达式为 NULL,则数组下标表达式将返回空值。此外,如果下标超出数组边界,也会返回空值(这种情况不会报错)。例如,如果 schedule 当前的维度是 [1:3][1:2] ,那么引用 schedule[3][3] 会得到 NULL。类似地,使用错误数量的下标访问数组,得到的也是空值而不是错误。
+ 如果数组本身或任一下标表达式为 NULL,则数组下标表达式将返回 NULL。此外,如果下标超出数组边界,也会返回 NULL(这种情况不会报错)。例如,如果 schedule 当前的维度是 [1:3][1:2] ,那么引用 schedule[3][3] 会得到 NULL。类似地,使用错误数量的下标访问数组,得到的也是 NULL 而不是错误。
- 同样地,如果数组本身或任一下标表达式为 NULL,数组切片表达式也会返回空值。不过,在其他情况下,例如选择一个完全位于当前数组边界之外的数组切片时,切片表达式返回的是空(零维)数组而不是空值。(这与非切片行为不一致,是出于历史原因。)如果所请求的切片与数组边界仅部分重叠,那么它会被静默缩减为重叠区域,而不是返回空值。
+ 同样地,如果数组本身或任一下标表达式为 NULL,数组切片表达式也会返回 NULL。不过,在其他情况下,例如选择一个完全位于当前数组边界之外的数组切片时,切片表达式返回的是空(零维)数组而不是 NULL。(这与非切片行为不一致,是出于历史原因。)如果所请求的切片与数组边界仅部分重叠,那么它会被静默缩减为重叠区域,而不是返回 NULL。
@@ -287,8 +290,8 @@ SELECT cardinality(schedule) FROM sal_emp WHERE name = 'Carol';
修改数组
- array
- modifying
+ 数组
+ 修改
@@ -325,7 +328,7 @@ UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'
- 已存储的数组值可以通过给尚不存在的元素赋值来扩展。原有元素与新赋值元素之间的任何位置都将用空值填充。例如,如果数组 myarray 当前有 4 个元素,那么在一次更新把值赋给 myarray[6] 之后,它将有 6 个元素;myarray[5] 将包含空值。目前,以这种方式扩展只允许用于一维数组,不允许用于多维数组。
+ 已存储的数组值可以通过给尚不存在的元素赋值来扩展。原有元素与新赋值元素之间的任何位置都将用 NULL 填充。例如,如果数组 myarray 当前有 4 个元素,那么在一次更新把值赋给 myarray[6] 之后,它将有 6 个元素;myarray[5] 将包含 NULL。目前,以这种方式扩展只允许用于一维数组,不允许用于多维数组。
@@ -437,21 +440,21 @@ SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]);
在简单情况下,优先使用上面讨论的连接操作符,而不是直接调用这些函数。不过,由于连接操作符被重载以同时服务于这三种情形,所以在某些场景下使用这些函数之一有助于避免歧义。例如,考虑:
-SELECT ARRAY[1, 2] || '{3, 4}'; -- the untyped literal is taken as an array
+SELECT ARRAY[1, 2] || '{3, 4}'; -- 未指定类型的字面量被当作数组
?column?
-----------
{1,2,3,4}
-SELECT ARRAY[1, 2] || '7'; -- so is this one
+SELECT ARRAY[1, 2] || '7'; -- 这个字面量也一样
ERROR: malformed array literal: "7"
-SELECT ARRAY[1, 2] || NULL; -- so is an undecorated NULL
+SELECT ARRAY[1, 2] || NULL; -- 未加类型修饰的 NULL 也一样
?column?
----------
{1,2}
(1 row)
-SELECT array_append(ARRAY[1, 2], NULL); -- this might have been meant
+SELECT array_append(ARRAY[1, 2], NULL); -- 这可能才是原本想表达的意思
array_append
--------------
{1,2,NULL}
@@ -465,8 +468,8 @@ SELECT array_append(ARRAY[1, 2], NULL); -- this might have been meant
在数组中搜索
- array
- searching
+ 数组
+ 搜索
@@ -507,9 +510,14 @@ SELECT * FROM
关于该函数的说明见。
- 还可以使用&& 操作符搜索数组,它检查左操作数是否与右操作数重叠。例如:
+
+ 也可以使用 && 操作符来搜索数组,它会检查左操作数是否与右操作数有重叠。例如:
+
+
SELECT * FROM sal_emp WHERE pay_by_quarter && ARRAY[10000];
- 关于此操作符和其他数组操作符的更多说明,参见。可以通过适当的索引来加速这种搜索,参见。
+
+
+ 关于该操作符和其他数组操作符的更多说明见。如所述,也可以通过适当的索引加速。
还可以使用array_position 和array_positions 函数在数组中搜索特定值。前者返回某个值在数组中首次出现位置的下标;后者返回一个数组,其中包含该值在数组中所有出现位置的下标。例如:
@@ -536,7 +544,7 @@ SELECT array_positions(ARRAY[1, 4, 3, 1, 3, 4, 2, 1], 1);
数组输入和输出语法
- array
+ 数组
I/O
@@ -549,7 +557,7 @@ SELECT array_positions(ARRAY[1, 4, 3, 1, 3, 4, 2, 1], 1);
- 默认情况下,数组各维度的下界索引值都设为 1。要表示具有其他下界的数组,可以在写出数组内容之前显式指定数组下标范围。这种修饰由包围每个数组维度上下界的方括号([] )构成,中间以冒号(: )作为分隔符字符。数组维度修饰后面再跟一个等号(= )。例如:
+ 默认情况下,数组各维度的下界下标值都设为 1。要表示具有其他下界的数组,可以在写出数组内容之前显式指定数组下标范围。这种修饰由包围每个数组维度上下界的方括号([] )构成,中间以冒号(: )作为分隔符字符。数组维度修饰后面再跟一个等号(= )。例如:
SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2
FROM (SELECT '[1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}'::int[] AS f1) AS ss;
diff --git a/zh/10/catalogs.sgml b/zh/10/catalogs.sgml
index fdb05782..8645f815 100644
--- a/zh/10/catalogs.sgml
+++ b/zh/10/catalogs.sgml
@@ -310,27 +310,27 @@
pg_ts_config
- 文本搜索配置
+ 文本检索配置
pg_ts_config_map
- 文本搜索配置的词元映射
+ 文本检索配置的词元映射
pg_ts_dict
- 文本搜索字典
+ 文本检索词典
pg_ts_parser
- 文本搜索分析器
+ 文本检索解析器
pg_ts_template
- 文本搜索模板
+ 文本检索模板
@@ -6830,12 +6830,12 @@ SCRAM-SHA-256$<iteration count> :&l
- pg_ts_config 目录包含表示文本搜索配置的条目。一个配置指定某个特定的文本搜索分析器,以及针对该分析器每种输出词元类型所定义的字典列表。分析器由pg_ts_config 项表示,而词元到字典的映射则由 pg_ts_config系统目录包含表示文本检索配置的条目。一个配置指定某个特定的文本检索解析器,以及针对该解析器每种输出词元类型所定义的词典列表。解析器记录在pg_ts_config 条目中,而词元到词典的映射则由pg_ts_config_map 中的辅助项定义。
- PostgreSQL 的文本搜索特性在中有更详尽的描述。
+ PostgreSQL 的文本检索特性在中有更详尽的描述。
@@ -6866,7 +6866,7 @@ SCRAM-SHA-256$<iteration count> :&l
name
- 文本搜索配置名
+ 文本检索配置名
@@ -6893,7 +6893,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_ts_parser .oid
- 该配置的文本搜索分析器的OID
+ 该配置的文本检索解析器的 OID
@@ -6910,11 +6910,11 @@ SCRAM-SHA-256$<iteration count> :&l
- pg_ts_config_map 目录包含的项展示了对于每一个文本搜索配置的每一种输出词元类型,有哪些文本搜索字典可供查询以及以何种顺序。
+ pg_ts_config_map 系统目录中的条目说明了,对于每个文本检索配置所用解析器的每种输出词元类型,应当查询哪些文本检索词典以及查询的顺序。
- PostgreSQL 的文本搜索特性在中有更详尽的描述。
+ PostgreSQL 的文本检索特性在中有更详尽的描述。
@@ -6947,7 +6947,7 @@ SCRAM-SHA-256$<iteration count> :&l
integer
- 一种由配置的分析器送出的词元类型
+ 一种由配置的解析器送出的词元类型
@@ -6965,7 +6965,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_ts_dict .oid
- 要查询的文本搜索字典的OID
+ 要查询的文本检索词典的 OID
@@ -6982,11 +6982,11 @@ SCRAM-SHA-256$<iteration count> :&l
- pg_ts_dict 目录包含定义文本搜索字典的项。一个字典依赖于一个文本搜索模板,它指定了所有需要的函数实现,字典本身则为模板支持的用户可设置参数提供值。这种分工允许无权限的用户创建字典。参数由一个文本串dictinitoption 定义,其格式和意义随着模板而变化。
+ pg_ts_dict 系统目录包含定义文本检索词典的项。一个词典依赖于一个文本检索模板,它指定了所有需要的实现函数,词典本身则为模板支持的用户可设置参数提供值。这种分工允许普通用户创建词典。参数由一个文本串dictinitoption 定义,其格式和意义随着模板而变化。
- PostgreSQL 的文本搜索特性在中有更详尽的描述。
+ PostgreSQL 的文本检索特性在中有更详尽的描述。
@@ -7017,7 +7017,7 @@ SCRAM-SHA-256$<iteration count> :&l
name
- 文本搜索字典名
+ 文本检索词典名
@@ -7026,7 +7026,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_namespace .oid
- 包含该字典的名字空间OID
+ 包含该词典的名字空间的 OID
@@ -7035,7 +7035,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_authid .oid
- 字典的拥有者
+ 词典的拥有者
@@ -7044,7 +7044,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_ts_template .oid
- 该字典的文本搜索模板的OID
+ 该词典的文本检索模板的 OID
@@ -7070,11 +7070,11 @@ SCRAM-SHA-256$<iteration count> :&l
- pg_ts_parser 目录包含定义文本搜索分析器的项。一个分析器负责将输入文本分割成词位并为每一个词位分配一个词元类型。由于一个分析器必须用C语言级别的函数实现,创建新分析器的工作只限于数据库的超级用户。
+ pg_ts_parser 系统目录包含定义文本检索解析器的项。一个解析器负责将输入文本分割成词位并为每一个词位分配一个词元类型。由于一个解析器必须用 C 语言级别的函数实现,创建新解析器的工作只限于数据库的超级用户。
- PostgreSQL 的文本搜索特性在中有更详尽的描述。
+ PostgreSQL 的文本检索特性在中有更详尽的描述。
@@ -7105,7 +7105,7 @@ SCRAM-SHA-256$<iteration count> :&l
name
- 文本搜索分析器的名字
+ 文本检索解析器的名字
@@ -7114,7 +7114,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_namespace .oid
- 包含此分析器的名字空间的OID
+ 包含此解析器的名字空间的 OID
@@ -7123,7 +7123,7 @@ SCRAM-SHA-256$<iteration count> :&l
regproc
pg_proc .oid
- 分析器启动函数的OID
+ 解析器启动函数的 OID
@@ -7132,7 +7132,7 @@ SCRAM-SHA-256$<iteration count> :&l
regproc
pg_proc .oid
- 分析器的下一词元函数的OID
+ 解析器的下一词元函数的 OID
@@ -7141,7 +7141,7 @@ SCRAM-SHA-256$<iteration count> :&l
regproc
pg_proc .oid
- 分析器的关闭函数的OID
+ 解析器的关闭函数的 OID
@@ -7150,7 +7150,7 @@ SCRAM-SHA-256$<iteration count> :&l
regproc
pg_proc .oid
- 分析器标题函数的 OID
+ 解析器的 headline 函数的 OID
@@ -7159,7 +7159,7 @@ SCRAM-SHA-256$<iteration count> :&l
regproc
pg_proc .oid
- 分析器的词汇类型函数的OID
+ 解析器的 lextype 函数的 OID
@@ -7176,11 +7176,11 @@ SCRAM-SHA-256$<iteration count> :&l
- pg_ts_template 目录包含定义文本搜索模板的项。一个模板是一类文本搜索字典的实现骨架。由于一个模板必须用C语言级别的函数实现,新模板的创建只限于数据库超级用户。
+ pg_ts_template 系统目录包含定义文本检索模板的项。一个模板是一类文本检索词典的实现骨架。由于一个模板必须用 C 语言级别的函数实现,新模板的创建只限于数据库超级用户。
- PostgreSQL 的文本搜索特性在中有更详尽的描述。
+ PostgreSQL 的文本检索特性在中有更详尽的描述。
@@ -7211,7 +7211,7 @@ SCRAM-SHA-256$<iteration count> :&l
name
- 文本搜索模板的名字
+ 文本检索模板的名字
diff --git a/zh/10/config.sgml b/zh/10/config.sgml
index 2bf2aabd..7fc0148b 100644
--- a/zh/10/config.sgml
+++ b/zh/10/config.sgml
@@ -2788,13 +2788,13 @@ ANY num_sync ( num_sync ( )。
+ 设置规划器对一系列顺序磁盘页面读取中单次读取的代价估计。默认值是 1.0。对于某个表空间内的表和索引,可以通过设置该表空间的同名参数来覆盖此值(见)。
@@ -2824,7 +2823,7 @@ ANY num_sync ( )。
+ 设置规划器对一次非顺序磁盘页面读取的代价估计。默认值是 4.0。对于某个表空间内的表和索引,可以通过设置该表空间的同名参数来覆盖此值(见)。
@@ -2846,8 +2845,7 @@ ANY num_sync ( num_sync ( num_sync ( num_sync ( num_sync ( num_sync ( num_sync (
- 遗传查询优化
+ 遗传查询优化器
- GEQO是一个使用探索式搜索来执行查询规划的算法。它可以降低负载查询的规划时间。 同时,GEQO的检索是随机的,因此它的规划可能会不可确定。 更多信息参阅Chapter 50。
- 遗传查询规划器(GEQO)是一种使用启发式搜索来进行查询规划的算法。它可以降低对于复杂查询(连接很多表的查询)的规划时间,但是代价是它产生的计划有时候要差于使用穷举搜索算法找到的计划。详见。
+ 遗传查询优化器(GEQO)是一种使用启发式搜索进行查询规划的算法。它可以缩短复杂查询(连接很多关系的查询)的规划时间,代价是生成的计划有时不如常规穷举搜索算法找到的计划。更多信息见。
@@ -3007,7 +3004,7 @@ ANY num_sync ( num_sync ( num_sync ( num_sync ( num_sync (
- 在哪里做日志
+ 日志记录到哪里
日志写到哪里
@@ -3282,7 +3277,7 @@ SELECT * FROM parent WHERE key = 2400;
current_logfiles
- 和日志_目的地配置参数
+ 和 log_destination 配置参数
@@ -3309,7 +3304,7 @@ csvlog log/postgresql.csv
- 在大多数 Unix 系统上,你将需要修改系统的syslog 守护进程的配置来使用log_destination 的syslog 选项。PostgreSQL 可以在syslog 设备LOCAL0 到LOCAL7 中记录(见),但是大部分平台上的默认syslog 配置会丢弃所有这种消息。你将需要增加这样的内容:
+ 在大多数 Unix 系统上,你将需要修改系统的syslog 守护进程的配置来使用log_destination 的syslog 选项。PostgreSQL 可以在syslog 设施LOCAL0 到LOCAL7 中记录(见),但是大部分平台上的默认syslog 配置会丢弃所有这种消息。你将需要增加这样的内容:
local0.* /var/log/postgresql
@@ -3317,7 +3312,7 @@ local0.* /var/log/postgresql
- 在 Windows 上,当你使用log_destination 的eventlog 选项时,你应该在操作系统中注册一个事件源极其库,这样 Windows 事件查看器能够清楚地显示事件日志消息。详见。
+ 在 Windows 上,当你使用log_destination 的eventlog 选项时,你应该在操作系统中注册一个事件源及其库,这样 Windows 事件查看器能够清楚地显示事件日志消息。详见。
@@ -3333,20 +3328,20 @@ local0.* /var/log/postgresql
- 这个参数启用日志收集器 ,它是一个捕捉被发送到stderr 的日志消息的后台进程,并且它会将这些消息重定向到日志文件中。这种方法比记录到syslog 通常更有用,因为某些类型的消息不会在syslog 输出中出现(一个常见的示例是动态链接器错误消息;另一个示例是由archive_command 等脚本产生的错误消息)。这个参数只能在服务器启动时设置。
+ 这个参数启用日志收集器 ,它是一个捕捉被发送到stderr 的日志消息的后台进程,并且它会将这些消息重定向到日志文件中。这种方法比记录到syslog 通常更有用,因为某些类型的消息可能不会在syslog 输出中出现(一个常见的示例是动态链接器错误消息;另一个示例是由archive_command 等脚本产生的错误消息)。这个参数只能在服务器启动时设置。
- 也可以不使用日志收集器而把日志记录到stderr ,日志消息将只会去到服务器的stderr 被定向到的位置。不过,那种方法只适合于低日志量,因为它没有提供方法来轮转日志文件。还有,在某些不使用日志收集器的平台上可能会导致丢失或者混淆日志输出,因为多个进程并发写入同一个日志文件时会覆盖彼此的输出。
+ 也可以不使用日志收集器而把日志记录到stderr ,日志消息将只会去到服务器的stderr 被定向到的位置。不过,那种方法只适合于低日志量,因为它没有提供便捷的方法来轮转日志文件。还有,在某些平台上,不使用日志收集器可能会导致日志输出丢失或混杂,因为多个进程并发写入同一个日志文件时会覆盖彼此的输出。
- 日志收集器被设计成从来不会丢失消息。这意味着在极高的负载下,如果服务器进程试图在收集器已经落后时发送更多的日志消息,那么它会被阻塞。相反,syslog 倾向于在无法写入消息时丢掉消息,这意味着在这样的情况下它可能会无法记录某些消息,但是它不会阻塞系统的其他部分。
+ 日志收集器被设计成从来不会丢失消息。这意味着在极高的负载下,如果服务器进程试图在收集器已经落后时发送更多的日志消息,那么它可能会被阻塞。相反,syslog 倾向于在无法写入消息时丢掉消息,这意味着在这样的情况下它可能会无法记录某些消息,但是它不会阻塞系统的其他部分。
@@ -3378,7 +3373,7 @@ local0.* /var/log/postgresql
当logging_collector 被启用时,这个参数设置被创建的日志文件的文件名。
- 该值被视为一种strftime 模式,因此% 转义可以被用来指定根据时间变化的文件名(注意如果有任何时区独立的% 转义,计算将在由指定的时区中完成)。
+ 该值被视为一种strftime 模式,因此% 转义可以被用来指定根据时间变化的文件名(注意如果有任何依赖时区的% 转义,计算将在由指定的时区中完成)。
被支持的% 转义和开放组织的strftime 说明中列举的类似。
注意系统的strftime 不会被直接使用,因此平台相关(非标准)的扩展无法工作。
默认是postgresql-%Y-%m-%d_%H%M%S.log 。
@@ -3405,7 +3400,7 @@ local0.* /var/log/postgresql
- 在 Unix 系统上,当logging_collector 被启用时,这个参数设置日志文件的权限(在微软 Windows 上这个参数将被忽略)。这个参数值应当是一个数字形式的模式,它可以被chmod 和umask 系统调用接受(要使用通常的十进制格式,该数字必须以一个0 (零)开始)。
+ 在 Unix 系统上,当logging_collector 被启用时,这个参数设置日志文件的权限(在微软 Windows 上这个参数将被忽略)。这个参数值应当是一个数字形式的模式,它可以被chmod 和umask 系统调用接受(要使用通常的八进制格式,该数字必须以一个0 (零)开始)。
@@ -3466,7 +3461,7 @@ local0.* /var/log/postgresql
- 示例:要保留 24 小时的日志,每个小时一个日志文件,但是在日志文件尺寸超过 1GB 时轮转。可以这样做:将log_filename 设置为server_log.%H%M 、
+ 示例:要保留 24 小时的日志,每个小时一个日志文件,如果日志文件尺寸超过 1GB,也会提前轮转。可以这样做:将log_filename 设置为server_log.%H%M 、
将log_truncate_on_rotation 设置为on 、
将log_rotation_age 设置为60 并且
将log_rotation_size 设置为1000000 。
@@ -3485,7 +3480,7 @@ local0.* /var/log/postgresql
- 当启用了向syslog 记录时,这个参数决定要使用的syslog 设备
。你可以在LOCAL0 、LOCAL1 、LOCAL2 、LOCAL3 、LOCAL4 、
+ 当启用了向syslog 记录时,这个参数决定要使用的syslog 设施
。你可以在LOCAL0 、LOCAL1 、LOCAL2 、LOCAL3 、LOCAL4 、
LOCAL5 、LOCAL6 、LOCAL7 中选择,默认值是LOCAL0 。还请参阅系统的syslog 守护进程的文档。这个参数只能在postgresql.conf 文件中或在服务器命令行上设置。
@@ -3540,7 +3535,7 @@ local0.* /var/log/postgresql
- 如果 syslog 最终被记录到一个文本文件中,那么两种设置的效果是一样的,但最好设置为 on,因为大部分 syslog 实现要么不能处理大型消息,要么需要做特殊的配置以处理大型消息。但是如果 syslog 最终写入到某种其他媒介,有必要让消息保持逻辑上的整体性(也更加有用)。
+ 如果 syslog 最终被记录到一个文本文件中,那么两种设置的效果是一样的,但最好设置为 on,因为大部分 syslog 实现要么不能处理大型消息,要么需要做特殊的配置以处理大型消息。但是如果 syslog 最终写入到某种其他媒介,让消息保持逻辑上的完整性可能是必要的,也可能更有用。
@@ -3602,9 +3597,7 @@ local0.* /var/log/postgresql
- 控制在服务器日志中记录哪些导致错误条件的SQL语句。当前的SQL语句将包含在任何指定
- severity
- 或更高消息的日志条目中。
+ 控制在服务器日志中记录哪些导致错误条件的SQL语句。对于达到指定 严重级别或更高级别的消息,其日志条目中会包含当前 SQL 语句。
有效值为DEBUG5 、
DEBUG4 、DEBUG3 、
DEBUG2 、DEBUG1 、
@@ -3636,7 +3629,7 @@ local0.* /var/log/postgresql
- 对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间将被独立记录。
+ 对于使用扩展查询协议的客户端,Parse、Bind 和 Execute 步骤的持续时间将被独立记录。
@@ -3670,7 +3663,7 @@ local0.* /var/log/postgresql
DEBUG1..DEBUG5
- 为开发者提供连续的更详细的信息。
+ 为开发者提供逐级更加详细的信息。
DEBUG
INFORMATION
@@ -3729,7 +3722,7 @@ local0.* /var/log/postgresql
- 记录什么到日志
+ 记录哪些内容
@@ -3750,7 +3743,7 @@ local0.* /var/log/postgresql
- application_name 可以是任意小于NAMEDATALEN 个字符(标准编译中是 64 个字符)的字符串。应用通常在连接服务器时设置此值。该名称将被显示在pg_stat_activity 视图中并被包括在 CSV 日志项中。它也会被通过包括在普通日志项中。只有可打印 ASCII 字符能被使用在application_name 之中。其他字符将被替换为问号(? )。
+ application_name 可以是任意小于NAMEDATALEN 个字符(标准编译中是 64 个字符)的字符串。应用通常在连接服务器时设置此值。该名称将被显示在pg_stat_activity 视图中并被包括在 CSV 日志项中。也可以通过将其包括在普通日志项中。只有可打印 ASCII 字符能被使用在application_name 之中。其他字符将被替换为问号(? )。
@@ -3774,7 +3767,6 @@ local0.* /var/log/postgresql
- 这个参数启用发出各种调试输出。当设置时,会打印生成的解析树, 查询重写输出,或执行的每个查询的执行计划。这些信息是在LOG 信息级别发出,因此默认的,它们会出现在服务器日志中,但不会发送给客户端。 可以通过 client_min_messages和/或log_min_messages 来设置。这些参数缺省是off。
这些参数将会让多种调试输出被发出。当被设置时,它们为每一个被执行的查询打印结果分析树、查询重写器输出或执行计划。这些消息在LOG 消息级别上被发出,因此默认情况下它们将出现在服务器日志中但不会被发送到客户端。你可以通过调整和/或来改变这种情况。这些参数默认是关闭的。
@@ -3808,7 +3800,7 @@ local0.* /var/log/postgresql
导致检查点和重启点在服务器日志中记录。日志消息中包括一些统计信息,
包括写入的缓冲区数量和写入它们所花费的时间。此参数只能在
- postgresql.conf 文件或服务器命令行中设置。默认值为开启。
+ postgresql.conf 文件或服务器命令行中设置。默认值为关闭。
@@ -3865,7 +3857,7 @@ local0.* /var/log/postgresql
- 对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间将被独立记录。
+ 对于使用扩展查询协议的客户端,Parse、Bind 和 Execute 步骤的持续时间将被独立记录。
@@ -3887,7 +3879,7 @@ local0.* /var/log/postgresql
控制在服务器日志中记录的每条消息的详细程度。有效值为TERSE ,
- DEFAULT 和VERBOSE ,每个值都会添加更多字段到显示的消息中。
+ DEFAULT 和VERBOSE ,它们依次在显示的消息中增加更多字段。
TERSE 不包括DETAIL ,HINT ,
QUERY 和CONTEXT 错误信息的记录。
VERBOSE 输出包括SQLSTATE 错误代码
@@ -3907,7 +3899,7 @@ local0.* /var/log/postgresql
- 默认情况下,连接日志消息只显示连接主机的 IP 地址。打开这个参数将导致也记录主机名。注意根据你的主机名解析设置,这可能会导致很微小的性能损失。这个参数只能在postgresql.conf 文件中或在服务器命令行上设置。
+ 默认情况下,连接日志消息只显示连接主机的 IP 地址。打开这个参数将导致也记录主机名。注意根据你的主机名解析设置,这可能会导致不可忽视的性能开销。这个参数只能在postgresql.conf 文件中或在服务器命令行上设置。
@@ -3980,8 +3972,8 @@ local0.* /var/log/postgresql
%n
- 带毫秒的时间戳(作为 Unix 时代)
- no
+ 带毫秒精度的 Unix 时间戳
+ 否
%i
@@ -4096,7 +4088,7 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
UPDATE 、DELETE 、TRUNCATE ,
和COPY FROM 。
如果PREPARE 、EXECUTE 和
- EXPLAIN ANALYZE 包含合适类型的命令,它们也会被记录。对于使用扩展查询协议的客户端,当收到一个执行消息时会产生日志并且会包括绑定参数的值(任何内嵌的单引号会被双写)。
+ EXPLAIN ANALYZE 包含合适类型的命令,它们也会被记录。对于使用扩展查询协议的客户端,当收到一个 Execute 消息时会产生日志并且会包括 Bind 参数的值(任何内嵌的单引号会被双写)。
@@ -4107,7 +4099,7 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
- 即使使用log_statement = all 设置,包含简单语法错误的语句也不会被记录。这是因为只有在完成基本语法解析并确定了语句类型之后才会发出日志消息。在扩展查询协议的情况下,在执行阶段之前(即在解析分析或规划期间)出错的语句也不会被记录。将log_min_error_statement 设置为ERROR (或更低)来记录这种语句。
+ 即使使用log_statement = all 设置,包含简单语法错误的语句也不会被记录。这是因为只有在完成基本语法解析并确定了语句类型之后才会发出日志消息。在扩展查询协议的情况下,在 Execute 阶段之前(即在解析分析或规划期间)出错的语句也不会被记录。将log_min_error_statement 设置为ERROR (或更低)来记录这种语句。
@@ -4144,7 +4136,7 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
控制临时文件名和大小的日志记录。
- 临时文件可以用于排序、哈希和临时查询结果。
+ 临时文件可以用于排序、hash 和临时查询结果。
每当删除临时文件时都会发出日志记录。
值为零时记录所有临时文件信息,而正值仅记录大小大于或等于指定千字节数的文件。
默认设置为-1,禁用此类日志记录。
@@ -4222,7 +4214,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 设置log_filename 和log_rotation_age 为你的日志文件提供一种一致的、可预测的命名空间。这让你预测文件名会是怎样以及知道什么时候一个个体日志文件完成并且因此准备好被导入。
+ 设置log_filename 和log_rotation_age ,为日志文件提供一致且可预测的命名方案。这样就能预测文件名,并知道单个日志文件何时已完成写入、可以导入。
@@ -4251,8 +4243,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
进程标题
- 这些设置控制服务器进程的进程标题如何修改。通常可以通过ps 等程序查看进程标题,
- 在 Windows 上则可以使用Process Explorer 。详情参见。
+ 这些设置控制服务器进程的进程标题如何修改。通常可以通过ps 等程序查看进程标题,在 Windows 上则可以使用Process Explorer 。详情参见。
@@ -4279,7 +4270,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 每次服务器接收到新的SQL命令时,都可以更新进程标题。
+ 启用后,每次服务器接收到新的 SQL 命令时都会更新进程标题。
在大多数平台上,默认情况下此设置为on ,但在Windows上默认为off ,
因为该平台更新进程标题的开销较大。
只有超级用户能更改这个设置。
@@ -4314,7 +4305,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
启用对每个会话当前执行命令的信息收集,包括命令开始执行的时间。
- 此参数默认为开启状态。请注意,即使启用了此信息,只有超级用户、具有
+ 此参数默认为开启状态。请注意,即使启用了此参数,只有超级用户、具有
pg_read_all_stats 角色权限的角色和拥有被报告会话的用户
(包括属于他们具有权限的角色的会话)才能看到此信息,因此不应构成安全风险。
只有超级用户能更改这个设置。
@@ -4330,7 +4321,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 为每个活动会话指定存储当前执行命令的文本所保留的字节数,它们被用于pg_stat_activity .query 域。
+ 为每个活动会话指定存储当前执行命令的文本所预留的字节数,它们被用于pg_stat_activity .query 字段。
默认值是 1024字节。这个参数只能在服务器启动时被设置。
@@ -4347,7 +4338,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
启用对数据库活动的统计信息收集。
- 此参数默认为开启,因为自动清理守护进程需要收集的信息。
+ 此参数默认为开启,因为自动清理守护进程需要这些收集到的信息。
只有超级用户能更改这个设置。
@@ -4361,7 +4352,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 启用数据库I/O调用的计时。 默认情况下,此参数处于关闭状态,因为它将重复查询操作系统的当前时间,这可能会在某些平台上造成显著的开销。 您可以使用工具来测量系统上计时的开销。
+ 启用数据库I/O调用的计时。 默认情况下,此参数处于关闭状态,因为它将重复查询操作系统的当前时间,这可能会在某些平台上造成显著的开销。 你可以使用工具来测量系统上计时的开销。
I/O计时信息显示在中,也显示在使用BUFFERS 选项的输出中,
并由提供。只有超级用户能更改这个设置。
@@ -4378,7 +4369,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 启用函数调用次数和时间的跟踪。指定pl 以仅跟踪过程语言函数,
+ 启用函数调用次数和耗时的跟踪。指定pl 以仅跟踪过程语言函数,
all 以同时跟踪SQL和C语言函数。默认值为none ,
即禁用函数统计跟踪。只有超级用户能更改这个设置。
@@ -4438,7 +4429,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
对于每个查询,将各自模块的性能统计输出到服务器日志中。这是一个简单的性能分析工具,类似于Unix getrusage() 操作系统功能。
- log_statement_stats 报告总语句统计,而其他选项报告每个模块的统计信息。
+ log_statement_stats 报告整个语句的统计信息,而其他选项报告每个模块的统计信息。
log_statement_stats 不能与任何单独模块选项一起启用。所有这些选项默认情况下都是禁用的。
只有超级用户才能更改这些设置。
@@ -4454,7 +4445,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
自动清理
- autovacuum
+ 自动清理
配置参数
@@ -4494,10 +4485,10 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 每次由自动清理执行的操作都会被记录,如果运行时间至少达到指定毫秒数。将此设置为零会记录所有自动清理操作。
+ 当自动清理执行的操作运行时间至少达到指定毫秒数时,就会记录该操作。将此设置为零会记录所有自动清理操作。
负一(默认值)会禁用记录自动清理操作。
例如,如果将其设置为250ms ,则所有运行时间为250ms或更长的自动清理和分析都将被记录。
- 此外,当此参数设置为任何值而不是-1 时,如果由于冲突的锁定而跳过自动清理操作,则会记录消息。
+ 此外,当此参数设置为任何非-1 值时,如果由于冲突锁而跳过自动清理操作,则会记录消息。
启用此参数可帮助跟踪自动清理活动。
此参数只能在postgresql.conf 文件或服务器命令行中设置;但可以通过更改表存储参数来覆盖对单个表的设置。
@@ -4677,7 +4668,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
DEBUG1 、LOG 、NOTICE 、
WARNING 、ERROR 。
每个级别都包括其后的所有级别。级别越靠后,被发送的消息越少。默认值是NOTICE 。
- 注意LOG 在这里有与中不同的排名。
+ 注意LOG 在这里的排序与中的不同。
@@ -4695,11 +4686,11 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 这个变量指定当一个对象(表、数据类型、函数等)被用一个无模式限定的简单名称引用时,用于进行搜索该对象的模式顺序。当在不同模式中有同名对象时,将使用第一个在搜索路径中被找到的对象。一个不属于搜索路径中任何一个模式的对象只能通过用限定名(带点号)指定包含它的模式来引用。
+ 这个变量指定当一个对象(表、数据类型、函数等)被用一个无模式限定的简单名称引用时,搜索该对象时的模式顺序。当在不同模式中有同名对象时,将使用第一个在搜索路径中被找到的对象。一个不属于搜索路径中任何一个模式的对象只能通过用限定名(带点号)指定包含它的模式来引用。
- search_path 的值必需是一个逗号分隔的模式名列表。任何不是一个已有模式的名称,或者是一个用户不具有USAGE 权限的模式,将被安静地忽略。
+ search_path 的值必须是一个逗号分隔的模式名列表。任何不是一个已有模式的名称,或者是一个用户不具有USAGE 权限的模式,将被静默忽略。
@@ -4727,11 +4718,12 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 这个参数的缺省值是"$user", public 。这种设置支持一个数据库(其中没有用户拥有私有模式,并且所有人共享使用public )、每个用户私有模式及其组合的共享使用。其它效果可以通过全局或者针对每个用户修改默认搜索路径设置获得。
+ 这个参数的默认值是"$user", public 。这种设置支持共享使用数据库(用户没有私有模式,所有人共享使用public )、每个用户拥有私有模式,以及二者的组合。
+ 还可以通过全局或针对每个用户修改默认搜索路径设置来获得其他效果。
- 更多有关方案处理的信息,请参考。特别地,只有当数据库只有一个用户或者有少数的相互信任的用户时,默认配置是合适的。
+ 更多有关模式处理的信息,请参考。特别地,只有当数据库只有一个用户或者有少数的相互信任的用户时,默认配置是合适的。
@@ -4749,7 +4741,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 这个变量控制是否以抛出一个错误来代替应用一条行安全性策略。在设置为on>时,策略正常应用。在设置为off>时,只要有至少一条策略被应用则查询就会失败。默认为on>。受限的行可见性会导致不正确的结果时,可将其改成off>。例如,pg_dump>默认会做这种更改。这个变量对能绕过每一条行安全性策略的角色(即超级用户和具有BYPASSRLS>)属性的角色没有效果。
+ 这个变量控制是否以抛出一个错误来代替应用一条行安全性策略。在设置为on>时,策略正常应用。在设置为off>时,原本会应用至少一条策略的查询就会失败。默认为on>。受限的行可见性可能导致不正确的结果时,可将其改成off>。例如,pg_dump>默认会做这种更改。这个变量对能绕过每一条行安全性策略的角色(即超级用户和具有BYPASSRLS>属性的角色)没有效果。
@@ -4771,7 +4763,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 该值要么是一个表空间的名字,要么是一个指定使用当前数据库默认表空间的空字符串。如果该值和任何现有表空间的名字都不匹配,PostgreSQL 将自动使用当前数据库的默认表空间。如果指定了一个非默认的表空间,用户必须对它有CREATE 权限,否则创建企图将失败。
+ 该值要么是一个表空间的名字,要么是一个指定使用当前数据库默认表空间的空字符串。如果该值和任何现有表空间的名字都不匹配,PostgreSQL 将自动使用当前数据库的默认表空间。如果指定了一个非默认的表空间,用户必须对它有CREATE 权限,否则创建尝试将失败。
@@ -4779,7 +4771,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 当创建数据库时也会使用这个变量。默认情况下,一个新数据库会从它的模板数据库继承其表空间设置。
+ 创建数据库时也不会使用这个变量。默认情况下,一个新数据库会从它的模板数据库继承其表空间设置。
@@ -4803,11 +4795,11 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 该值是一个表空间名字的列表。当列表中有多于一个名称时,每次一个临时对象被创建时PostgreSQL 随机选择列表中的一个成员。例外是在一个事务中,连续创建的临时对象被放置在里表中的连续表空间中。如果列表被选中元素是一个空字符串,PostgreSQL 将自动使用当前数据库的默认表空间。
+ 该值是一个表空间名字的列表。当列表中有多于一个名称时,每次一个临时对象被创建时PostgreSQL 随机选择列表中的一个成员。例外是在一个事务中,连续创建的临时对象被依次放置在列表中的连续表空间中。如果列表中被选中的元素是一个空字符串,PostgreSQL 将自动使用当前数据库的默认表空间。
- 当temp_tablespaces 被交互式地设置时,指定一个不存在的表空间是一种错误,类似于为用户指定一个不具有CREATE 权限的表空间。不过,当使用一个之前设置的值时,不存在的表空间会被忽略,就像用户缺少CREATE 权限的表空间一样。特殊地,使用一个在postgresql.conf 中设置的值时,这条规则起效。
+ 当temp_tablespaces 被交互式地设置时,指定一个不存在的表空间是一种错误,指定一个用户不具有CREATE 权限的表空间也同样是错误。不过,当使用一个之前设置的值时,不存在的表空间会被忽略,就像用户缺少CREATE 权限的表空间一样。特别是,使用一个在postgresql.conf 中设置的值时,这条规则起效。
@@ -4830,7 +4822,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
这个参数通常为打开。
当设置为off 时,它禁用期间对函数体字符串的验证。
- 禁用验证避免了验证处理的副作用,特别避免了如向前引用导致的伪肯定。
+ 禁用验证避免了验证处理的副作用,也避免前向引用等问题导致的误报。
在代表其他用户载入函数之前设置这个参数为off ;pg_dump 会自动这样做。
@@ -4873,7 +4865,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 一个只读的 SQL 事务不能修改非临时表。这个参数控制每个新事务的默认只读状态 。默认是off (读/写)。
+ 一个只读的 SQL 事务不能修改非临时表。这个参数控制每个新事务的默认只读状态。默认是off (读/写)。
@@ -4894,11 +4886,11 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 当运行在serializable 隔离级别时,一个可延迟只读 SQL 事务可以在它被允许继续之前延迟一段时间。但是,一旦它开始执行就不会产生任何用来保证可串行化性的负荷;因此串行化代码将没有任何理由因为并发更新而强制它中断,使得这个选项适合于长时间运行的只读事务。
+ 当运行在serializable 隔离级别时,一个可延迟只读 SQL 事务可能在获准继续之前被延迟一段时间。但是,一旦它开始执行就不会产生任何用来保证可串行化性的开销;因此串行化代码将没有任何理由因为并发更新而强制它中止,使得这个选项适合于长时间运行的只读事务。
- 这个参数控制每个新事务的默认可延迟状态。目前它对读写事务或者那些操作在低于serializable 隔离级别上的事务无效。默认值是off 。
+ 这个参数控制每个新事务的默认可延迟状态。目前它对读写事务或者那些运行在低于serializable 隔离级别上的事务无效。默认值是off 。
@@ -4942,7 +4934,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
此参数反映当前事务的只读状态。
在每个事务的开始,它被设置为的当前值。
- 任何后续尝试更改它的都等同于命令。
+ 任何后续更改它的尝试都等同于命令。
@@ -4962,7 +4954,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
此参数反映当前事务的可延迟性状态。
在每个事务的开始,它被设置为的当前值。
- 任何后续尝试更改它的都等同于命令。
+ 任何后续更改它的尝试都等同于命令。
@@ -5016,7 +5008,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 与statement_timeout 不同,这个超时只在等待锁时发生。注意如果statement_timeout 为非零,设置lock_timeout 为相同或更大的值没有意义,因为事务超时将总是第一个被触发。
+ 与statement_timeout 不同,这个超时只在等待锁时发生。注意如果statement_timeout 为非零,设置lock_timeout 为相同或更大的值没有意义,因为语句超时将总是第一个被触发。
如果log_min_error_statement 被设置为ERROR 或更低,超时的语句将被记录。
@@ -5050,8 +5042,9 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
+
- 当表的pg_class .relfrozenxid 字段达到该设置指定的年龄时,VACUUM 会执行激进扫描。激进扫描与常规VACUUM 不同,它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不仅仅是那些可能包含死元组的页面。默认值是 1.5 亿个事务。尽管用户可以将该值设置为 0 到 20 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过的 95%,从而在触发防回卷 autovacuum 之前仍有机会执行一次常规手工VACUUM 。更多信息请参见。
+ 如果表的pg_class .relfrozenxid 字段达到此设置指定的年龄,VACUUM 就会执行一次激进扫描。激进扫描与常规VACUUM 不同,它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不仅仅是那些可能包含死元组的页面。默认值为 1.5 亿个事务。尽管用户可以将该值设置在 0 到 20 亿之间,VACUUM 仍会悄悄将其有效值限制为不超过的 95%,以便在针对该表启动防回卷自动清理之前,周期性手工VACUUM 仍有机会运行。详见。
@@ -5064,7 +5057,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 指定VACUUM 在扫描表时用来决定是否冻结行版本的切断年龄(以事务计)。默认值是 5000 万个事务。尽管用户可以将该值设置为 0 到 10 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过的一半,这样强制 autovacuum 之间就不会间隔过短。更多信息请参见。
+ 指定VACUUM 在扫描表时用来决定是否冻结行版本的截止年龄(以事务计)。默认值是 5000 万个事务。尽管用户可以将该值设置为 0 到 10 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过的一半,这样强制 autovacuum 之间就不会间隔过短。更多信息请参见。
@@ -5076,8 +5069,9 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
+
- 当表的pg_class .relminmxid 字段达到该设置指定的年龄时,VACUUM 会执行激进扫描。激进扫描与常规VACUUM 不同,它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不是只扫描那些可能包含死元组的页面。默认值是 1.5 亿个多事务。尽管用户可以将该值设置为 0 到 20 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过的 95%,从而在触发防回卷 autovacuum 之前仍有机会执行一次常规手工VACUUM 。更多信息请参见。
+ 如果表的pg_class .relminmxid 字段达到此设置指定的年龄,VACUUM 就会执行一次激进扫描。激进扫描与常规VACUUM 不同,它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不仅仅是那些可能包含死元组的页面。默认值为 1.5 亿个多事务。尽管用户可以将该值设置在 0 到 20 亿之间,VACUUM 仍会悄悄将其有效值限制为不超过的 95%,以便在针对该表启动防回卷清理之前,周期性手工VACUUM 仍有机会运行。详见。
@@ -5090,7 +5084,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 指定VACUUM 在扫描表时用来决定是否将多事务 ID 替换为较新的事务 ID 或多事务 ID 的切断年龄(以多事务计)。默认值是 500 万个多事务。尽管用户可以将该值设置为 0 到 10 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过的一半,这样强制 autovacuum 之间就不会间隔过短。更多信息请参见。
+ 指定VACUUM 在扫描表时用来决定是否将多事务 ID 替换为较新的事务 ID 或多事务 ID 的截止年龄(以多事务计)。默认值是 500 万个多事务。尽管用户可以将该值设置为 0 到 10 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过的一半,这样强制 autovacuum 之间就不会间隔过短。更多信息请参见。
@@ -5124,7 +5118,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 这里的实际选择都是根据爱好做出的,只受客户端应用中可能存在的限制的约束。两种方法都支持所有可能的值,尽管十六进制编码将比 base64 编码更大。
+ 这里的实际选择主要取决于偏好,只受客户端应用中可能存在的限制的约束。两种方法都支持所有可能的值,尽管十六进制编码会比 base64 编码略大。
@@ -5145,7 +5139,8 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 当在XML和字符串值之间进行转换时,无论设置DOCUMENT或 CONTENT都是隐式的。可参阅Section 8.13。 有效值是DOCUMENT和CONTENT。 缺省值是CONTENT。当在 XML 和字符串值之间进行转换时,设置DOCUMENT 或CONTENT 都是隐式的。详见。有效值是DOCUMENT 和CONTENT 。默认值是CONTENT 。
+ 设置在 XML 与字符串值之间进行转换时,隐含采用DOCUMENT 还是CONTENT 。
+ 有关说明参见。有效值是DOCUMENT 和CONTENT 。默认值是CONTENT 。
@@ -5177,7 +5172,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 区域和格式化
+ 区域设置和格式化
@@ -5191,7 +5186,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 设置日期和时间值的显示格式,以及解释有歧义的日期输入值的规则。由于历史原因, 这个变量包含两个独立的部分:输出格式声明(ISO 、Postgres 、SQL 或German )、 输入/输出的年/月/日顺序(DMY 、MDY 或YMD )。这些可以被独立设置或者一起设置。关键字Euro 和European 是DMY 的同义词;关键字US 、NonEuro 和NonEuropean 是MDY 的同义词。详见。内置默认值是ISO, MDY ,但是initdb 将用对应于选中的lc_time 区域行为的设置初始化配置文件。
+ 设置日期和时间值的显示格式,以及解释有歧义的日期输入值的规则。由于历史原因, 这个变量包含两个独立的部分:输出格式声明(ISO 、Postgres 、SQL 或German )、 输入/输出的年/月/日顺序(DMY 、MDY 或YMD )。这些可以被独立设置或者一起设置。关键字Euro 和European 是DMY 的同义词;关键字US 、NonEuro 和NonEuropean 是MDY 的同义词。详见。内置默认值是ISO, MDY ,但是initdb 将用对应于选中的lc_time 区域设置行为的设置初始化配置文件。
@@ -5204,10 +5199,13 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 设置间隔值的显示格式。值sql_standard 将产生匹配SQL 标准间隔文本的输出。当参数被设置为ISO 时,值postgres (默认)将产生匹配PostgreSQL 发行 8.4 之前的输出。当DateStyle 参数被设置为非ISO 输出时,值postgres_verbose 会产生匹配PostgreSQL 发行 8.4 之前的输出。值iso_8601 会产生匹配在 ISO 8601 的 4.4.3.2 节中定义的带标志符格式
的时间间隔的输出。
+ 设置时间间隔值的显示格式。值sql_standard 会生成符合SQL 标准时间间隔字面量的输出。
+ 值postgres (默认值)的输出与PostgreSQL 8.4 之前版本中设为ISO 时的输出一致。
+ 值postgres_verbose 的输出与PostgreSQL 8.4 之前版本中DateStyle 设为非ISO 输出时的输出一致。
+ 值iso_8601 会生成符合 ISO 8601 第 4.4.3.2 节定义的时间间隔带标志符格式
的输出。
- IntervalStyle 参数也可以影响对有歧义的间隔输入的解释。详见。
+ IntervalStyle 参数也会影响对有歧义的时间间隔输入的解释。详见。
@@ -5297,11 +5295,11 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 在一些系统上,这个区域分类并不存在。仍然可以设置这个变量,只是不会有任何效果。同样,所期望语言的翻译消息也可能不存在。在这种情况下,你将仍然继续看到英文消息。
+ 在一些系统上,这个区域设置类别并不存在。仍然可以设置这个变量,只是不会有任何效果。同样,所期望语言的翻译消息也可能不存在。在这种情况下,你将仍然继续看到英文消息。
- 只有超级用户能更改这个设置。
+ 只有超级用户能更改这个设置,因为它会同时影响发送到服务器日志和客户端的消息,设置不当可能降低服务器日志的可读性。
@@ -5316,7 +5314,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 设置用于格式化货币量的区域,例如用to_char 函数族。可接受的值是系统相关的;详见。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
+ 设置用于格式化货币量的区域设置,例如用to_char 函数族。可接受的值是系统相关的;详见。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
@@ -5331,7 +5329,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 设置用于格式化数字的区域,例如用to_char 函数族。可接受的值是系统相关的;详见。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
+ 设置用于格式化数字的区域设置,例如用to_char 函数族。可接受的值是系统相关的;详见。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
@@ -5346,7 +5344,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 设置用于格式化日期和时间的区域,例如用to_char 函数族。可接受的值是系统相关的;详见。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
+ 设置用于格式化日期和时间的区域设置,例如用to_char 函数族。可接受的值是系统相关的;详见。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
@@ -5361,7 +5359,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 选择被那些没有显式参数指定配置的文本搜索函数变体使用的文本搜索配置。详见。内置默认值是pg_catalog.simple ,但是如果能够标识一个匹配区域的配置,initdb 将用对应于选中的lc_ctype 区域的设置初始化配置文件。
+ 选择被那些没有显式参数指定配置的文本检索函数变体使用的文本检索配置。详见。内置默认值是pg_catalog.simple ,但是如果能够标识一个匹配该区域设置的配置,initdb 将用对应于选中的lc_ctype 区域设置的值初始化配置文件。
@@ -5375,7 +5373,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
为了载入附加的功能或者达到提高性能的目的,可用多个设置来预先载入共享库到服务器中。
- 例如'$libdir/mylib' 设置可能会导致mylib.so (或者某些平台上的mylib.sl )从安装的标准库目录被预装载。这些设置之间的区别在于生效的时间以及改变它们所需的权限。
+ 例如'$libdir/mylib' 设置会使mylib.so (或者某些平台上的mylib.sl )从安装的标准库目录被预装载。这些设置之间的区别在于生效的时间以及改变它们所需的权限。
@@ -5384,12 +5382,12 @@ SET XML OPTION { DOCUMENT | CONTENT };
只有特别为与PostgreSQL一起使用设计的共享库才能以这种方式载入。每一个PostgreSQL支持
- 的库都有一个魔法块
,它会被检查以保证兼容性。由于这个原因,非PostgreSQL无法
+ 的库都有一个魔法块
,它会被检查以保证兼容性。由于这个原因,非 PostgreSQL 库无法
以这种方式被载入。你可能可以使用操作系统的工具(如LD_PRELOAD )载入它。
- 总之,请参考特定模块的文档来用推荐的方法载入它。
+ 一般来说,请参考特定模块的文档来用推荐的方法载入它。
@@ -5421,9 +5419,8 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 这个特性的目的是允许非特权用户在特定的会话中载入正在调试的或者性能度量库,
- 而无需一个显式的LOAD 命令。为了这个目的,通常通过使用客
- 户端的PGOPTIONS 环境变量或者
+ 这个特性的目的是允许非特权用户在特定的会话中载入用于调试或性能测量的库,
+ 而无需一个显式的LOAD 命令。为了这个目的,通常通过使用客户端的PGOPTIONS 环境变量或者
ALTER ROLE SET 来设置这个参数。
@@ -5460,7 +5457,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
和不同,相对于在库被第一次使用
- 时载入它,在会话开始时载入库并没有什么性能优势。不过,当使用连接池时这样做还是有一些
+ 时载入它,在会话开始时载入库并没有明显的性能优势。不过,当使用连接池时这样做还是有一些
优势。
@@ -5498,9 +5495,9 @@ SET XML OPTION { DOCUMENT | CONTENT };
在 Windows 主机上,在服务器启动时预载入一个库并不会减少启动每个新服务器进程所需的
- 时间;每一个服务器进程将会重新载入预载入的库。不过,对于那些要在postmaster启动时
+ 时间;每一个服务器进程将会重新载入所有预载入的库。不过,对于那些要在postmaster启动时
执行操作的库来说,Windows 主机上的
- shared_preload_libraries 任然有用。
+ shared_preload_libraries 仍然有用。
@@ -5554,7 +5551,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- GIN 索引返回的集合尺寸的软上限。详见。
+ GIN 索引扫描返回的集合尺寸的软上限。详见。
@@ -5584,17 +5581,17 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 这是在锁上等待的毫秒数,然后再检查是否存在死锁条件。检查死锁相对昂贵,因此服务器不会每次等待锁时都运行它。
+ 指定在检查是否发生死锁之前等待锁的毫秒数。检查死锁相对昂贵,因此服务器不会每次等待锁时都运行它。
我们乐观地假设在生产应用程序中死锁并不常见,所以在检查死锁之前只是等待一段时间。
增加此值会减少在不必要的死锁检查中浪费的时间,但会减慢实际死锁错误的报告速度。
- 默认值为一秒(1s ),这可能是您在实践中想要的最小值。
- 在负载较重的服务器上,您可能希望提高它。
- 理想情况下,设置应超过您的典型事务时间,以提高在等待者决定检查死锁之前释放锁的几率。
+ 默认值为一秒(1s ),这可能是你在实践中想要的最小值。
+ 在负载较重的服务器上,你可能希望提高它。
+ 理想情况下,设置应超过你的典型事务时间,以提高在等待者决定检查死锁之前释放锁的几率。
只有超级用户能更改这个设置。
- 当被设置时,这个参数还可以决定发出关于锁等待的日志之前等待的时间量。如果你想调查锁延迟,你可能希望设置一个比正常的deadlock_timeout 小的值。
+ 当被设置时,这个参数也决定发出关于锁等待的日志之前等待的时间量。如果你想调查锁延迟,你可能希望设置一个比正常的deadlock_timeout 小的值。
@@ -5645,7 +5642,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 这个参数控制在谓词锁被提升为覆盖整个关系之前,该谓词锁能够在单个关系上锁住多少页面或元组。大于等于零的值表示一种绝对限制,而负值表示用除以这个设置的绝对值。默认值为-2,它将保持以往版本的PostgreSQL 中的行为。这个参数只能在postgresql.conf 文件中或者服务器命令行上设置。
+ 这个参数控制在谓词锁被提升为覆盖整个关系之前,可以对单个关系中的多少页面或元组加谓词锁。大于等于零的值表示一种绝对限制,而负值表示用除以这个设置的绝对值。默认值为-2,它将保持以往版本的PostgreSQL 中的行为。这个参数只能在postgresql.conf 文件中或者服务器命令行上设置。
@@ -5660,7 +5657,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 这个参数控制在谓词锁被提升为覆盖整个页面之前,该谓词锁能在单一页面上锁住多少行。默认值是2。这个参数只能在postgresql.conf 文件中或者服务器命令行上设置。
+ 这个参数控制在谓词锁被提升为覆盖整个页面之前,可以对单个页面中的多少行加谓词锁。默认值是2。这个参数只能在postgresql.conf 文件中或者服务器命令行上设置。
@@ -5686,7 +5683,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 这个参数控制数组输入解析器是否把未用引号的NULL 识别为一个空数组元素。默认为on ,允许输入包含空值的数组值。但是PostgreSQL 8.2 之前的版本不支持数组中的空值,并且因此将把NULL 当作指定一个值为字符串NULL
的正常数组元素。对于那些要求旧行为的应用的向后兼容性,这个变量可以被设置为off 。
+ 这个参数控制数组输入解析器是否把未用引号的NULL 识别为一个值为空值的数组元素。默认为on ,允许输入包含空值的数组值。但是PostgreSQL 8.2 之前的版本不支持数组中的空值,并且因此将把NULL 当作指定一个值为字符串NULL
的正常数组元素。为了向后兼容那些要求旧行为的应用,这个变量可以被设置为off 。
@@ -5704,11 +5701,11 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 这个参数控制字符串文本中的单引号是否能够用\' 来表示。首选的 SQL 标准的方法是将其双写('' ),但是PostgreSQL 在历史上也接受\' 。不过使用\' 容易导致安全风险,因为在某些客户端字符集编码中,有多字节字符的最后一个字节在数值上等价于 ASCII 的\ 。如果客户端代码没有做到正确转义,那么将会导致 SQL 注入攻击。如果服务器拒绝看起来带有被反斜线转义的单引号的查询,那么就可以避免这种风险。backslash_quote 的可用值是on (总是允许\' )、off (总是拒绝)以及safe_encoding (只有客户端编码不允许在多字节字符中存在 ASCII \ 时允许)。safe_encoding 是默认设置。
+ 这个参数控制字符串字面量中的单引号是否能够用\' 来表示。首选的 SQL 标准的方法是将其双写('' ),但是PostgreSQL 在历史上也接受\' 。不过使用\' 容易导致安全风险,因为在某些客户端字符集编码中,有多字节字符的最后一个字节在数值上等价于 ASCII 的\ 。如果客户端代码没有做到正确转义,那么就可能遭到 SQL 注入攻击。如果服务器拒绝看起来带有被反斜线转义的单引号的查询,那么就可以避免这种风险。backslash_quote 的可用值是on (总是允许\' )、off (总是拒绝)以及safe_encoding (只有客户端编码不允许在多字节字符中存在 ASCII \ 时允许)。safe_encoding 是默认设置。
- 注意在符合标准的字符串文本中,\ 就表示\ 。这个参数只影响不符合标准的文本的处理,包括转义字符串语法(E'...' )。
+ 注意在符合标准的字符串字面量中,\ 就表示\ 。这个参数只影响不符合标准的字面量的处理,包括转义字符串语法(E'...' )。
@@ -5746,11 +5743,11 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 打开时,如果在普通字符串文本中('...' 语法)出现了 一个反斜线(\ )并且standard_conforming_strings 为关闭,那么就会发出一个警告。默认值是on 。
+ 打开时,如果在普通字符串字面量中('...' 语法)出现了 一个反斜线(\ )并且standard_conforming_strings 为关闭,那么就会发出一个警告。默认值是on 。
- 希望使用反斜线作为转义符的应用应该被修改来使用转义字符串语法(E'...' ),因为在 SQL 标准中普通字符串的默认行为是将反斜线视作一个普通字符。这个变量可以被启用来帮助定位需要被更改的代码。
+ 希望使用反斜线作为转义符的应用应该被修改来使用转义字符串语法(E'...' ),因为按照 SQL 标准,普通字符串现在默认将反斜线视作一个普通字符。这个变量可以被启用来帮助定位需要被更改的代码。
@@ -5811,7 +5808,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
standard_conforming_strings (boolean )
- 字符串 标准符合
+ 字符串 符合标准
standard_conforming_strings 配置参数
@@ -5819,7 +5816,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 控制普通字符串文本('...' )是否按照 SQL 标准把反斜线当普通文本。从PostgreSQL 9.1 开始,默认值为on (之前的发行中默认值为off )。应用可以检查这个参数来判断字符串文本如何被处理。这个参数的存在也可以被当做转义字符串语法(E'...' )被支持的标志。如果一个应用希望反斜线被当做转义字符,应该使用转义字符串语法()。
+ 控制普通字符串字面量('...' )是否按照 SQL 标准把反斜线当普通文本。从PostgreSQL 9.1 开始,默认值为on (之前的发行中默认值为off )。应用可以检查这个参数来判断字符串字面量如何被处理。这个参数的存在也可以被当做转义字符串语法(E'...' )被支持的标志。如果一个应用希望反斜线被当做转义字符,应该使用转义字符串语法()。
@@ -5834,7 +5831,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 它允许对大型表的顺序扫描与其他扫描同步,因此并发扫描可以在几乎相同的时刻读取相同的块,这样可以分担 I/O 负载。当启用这个参数时,一个扫描可能会从表的中间开始并且之后绕回
到开头以覆盖所有的行,这样可以与已在进行中的扫描活动同步。对于没有ORDER BY 子句的查询来,这样的扫描会在返回行的顺序中造成不可预料的改变。将这个参数设置为off 以保证 8.3 之前的行为(顺序扫描总是从表的起始处开始)。默认值是on 。
+ 它允许对大型表的顺序扫描与其他扫描同步,因此并发扫描可以在几乎相同的时刻读取相同的块,这样可以分担 I/O 负载。当启用这个参数时,一个扫描可能会从表的中间开始并且之后绕回
到开头以覆盖所有的行,这样可以与已在进行中的扫描活动同步。对于没有ORDER BY 子句的查询,这样的扫描可能会在返回行的顺序中造成不可预料的改变。将这个参数设置为off 以保证 8.3 之前的行为(顺序扫描总是从表的起始处开始)。默认值是on 。
@@ -5857,15 +5854,15 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 当打开时,形为expr = NULL (或NULL = expr )的表达式将被当做expr IS NULL , 也就是说,如果expr 得出空值值则返回真,否则返回假。正确的 SQL 标准兼容的expr = NULL 行为总是返回空(未知)。因此这个参数默认为off 。
+ 当打开时,形为expr = NULL (或NULL = expr )的表达式将被当做expr IS NULL , 也就是说,如果expr 计算结果为空值则返回真,否则返回假。正确的 SQL 标准兼容的expr = NULL 行为总是返回空值(未知)。因此这个参数默认为off 。
- 不过,在Microsoft Access 里的过滤表单生成的查询似乎使用expr = NULL 来测试空值,因此,如果你使用这个接口访问数据库,你可能想把这个选项打开。因为expr = NULL 形式的表达式总是返回空值(使用 SQL 标准解释)。它们不是非常有用并且在普通应用中也不常见,在应用中也不常见,因此这个选项实际上没有什么危害。但是新用户常常对涉及 空值的表达式的语义上感到困惑,因此这个选项默认为关闭。
+ 不过,在Microsoft Access 里的过滤表单生成的查询似乎使用expr = NULL 来测试空值,因此,如果你使用这个接口访问数据库,你可能想把这个选项打开。因为expr = NULL 形式的表达式总是返回空值(使用 SQL 标准解释),它们不是非常有用并且在普通应用中也不常见,因此这个选项实际上没有什么危害。但是新用户常常对涉及空值的表达式语义感到困惑,因此这个选项默认为关闭。
- 请注意这个选项只影响= NULL 形式,而不影响其它比较操作符或者其它与一些涉及等值操作符的表达式在计算上等效的其他表达式(例如IN )。因此,这个选项不是劣质程序的一般修复。
+ 请注意这个选项只影响= NULL 形式,而不影响其它比较操作符或者其它与一些涉及等值操作符的表达式在计算上等效的其他表达式(例如IN )。因此,这个选项不能普遍修复错误的程序写法。
@@ -5922,15 +5919,15 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 如果设置为false(默认值),PostgreSQL 在将修改的数据文件刷新到文件系统失败时,将引发PANIC级错误。
+ 如果设置为false(默认值),PostgreSQL 在将修改后的数据文件刷盘到文件系统失败时,将引发PANIC级错误。
这样会导致数据库服务器崩溃。这个参数只能在服务器启动时被设置。
在某些操作系统上,回写失败后,内核页面缓存中的数据状态未知。 在某些情况下,它可能已被完全遗忘,因此重试不安全;第二次尝试可能报告为成功,而事实上数据已丢失。在此类情形下,避免数据丢失的唯一方法是在报告任何故障后从WAL中恢复,最好是在调查了故障的根本原因并更换了任何有故障的硬件之后。
- 如果设置为true,PostgreSQL 将报告错误,但会继续运行,以便可以在以后的检查点中重试数据刷新操作。
- 仅在调查操作系统假如回写失败时对缓冲数据的处理方式的情况下,才将其设置为true。
+ 如果设置为true,PostgreSQL 将报告错误,但会继续运行,以便可以在以后的检查点中重试数据刷盘操作。
+ 只有在调查清楚操作系统在回写失败时如何处理缓冲数据之后,才应将其设置为true。
@@ -5943,11 +5940,10 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
预置选项
- 下列参数
是只读的。
- 同样,它们被排除在postgresql.conf 文件示例之外。
- 这些选项报告特定应用可能感兴趣的多种PostgreSQL 行为,特别是管理前端相关的行为。
- 所有这些都是在PostgreSQL 被编译或者它被安装时决定的。
-
+ 下列参数
是只读的,在编译或安装 PostgreSQL 时确定。
+ 因此,它们未列入示例 postgresql.conf 文件。
+ 这些选项报告 PostgreSQL 行为的各个方面,某些应用(特别是管理前端)可能对此感兴趣。
+
@@ -5976,7 +5972,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告对这个集簇是否启用了数据校验码。详见。
+ 报告对这个集簇是否启用了数据校验和。详见。
@@ -6010,7 +6006,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告PostgreSQL 是否在编译时打开了 64 位整数日期和时间。从PostgreSQL 10起,这个值总是on 。
+ 报告PostgreSQL 是否在编译时启用了对 64 位整数日期和时间的支持。从PostgreSQL 10起,这个值总是on 。
@@ -6057,7 +6053,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告函数参数的最大数量。它由编译服务器时的FUNC_MAX_ARGS 值决定的。默认值是 100 个参数。
+ 报告函数参数的最大数量。它由编译服务器时的FUNC_MAX_ARGS 值决定。默认值是 100 个参数。
@@ -6072,7 +6068,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告标识符的最大长度。它由编译服务器时的NAMEDATALEN 值减一决定。NAMEDATALEN 的默认值是 64 ;因此max_identifier_length 的默认值是 63,但是在使用多字节编码时可以少于 63 个字符。
+ 报告标识符的最大长度。它由编译服务器时的NAMEDATALEN 值减一决定。NAMEDATALEN 的默认值是 64;因此max_identifier_length 的默认值是 63 字节,在使用多字节编码时,这可能不足 63 个字符。
@@ -6133,7 +6129,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告服务器版本数值。它是由编译服务器时的PG_VERSION 值决定的。
+ 报告服务器的版本号。它是由编译服务器时的PG_VERSION 值决定的。
@@ -6148,7 +6144,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告服务器版本数值的整数值。它是由编译服务器时的PG_VERSION_NUM 值决定的。
+ 以整数形式报告服务器的版本号。它是由编译服务器时的PG_VERSION_NUM 值决定的。
@@ -6190,11 +6186,11 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
自定义选项
- 这个特性被设计用来由附加模块向PostgreSQL 添加通常不为系统知道的参数(例如过程语言)。这允许使用标准方法配置扩展模块。
+ 这个特性允许附加模块(例如过程语言)向PostgreSQL 添加系统通常不认识的参数。这样便能以标准方式配置扩展模块。
- 自定义选项有两部分名称:一个扩展名,然后是一个句点,再然后是正确的参数名,就像 SQL 中的合格名称。一个示例是plpgsql.variable_conflict 。
+ 自定义选项的名称由两部分组成:扩展名称和参数名本身,中间用句点分隔,类似于 SQL 中的限定名。例如plpgsql.variable_conflict 。
@@ -6202,7 +6198,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
PostgreSQL 将接受任何两部分参数名称的设置。
这些变量被视为占位符,在定义它们的模块加载之前没有任何功能。
当加载扩展模块时,它将添加其变量定义并根据这些定义转换任何占位符值。
- 如果存在以其扩展名开头的任何未识别的占位符,将发出警告并删除这些占位符。
+ 如果存在以其扩展名称开头的任何未识别的占位符,将发出警告。
@@ -6226,7 +6222,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 允许将表空间创建为pg_tblspc 内的目录,当CREATE TABLESPACE 命令提供空位置字符串时。
+ 当向CREATE TABLESPACE 命令提供空的位置字符串时,允许将表空间创建为pg_tblspc 内的目录。
这旨在允许测试主库和备库在同一台机器上运行的复制场景。这样的目录可能会混淆备份工具,因为这些工具期望在该位置只找到符号链接。
只有超级用户能更改这个设置。
@@ -6257,7 +6253,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 读取系统表时忽略系统索引(但是修改系统表时依然同时更新索引)。这在从被破坏的系统索引中恢复数据的时有用。这个参数在会话开始之后不能被更改。
+ 读取系统表时忽略系统索引(但是修改系统表时依然同时更新索引)。这在从被破坏的系统索引中恢复数据时有用。这个参数在会话开始之后不能被更改。
@@ -6302,7 +6298,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 为LISTEN 和NOTIFY 命令生成大量调试输出。和必须是DEBUG1 或者更低才能把这种输出分别发送到客户端或者服务器日志。
+ 为LISTEN 和NOTIFY 命令生成大量调试输出。或必须是DEBUG1 或者更低才能把这种输出分别发送到客户端或者服务器日志。
@@ -6337,7 +6333,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 如果打开,发出在排序操作中的资源使用的相关信息。只有在编译PostgreSQL 时定义了TRACE_SORT 宏, 这个参数才可用(不过,当前在默认情况下就定义了TRACE_SORT )。
+ 如果开启,输出排序操作中的资源使用信息。只有在编译PostgreSQL 时定义了TRACE_SORT 宏, 这个参数才可用(不过,当前在默认情况下就定义了TRACE_SORT )。
@@ -6351,7 +6347,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 如果开启,发出锁使用情况的信息。被转储信息中包括锁操作的类型、锁的类型和 被锁或被解锁对象的唯一标识符。同样包括的还有已经授予这个对象的锁类型的位掩码和 等待这个对象的锁类型的位掩码。对每一种锁类型,已授权锁和等待锁的计数也会被一起转储。一个日志文件输出的示例如下:
+ 如果开启,发出锁使用情况的信息。被转储信息中包括锁操作的类型、锁的类型和 被锁或被解锁对象的唯一标识符。同样包括的还有已经授予这个对象的锁类型的位掩码和 等待这个对象的锁类型的位掩码。还会转储每种锁类型已授予的锁数、等待的锁数,以及它们的总数。一个日志文件输出的示例如下:
LOG: LockAcquire: new: lock(0xb7acd844) id(24688,24696,0,0,0,1)
grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0
@@ -6420,7 +6416,7 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
- 如果设置,不会跟踪小于这个 OID 的锁(用于避免在系统表上的输出)。
+ 如果设置,不会跟踪 OID 小于此值的表上的锁(用于避免在系统表上的输出)。
@@ -6491,7 +6487,7 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
- 这个参数被设计用来检查WAL重做例程中的缺陷。当这个参数被启用时,被修改的任何缓冲区的整页镜像及其WAL记录都被加入到记录中。如果该记录后来被重放,系统将首先应用每个记录然后测试该记录修改的缓冲区是否符合存储的镜像。在某些情况下(例如提示位),小的变动是可以接受的,并且会被忽略。任何预期之外的差别都将导致致命错误,最后中止恢复。
+ 这个参数被设计用来检查WAL重做例程中的缺陷。当这个参数被启用时,与该 WAL 记录相关的所有已修改缓冲区的整页镜像都会被添加到该记录中。如果该记录后来被重放,系统将首先应用每个记录然后测试该记录修改的缓冲区是否符合存储的镜像。在某些情况下(例如提示位),小的变动是可以接受的,并且会被忽略。任何预期之外的差别都将导致致命错误,最后中止恢复。
@@ -6534,11 +6530,11 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
在读取过程中检测到校验和失败通常会导致PostgreSQL 报告错误,中止当前事务。
- 将ignore_checksum_failure 设置为on会导致系统忽略失败(但仍然报告警告),并继续处理。
- 这种行为可能导致崩溃,传播或隐藏损坏,或其他严重问题 。然而,它可能允许您跳过错误,
- 并检索可能仍然存在于表中的未损坏的元组,如果块头仍然正常。如果头部损坏,即使启用此选项也会报告错误。
- 默认设置为off 。
- 只有超级用户能更改这个设置。
+ 将ignore_checksum_failure 设置为 on 会使系统忽略失败(但仍报告警告),并继续处理。
+ 这种行为可能导致崩溃、传播或隐藏损坏,或引发其他严重问题 。
+ 但是,如果块首部仍然正常,它可能允许你跳过错误,检索表中可能仍然存在的未损坏元组。
+ 如果首部损坏,即使启用此选项也会报告错误。默认设置为off 。
+ 只有超级用户才能更改此设置。
@@ -6555,7 +6551,7 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
检测到损坏的页面头通常会导致PostgreSQL 报告错误,中止当前事务。
将zero_damaged_pages 设置为on会导致系统报告警告,将内存中的损坏页面清零,并继续处理。
- 这种行为会破坏数据 ,即损坏页面上的所有行。但是,它确实允许您跳过错误,并从表中可能存在的未损坏页面中检索行。
+ 这种行为会破坏数据 ,即损坏页面上的所有行。但是,它确实允许你跳过错误,并从表中可能存在的未损坏页面中检索行。
如果由于硬件或软件错误而发生损坏,这对于恢复数据很有用。通常在放弃从表的损坏页面恢复数据的希望之前,不应将其设置为on。
清零的页面不会强制写入磁盘,因此建议在再次关闭此参数之前重新创建表或索引。默认设置为off 。
只有超级用户能更改这个设置。
@@ -6568,11 +6564,11 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
短选项
- 为了方便起见,系统中还为一些参数提供了单字母的命令行选项开关。它们在中描述。其中一些选项是由于历史原因而存在,并且它们作为一个单字母选项存在并不表示它们会被大量使用。
+ 为了方便起见,系统中还为一些参数提供了单字母的命令行选项开关。它们在中描述。其中一些选项是由于历史原因而存在,它们以单字母选项的形式存在,并不一定表示鼓励频繁使用这些选项。
- 短选项键
+ 短选项对照
diff --git a/zh/10/datatype.sgml b/zh/10/datatype.sgml
index b92b994c..ed81b236 100644
--- a/zh/10/datatype.sgml
+++ b/zh/10/datatype.sgml
@@ -148,7 +148,7 @@
line
- 平面上的无限长的线
+ 平面上的无限直线
@@ -160,19 +160,19 @@
macaddr
- MAC(Media Access Control)地址
+ MAC(媒体访问控制)地址
macaddr8
- MAC(Media Access Control)地址(EUI-64格式)
+ MAC(媒体访问控制)地址(EUI-64格式)
money
- 货币数量
+ 货币额
@@ -180,7 +180,7 @@
s ) ]
decimal [ (p ,
s ) ]
- 可选择精度的精确数字
+ 可选择精度的精确数值
@@ -192,7 +192,7 @@
pg_lsn
- PostgreSQL 日志序列号类型
+ PostgreSQL 日志序列号
@@ -264,13 +264,13 @@
tsquery
- 文本搜索查询
+ 文本检索查询
tsvector
- 文本搜索文档
+ 文本检索文档
@@ -407,14 +407,14 @@
- 数字类型常量的语法在里描述。数字类型有一整套对应的数学操作符和函数。相关信息请参考 。下面的几节详细描述这些类型。
+ 数字类型常量的语法在里描述。数字类型有一整套对应的算术操作符和函数。相关信息请参考 。下面的几节详细描述这些类型。
整数类型
- 整数
+ integer
@@ -427,7 +427,7 @@
int4
- 整数
+ integer
@@ -447,11 +447,11 @@
- 常用的类型是integer ,因为它提供了在范围、存储空间和性能之间的最佳平衡。一般只有在磁盘空间紧张的时候才使用 smallint 类型。而只有在integer 的范围不够的时候才使用bigint 。
+ 常用的类型是integer ,因为它提供了在范围、存储空间和性能之间的最佳平衡。一般只有在磁盘空间紧张的时候才使用 smallint 类型。bigint 则设计用于integer 的范围不够的情况。
- SQL 只声明了整数类型integer (或int )、smallint 和bigint 。类型int2 、int4 和int8 都是扩展,也在许多其它SQL 数据库系统中使用。
+ SQL 只规定了整数类型integer (或int )、smallint 和bigint 。类型int2 、int4 和int8 都是扩展,也在某些其他SQL 数据库系统中使用。
@@ -460,11 +460,11 @@
任意精度数值
- 数字(数据类型)
+ numeric(数据类型)
- 任意精度数字
+ 任意精度数值
@@ -476,7 +476,14 @@
类型numeric 可以存储非常多位的数字。我们特别建议将它用于货币金额和其它要求计算准确的数量。numeric 值的计算在可能的情况下会得到准确的结果,例如加法、减法、乘法。不过,numeric 类型上的算术运算比整数类型或者下一节描述的浮点数类型要慢很多。
- 下面使用如下术语:numeric 的精度 是整个数中有效数字的总数,即小数点两侧的数字位数之和。numeric 的小数位数 是小数部分中十进制数字的数量,即小数点右侧的位数。因此,数值 23.5141 的精度为 6,小数位数为 4。整数可以视为小数位数为零。
+
+ 我们在下文中使用以下术语:
+ 精度 (precision)是一个numeric
+ 值中有效数字的总位数,也就是小数点两侧数字的总数。
+ 小数位数 (scale)是小数部分中位于小数点
+ 右侧的十进制位数。因此,数值 23.5141 的精度为 6,小数位数为 4。
+ 整数可以认为其小数位数为 0。
+
可以配置numeric 列的最大精度和最大小数位数。要声明numeric 类型的列,使用以下语法:
NUMERIC(precision , scale )
@@ -506,12 +513,12 @@ NUMERIC
NaN
- 非数字
+ 非数
- 非数字
- 数字(数据类型)
+ 非数
+ numeric(数据类型)
除了普通数值外,numeric 类型还允许特殊值NaN ,表示非数
。对NaN 的任何运算都会产生另一个NaN 。在 SQL 命令中将该值写为常量时,必须加上引号,例如UPDATE table SET x = 'NaN' 。输入时,字符串NaN 的识别不区分大小写。
@@ -565,7 +572,7 @@ FROM generate_series(-3.5, 3.5, 1) as x;
- 双精度
+ double precision
@@ -575,7 +582,7 @@ FROM generate_series(-3.5, 3.5, 1) as x;
float8
- 双精度
+ double precision
@@ -618,7 +625,7 @@ FROM generate_series(-3.5, 3.5, 1) as x;
- 非数字
+ 非数
double precision
@@ -626,7 +633,7 @@ FROM generate_series(-3.5, 3.5, 1) as x;
Infinity
-Infinity
NaN
-它们分别表示 IEEE 754 的特殊值无穷大
, 负无穷大
和非数字
。(在浮点运算不遵循 IEEE 754 的机器上,这些值可能无法按预期工作。)在 SQL 命令中将这些值写为常量时,必须加上引号,例如UPDATE table SET x = '-Infinity' 。输入时,这些字符串的识别不区分大小写。
+它们分别表示 IEEE 754 的特殊值无穷大
、 负无穷大
和非数
。(在浮点运算不遵循 IEEE 754 的机器上,这些值可能无法按预期工作。)在 SQL 命令中将这些值写为常量时,必须加上引号,例如UPDATE table SET x = '-Infinity' 。输入时,这些字符串的识别不区分大小写。
@@ -686,13 +693,13 @@ FROM generate_series(-3.5, 3.5, 1) as x;
- auto-increment
+ 自动递增
serial
- sequence
- and serial type
+ 序列
+ 与 serial 类型
@@ -817,7 +824,7 @@ ALTER SEQUENCE tablename _
SELECT '12.34'::float8::numeric::money;
- 但是,我们不推荐这样做。浮点数不应该被用来处理货币,因为浮点数可能会有圆整错误。
+ 但是,我们不推荐这样做。浮点数不应该被用来处理货币,因为浮点数可能会有舍入误差。
@@ -829,7 +836,7 @@ SELECT '52093.89'::money::numeric::float8;
一个 money 值除以一个整数值时,会朝零方向截去小数
- 部分。要得到圆整结果,可以除以一个浮点值,或者在除法前先把
+ 部分。要得到舍入后的结果,可以除以一个浮点值,或者在除法前先把
money 转换为 numeric ,再在除法后转换回
money (如果要避免精度丢失风险,后一种做法更好)。
当一个 money 值被另一个 money 值除时,
@@ -848,12 +855,12 @@ SELECT '52093.89'::money::numeric::float8;
- string
+ 串
字符串
- 字符
+ character
@@ -888,7 +895,7 @@ SELECT '52093.89'::money::numeric::float8;
character(n ) , char(n )
- 定长,空白填充
+ 定长,空格填充
text
@@ -960,7 +967,7 @@ SELECT '52093.89'::money::numeric::float8;
- 可以存储在这些数据类型中的字符由数据库字符集确定,该数据库字符集在创建数据库时选择。无论特定的字符集是什么,都无法存储代码为零的字符(有时称为NUL)。有关更多信息,请参阅。
+ 可以存储在这些数据类型中的字符由数据库字符集确定,该数据库字符集在创建数据库时选择。无论特定的字符集是什么,都无法存储编码值为零的字符(有时称为NUL)。有关更多信息,请参阅。
@@ -979,7 +986,7 @@ SELECT '52093.89'::money::numeric::float8;
- 这三种类型之间没有性能差别,除了使用空白填充类型时会占用更多存储
+ 这三种类型之间没有性能差别,除了使用空格填充类型时会占用更多存储
空间,以及在写入带长度约束的列时需要少量额外 CPU 周期来检查长度。
虽然在某些其他数据库系统中,character(n )
可能有一定性能优势,但在 PostgreSQL
@@ -1014,7 +1021,7 @@ 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
+INSERT INTO test2 VALUES ('too long'::varchar(5)); -- 显式截断
SELECT b, char_length(b) FROM test2;
b | char_length
@@ -1133,7 +1140,7 @@ SELECT b, char_length(b) FROM test2;
开头(以便与转义格式区分)。在某些上下文中,这个开头的反斜线
可能需要通过双写进行转义(见
)。作为输入时,十六进制数字
- 可以使用大写或小写,并且在两个数字组成的一组之间允许出现空白
+ 可以使用大写或小写,并且每两个数字组成一组,组与组之间允许出现空白
(但组内以及起始的 \x 序列中不能有空白)。
十六进制格式与大量外部应用和协议兼容,并且通常比转义格式转换得
更快,因此更推荐使用。
@@ -1185,7 +1192,7 @@ SELECT '\xDEADBEEF';
0
- 0字节
+ 零值字节
'\000'
SELECT '\000'::bytea;
\x00
@@ -1242,15 +1249,24 @@ SELECT '\xDEADBEEF';
- Bytea 字节默认以hex 格式输出。如果把改为escape ,
- 不可打印
字节会被转换为等价的三位八进制值,并在前面加一个反斜线。大多数可打印
字节以客户端字符集中相应的标准表示输出,例如:
+ 默认情况下,bytea 字节会以 hex
+ 格式输出。如果把 改为
+ escape ,不可打印
字节会被转换成
+ 等价的三位八进制值,并在前面加一个反斜线。大多数
+ 可打印
字节则会按其在客户端字符集中的标准表示输出,
+ 例如:
+
+
SET bytea_output = 'escape';
SELECT 'abc \153\154\155 \052\251\124'::bytea;
bytea
----------------
abc klm *\251T
- 十进制值为 92 的字节(反斜线)在输出中会被双写。详情见。
+
+
+ 十进制值 92(反斜线)的字节在输出中会被双写。详情见
+ 。
@@ -1316,10 +1332,10 @@ SELECT 'abc \153\154\155 \052\251\124'::bytea;
time
- 不带时区的时间
+ time without time zone
- 带时区的时间
+ time with time zone
timestamp
@@ -1328,13 +1344,13 @@ SELECT 'abc \153\154\155 \052\251\124'::bytea;
timestamptz
- 带时区的时间戳
+ timestamp with time zone
- 不带时区的时间戳
+ timestamp without time zone
- 间隔
+ interval
时间跨度
@@ -1418,7 +1434,7 @@ SELECT 'abc \153\154\155 \052\251\124'::bytea;
- SQL 要求仅写 timestamp 时,应等效于
+ SQL 标准要求仅写 timestamp 时,应等效于
timestamp without time zone ,而
PostgreSQL 也遵循这种行为。
timestamptz 被接受为
@@ -1501,7 +1517,7 @@ MINUTE TO SECOND
其中 p 是可选的精度说明,给出秒字段中
保留的小数位数。精度可用于 time 、
timestamp 和 interval 类型,
- 范围是 0 到 6。这与前文描述的取值一致。如果在常量声明中没有指定
+ 范围是 0 到 6。如果在常量声明中没有指定
精度,则默认采用该字面值本身的精度(但不超过 6 位)。
@@ -1528,7 +1544,7 @@ MINUTE TO SECOND
1999-01-08
- ISO 8601; 任何模式下的1月8日
+ ISO 8601; 任何模式下的1月8日
(推荐格式)
@@ -1564,27 +1580,27 @@ MINUTE TO SECOND
99-Jan-08
- YMD 模式中的1月8日,否则错误
+ YMD 模式中的1月8日,否则报错
08-Jan-99
- 1月8日,除了在YMD 模式中错误
+ 1月8日,但在YMD 模式中会报错
Jan-08-99
- 1月8日,除了在YMD 模式中错误
+ 1月8日,但在YMD 模式中会报错
19990108
- ISO 8601; 任何模式中的1999年1月8日
+ ISO 8601; 任何模式中的1999年1月8日
990108
- ISO 8601; 任何模式中的1999年1月8日
+ ISO 8601; 任何模式中的1999年1月8日
1999.008
- 年和一年中的日子
+ 年和一年中的第几天
J2451187
@@ -1606,10 +1622,10 @@ MINUTE TO SECOND
time
- 无时区的时间
+ time without time zone
- 带时区的时间
+ time with time zone
@@ -1684,11 +1700,11 @@ MINUTE TO SECOND
040506+0730
- ISO 8601,以分数小时形式给出 UTC 偏移
+ ISO 8601,时区的 UTC 偏移不是整小时
040506+07:30:00
- UTC偏移量指定为秒(ISO 8601中不允许)
+ UTC 偏移精确到秒(ISO 8601中不允许)
04:05:06 PST
@@ -1765,20 +1781,34 @@ MINUTE TO SECOND
- 带时区的时间戳
+ timestamp with time zone
- 无时区的时间戳
+ timestamp without time zone
- 时间戳类型的有效输入由日期与时间拼接而成,其后可以跟时区,再后可以跟AD 或BC 。(或者,AD /BC 可以出现在时区之前,但这不是首选顺序。)因此:
+
+ 时间戳类型的有效输入由一个日期和时间的串接组成,后面跟着一个可选
+ 时区,以及一个可选的 AD 或 BC
+ (另外,AD /BC 也可以出现在
+ 时区前面,但这种顺序并不推荐)。因此:
+
+
1999-01-08 04:05:06
- 以及:
+
+ 和:
+
1999-01-08 04:05:06 -8:00
- 都是有效值,遵循ISO 8601 标准。此外,也支持下面这种常用格式:
+
+
+ 都是遵循 ISO 8601 标准的有效值。另外,广泛使用
+ 的下列格式:
+
January 8 04:05:06 1999 PST
- 。
+
+ 也被支持。
+
按照SQL 标准,timestamp without time zone 和timestamp with time zone 字面量的区别在于,时间后是否有+
或-
符号及其后的时区偏移。因此,按照该标准,TIMESTAMP '2004-10-19 10:23:54' 是timestamp without time zone ,而TIMESTAMP '2004-10-19 10:23:54+02' 是timestamp with time zone 。
PostgreSQL 在确定字符串字面量的类型之前,从不检查其内容,因此会把上述两者都视为timestamp without time zone 。为确保字面量被视为timestamp with time zone ,应为它显式指定正确类型:TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02' 若字面量已经被确定为timestamp without time zone , PostgreSQL 会静默忽略任何时区标记。也就是说,所得值来自输入值中的日期/时间字段,不会根据时区调整。
@@ -1808,12 +1838,12 @@ January 8 04:05:06 1999 PST
time
- constants
+ 常量
date
- constants
+ 常量
@@ -1914,13 +1944,13 @@ January 8 04:05:06 1999 PST
date
输出格式
- formatting
+ 格式化
time
输出格式
- formatting
+ 格式化
@@ -1950,7 +1980,7 @@ January 8 04:05:06 1999 PST
ISO
- ISO 8601, SQL标准
+ ISO 8601,SQL 标准
1997-12-17 07:37:16-08
@@ -1981,7 +2011,7 @@ January 8 04:05:06 1999 PST
- SQL 和POSTGRES风格中,如果DMY域顺序被指定,“日”将出现在“月”之前,否则“月”出现在“日”之前(有关该设置如何影响输入值的解释,请参考)。给出了示例。
+ SQL 和POSTGRES风格中,如果指定了 DMY 字段顺序,“日”将出现在“月”之前,否则“月”出现在“日”之前(有关该设置如何影响输入值的解释,请参考)。给出了示例。
@@ -2044,7 +2074,7 @@ January 8 04:05:06 1999 PST
时区
- time zone
+ 时区
@@ -2099,7 +2129,8 @@ January 8 04:05:06 1999 PST
- PostgreSQL 允许使用三种不同形式指定时区:
+ PostgreSQL 允许使用三种不同形式来指定时区:
+
完整时区名称,例如 America/New_York 。
@@ -2128,11 +2159,20 @@ January 8 04:05:06 1999 PST
除了时区名称和缩写之外,
PostgreSQL 还接受 POSIX 风格的
时区说明,见 。
- 这个选项通常不如使用具名时区更合适,但如果没有可用的 IANA
- 时区条目,它可能就是必需的。
+ 这个选项通常不如使用具名时区更合适,但如果没有合适的 IANA 时区条目可用,它可能就是必需的。
- 简而言之,缩写和完整名称的区别是:缩写表示特定的 UTC 偏移,而许多完整名称隐含本地夏令时规则,因此有两个可能的 UTC 偏移。例如,2014-06-04 12:00 America/New_York>表示纽约当地时间的中午,在该日期使用的是东部夏令时间(UTC-4)。因此,2014-06-04 12:00 EDT>指定相同的时刻。但是,2014-06-04 12:00 EST>指定东部标准时间(UTC-5)的中午,而不管该日期是否名义上实行夏令时。
+
+
+ 简而言之,这就是缩写和全名的区别:缩写表示某个特定的 UTC 偏移,
+ 而很多完整名称隐含了当地的夏令时规则,因此可能对应两个不同的
+ UTC 偏移。例如,
+ 2014-06-04 12:00 America/New_York 表示纽约
+ 当地时间中午;在这个具体日期,它属于东部夏令时(UTC-4),所以
+ 2014-06-04 12:00 EDT 指定的是同一个时刻。
+ 但 2014-06-04 12:00 EST 指定的是东部标准时
+ 中午(UTC-5),无论当天名义上是否正在实行夏令时。
+
更复杂的是,一些司法辖区在不同时间使用同一时区缩写来表示不同的
@@ -2143,12 +2183,17 @@ January 8 04:05:06 1999 PST
当地民用时间。
- 在所有情况下,时区名称和缩写的识别都不区分大小写。(这与 8.2 之前的PostgreSQL 版本不同;那些版本在某些上下文中区分大小写,在另一些上下文中则不区分。)
+
+ 无论哪种形式,时区名称及其缩写都不区分大小写。(这是对
+ PostgreSQL 8.2 之前版本的一项改动;
+ 在那些版本中,时区名在某些环境下区分大小写,而在另一些环境下则
+ 不区分。)
+
时区名称和缩写并不是硬编码在服务器中的;它们来自安装目录下
.../share/timezone/ 和
- .../share/timezonesets/ 子目录中的数据
+ .../share/timezonesets/ 子目录中的配置文件
(见 )。
@@ -2186,13 +2231,13 @@ January 8 04:05:06 1999 PST
- interval 值可以使用下列语法书写:
+ interval 值可以使用下列详细语法书写:
@ quantity unit quantity unit ... direction
- 其中quantity 是一个数字(很可能是有符号的);
+ 其中quantity 是一个数字(可以带有符号);
unit 是microsecond 、
millisecond 、second 、
minute 、hour 、day 、
@@ -2226,7 +2271,7 @@ January 8 04:05:06 1999 PST
P quantity unit quantity unit ... T quantity unit ...
字符串必须以 P 开头,并且可以包含一个
- T 来引出一天中时间单位。可用的单位缩写见
+ T 来引出一天中的时间单位。可用的单位缩写见
。单位可以省略,
也可以按任意顺序出现,但小于一天的单位必须出现在
T 之后。特别是,M 的含义
@@ -2265,7 +2310,7 @@ P quantity unit
M
- 分钟 (在时间部分中)
+ 分钟(在时间部分中)
S
@@ -2340,7 +2385,7 @@ P years -months -
P1Y2M3DT4H5M6S
- 带标志符的
ISO 8601 格式:含义同上
+ ISO 8601 带标志符的格式
:含义同上
P0001-02-03T04:05:06
@@ -2370,7 +2415,7 @@ SELECT EXTRACT(days from '80 hours'::interval);
interval
输出格式
- formatting
+ 格式化
@@ -2407,7 +2452,7 @@ SELECT EXTRACT(days from '80 hours'::interval);
iso_8601 风格的输出符合 ISO 8601 标准
- 4.4.3.2 节描述的带标志符格式
。
+ 4.4.3.2 节描述的带标志符的格式
。
@@ -2458,7 +2503,7 @@ SELECT EXTRACT(days from '80 hours'::interval);
布尔类型
- Boolean
+ 布尔
数据类型
@@ -2569,15 +2614,15 @@ SELECT * FROM test1 WHERE a;
数据类型
- enumerated (enum)
+ 枚举(enum)
- enumerated types
+ 枚举类型
- 枚举(enum)类型是由一个静态、值的有序集合构成的数据类型。它们等效于很多编程语言所支持的enum 类型。枚举类型的一个示例可以是一周中的日期,或者一个数据的状态值集合。
+ 枚举(enum)类型是由一个静态的有序值集合构成的数据类型。它们等效于很多编程语言所支持的enum 类型。枚举类型的一个示例可以是一周中的各天,或者一个数据的状态值集合。
@@ -2686,7 +2731,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
实现细节
- 枚举标签是大小写敏感的,因此'happy' 与'HAPPY' 是不同的。标签中的空格也是有意义的。
+ 枚举标签是大小写敏感的,因此'happy' 与'HAPPY' 是不同的。标签中的空白也是有意义的。
@@ -2698,7 +2743,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 从内部枚举值到文本标签的翻译被保存在系统目录pg_enum 中。可以直接查询该目录。
+ 从内部枚举值到文本标签的转换关系被保存在系统目录pg_enum 中。直接查询该目录可能会有所帮助。
@@ -2769,7 +2814,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
circle
24字节
圆
- <(x,y),r>(中心点和半径)
+ <(x,y),r>(圆心和半径)
@@ -2777,7 +2822,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
我们提供了丰富的函数和操作符来进行各种几何操作,例如缩放、平移、
- 旋转以及计算相交等,详见 。
+ 旋转以及求交等,详见 。
@@ -2788,7 +2833,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 点是几何类型的基本二维构造块。用下面的语法描述point 类型的值:
+ 点是几何类型的基本二维构造块。用下面任一种语法描述point 类型的值:
( x , y )
@@ -2804,14 +2849,14 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 线
+ 直线
line
- 线由线性方程A x + B y + C = 0
+ 直线由线性方程A x + B y + C = 0
表示,其中A 和B 不能同时为零。类型line
的值采用以下形式输入和输出:
@@ -2831,7 +2876,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
(x1 ,y1 )
和
(x2 ,y2 )
- 是线上不同的两点。
+ 是直线上不同的两点。
@@ -2847,7 +2892,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 线段用一对线段的端点来表示。lseg 类型的值用下面的语法声明:
+ 线段用一对线段的端点来表示。lseg 类型的值用下面任一种语法指定:
[ ( x1 , y1 ) , ( x2 , y2 ) ]
@@ -2871,15 +2916,15 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
方框
- box (data type)
+ box(数据类型)
- rectangle
+ 矩形
- 方框用其对角的点对表示。box 类型的值使用下面的语法指定:
+ 方框用其对角的点对表示。box 类型的值使用下面任一种语法指定:
( ( x1 , y1 ) , ( x2 , y2 ) )
@@ -2898,7 +2943,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 在输入时可以提供任意两个对角,但是值将根据需要被按顺序记录为右上角和左下角。
+ 在输入时可以提供任意两个对角,但是值将根据需要被重新排列,并依次存储为右上角和左下角。
@@ -2906,7 +2951,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
路径
- path (data type)
+ path(数据类型)
@@ -2914,7 +2959,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- path 类型的值用下面的语法声明:
+ path 类型的值用下面任一种语法指定:
[ ( x1 , y1 ) , ... , ( xn , yn ) ]
@@ -2924,11 +2969,11 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
x1 , y1 , ... , xn , yn
- 其中的点是组成路径的线段的端点。方括弧([] )表示一个开放的路径,圆括弧(() )表示一个封闭的路径。如第三种到第五种语法所示,当最外面的圆括号被忽略时,路径将被假定为封闭。
+ 其中的点是组成路径的线段的端点。方括弧([] )表示一个开放的路径,圆括弧(() )表示一个封闭的路径。如第三种到第五种语法所示,当最外面的圆括号被省略时,路径将被假定为封闭。
- 路径的输出使用第一种或第二种语法。
+ 路径的输出视情况使用第一种或第二种语法。
@@ -2939,10 +2984,10 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
polygon
- 多边形由点的列表(多边形的顶点)表示。多边形与闭合路径非常相似,但存储方式不同,并且有自己的支持例程。
+ 多边形由点的列表(多边形的顶点)表示。多边形与封闭路径非常相似,但存储方式不同,并且有自己的支持例程。
- polygon 类型的值用下列语法声明:
+ polygon 类型的值用下列任一种语法指定:
( ( x1 , y1 ) , ... , ( xn , yn ) )
@@ -2967,7 +3012,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 圆由一个圆心和一个半径代表。circle 类型的值用下面的语法指定:
+ 圆由一个圆心和一个半径代表。circle 类型的值用下面任一种语法指定:
< ( x , y ) , r >
@@ -2990,7 +3035,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
网络地址类型
- network
+ 网络
数据类型
@@ -3044,8 +3089,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
在对 inet 或 cidr 数据类型排序时,IPv4
- 地址总是排在 IPv6 地址之前,包括那些封装在 IPv6 地址中或映射到
- IPv6 地址中的 IPv4 地址,例如 ::10.2.3.4 或
+ 地址总是排在 IPv6 地址之前,即使后者是封装或映射 IPv4 地址所得的 IPv6 地址,例如 ::10.2.3.4 或
::ffff:10.4.3.2。
@@ -3091,7 +3135,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
cidr 类型保存 IPv4 或 IPv6 网络说明。输入和输出格式
遵循无类别域间路由(CIDR)约定。指定网络的格式为
address/y ,其中
- address 是网络最低地址的
+ address 是网络的
IPv4 或 IPv6 表示,而
y 是网络掩码中的位数。
如果省略 y ,则会按照旧式
@@ -3201,7 +3245,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- inet vs. cidr
+ inet 与 cidr
inet 和 cidr 两种数据类型的本质区别在于:
@@ -3227,12 +3271,12 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- MAC地址
+ MAC 地址
macaddr
- macaddr 类型存储 MAC 地址,也就是以太网卡硬件地址 (尽管 MAC 地址还用于其它用途)。可以接受下列格式的输入:
+ macaddr 类型存储 MAC 地址,例如以太网卡硬件地址 (尽管 MAC 地址还用于其它用途)。可以接受下列格式的输入:
'08:00:2b:01:02:03'
@@ -3266,15 +3310,15 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
macaddr8
- macaddr8 (data type)
+ macaddr8(数据类型)
- MAC地址(EUI-64格式)
+ MAC 地址(EUI-64 格式)
macaddr
- 此macaddr8 类型以 EUI-64 格式存储 MAC 地址,例如常见的以太网卡硬件地址(尽管 MAC 地址也有其他用途)。该类型既接受 6 字节也接受 8 字节的 MAC 地址,并以 8 字节格式存储。给定的 6 字节格式 MAC 地址会以 8 字节格式存储,其中第 4 和第 5 字节分别设为 FF 和 FE。注意,IPv6 使用修改后的 EUI-64 格式,从 EUI-48 转换后应将第 7 位设为 1。提供的函数macaddr8_set7bit 可完成这一更改。一般来说,接受由成对十六进制数字(在字节边界上)构成的输入,各对之间可以统一使用':' , '-' 或'.' 中的一种分隔。十六进制数字的数量必须为 16 个(8 字节)或 12 个(6 字节)。开头和结尾的空白会被忽略。以下是可以接受的输入格式示例:
+ 此macaddr8 类型以 EUI-64 格式存储 MAC 地址,例如常见的以太网卡硬件地址(尽管 MAC 地址也有其他用途)。该类型既接受 6 字节也接受 8 字节的 MAC 地址,并以 8 字节格式存储。给定的 6 字节格式 MAC 地址会以 8 字节格式存储,其中第 4 和第 5 字节分别设为 FF 和 FE。注意,IPv6 使用修改后的 EUI-64 格式,从 EUI-48 转换后应将第 7 位设为 1。提供的函数macaddr8_set7bit 可完成这一更改。一般来说,接受由成对十六进制数字(在字节边界上)构成的输入,各对之间可以统一使用':' 、 '-' 或'.' 中的一种分隔。十六进制数字的数量必须为 16 个(8 字节)或 12 个(6 字节)。开头和结尾的空白会被忽略。以下是可以接受的输入格式示例:
'08:00:2b:01:02:03:04:05'
'08-00-2b-01-02-03-04-05'
'08002b:0102030405'
@@ -3307,7 +3351,13 @@ SELECT macaddr8_set7bit('08:00:2b:01:02:03');
数据类型
- 位串是由 1 和 0 组成的字符串,可用于存储或可视化位掩码。SQL 有两种位类型:bit(n ) 和bit varying(n ) ,其中n 是正整数。
+
+ 位串是由 1 和 0 组成的字符串。它们可用于存储或展示位掩码。
+ SQL 中有两种位类型:
+ bit(n ) 和
+ bit varying(n ) ,其中
+ n 是正整数。
+
bit 类型的数据长度必须与
@@ -3357,31 +3407,31 @@ SELECT * FROM test;
- 一个 bit 串值每 8 位需要 1 个字节,再加上 5 或 8 个字节的额外
+ 一个位串值每 8 位需要 1 个字节,再加上 5 或 8 个字节的额外
开销,具体取决于串的长度。(不过,长值可能会被压缩或移到行外存储,
与 中对字符串的说明相同。)
- 文本搜索类型
+ 文本检索类型
- 全文搜索
+ 全文检索
数据类型
- 文本搜索
+ 文本检索
数据类型
- PostgreSQL 提供了两种专为支持全文搜索而
- 设计的数据类型。所谓全文搜索,是指在一组自然语言
+ PostgreSQL 提供了两种专为支持全文检索而
+ 设计的数据类型。所谓全文检索,是指在一组自然语言
文档 中查找最匹配某个
查询 的文档。tsvector 类型以
- 适合文本搜索的优化形式表示文档,tsquery 类型则表示
+ 适合文本检索的优化形式表示文档,tsquery 类型则表示
文本查询。关于这一功能的详细解释见 ;
相关函数和操作符的概览见 。
@@ -3393,40 +3443,74 @@ SELECT * FROM test;
tsvector(数据类型)
- 一个tsvector 值是由互不相同的词位 组成的有序列表。词位是经过规范化 以合并同一个词的不同变体的词(详情见)。排序和去重会在输入时自动完成,如本例所示:
+
+ tsvector 值是一个排好序且互不重复的
+ 词位 (lexeme)列表,这些词已经过
+ 正规化 ,以便把同一单词的不同变体合并起来
+ (详见 )。排序和去重会在输入时自动
+ 完成,如下例所示:
+
+
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
tsvector
----------------------------------------------------
'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'
- 要表示包含空白或标点符号的词位,请用引号括住它们:
+
+
+ 若要表示包含空白或标点的词位,请用引号将它们括起来:
+
+
SELECT $$the lexeme ' ' contains spaces$$::tsvector;
tsvector
-------------------------------------------
' ' 'contains' 'lexeme' 'spaces' 'the'
- (本例和下一个示例使用美元符号引用的字符串字面量,以免在字面量中双写引号造成混淆。)内嵌的引号和反斜线必须双写:
+
+
+ (本例及下例使用美元引用的字符串常量,以避免在字符串内部必须
+ 双写引号所造成的混淆。)嵌入的引号和反斜线必须双写:
+
+
SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;
tsvector
------------------------------------------------
'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'
- 还可以给词位附加整数形式的位置 ,如下所示:
+
+
+ 还可以为词位附加整数形式的 位置 :
+
+
SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;
tsvector
-------------------------------------------------------------------------------
'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4
- 位置通常表示原词在文档中的位置。位置信息可用于邻近度排序 。位置值的范围为 1 到 16383;更大的数值会被静默设为 16383。同一词位的重复位置会被丢弃。
+
- 具有位置的词位还可以标记一个权重 ,它可以是A ,
- B , C 或D 。
- D 是默认值,因此不会在输出中显示:
+ 一个位置通常表示源词在文档中的位置。位置信息可用于
+ 邻近度排序 。位置值可以位于 1 到 16383
+ 之间;更大的数字会被静默设为 16383。同一词位的重复位置会被丢弃。
+
+
+
+ 带有位置的词位还可以进一步附加一个
+ 权重 标签,其值可以是
+ A 、B 、C
+ 或 D 。D 是默认值,因此在
+ 输出中不会显示:
+
+
SELECT 'a:1A fat:2B,4C cat:5D'::tsvector;
tsvector
----------------------------
'a':1A 'cat':5 'fat':2B,4C
- 权重通常用来反映文档结构,例如为标题中的词和正文中的词采用不同标记。文本搜索排名函数可以为不同的权重标记分配不同优先级。
+
+
+ 权重通常用于反映文档结构,例如把标题中的词和正文中的词区分开来。
+ 文本检索排序函数可以为不同的权重标记分配不同优先级。
+
必须认识到,tsvector 类型本身并不会执行任何词语
- 规范化;它假定输入的词已经按照应用需求完成规范化。例如:
+ 正规化;它假定输入的词已经按照应用需求完成正规化。例如:
SELECT 'The Fat Rats'::tsvector;
@@ -3435,9 +3519,9 @@ SELECT 'The Fat Rats'::tsvector;
'Fat' 'Rats' 'The'
- 对于大多数英文全文搜索应用来说,上述词会被视为尚未规范化,但
+ 对于大多数英文全文检索应用来说,上述词会被视为尚未正规化,但
tsvector 并不在意。原始文档文本通常应先经过
- to_tsvector ,以按搜索需要对词语进行规范化:
+ to_tsvector ,以按检索需要对词语进行正规化:
SELECT to_tsvector('english', 'The Fat Rats');
@@ -3526,9 +3610,9 @@ SELECT 'super:*'::tsquery;
引号的使用规则与前面介绍 tsvector 时相同;同样,
- 与 tsvector 一样,任何需要的词语规范化都必须在
+ 与 tsvector 一样,任何需要的词语正规化都必须在
转换为 tsquery 类型之前完成。to_tsquery
- 函数很适合用来实现这种规范化:
+ 函数很适合用来实现这种正规化:
SELECT to_tsquery('Fat:ab & Cats');
@@ -3554,8 +3638,7 @@ SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' );
---------------+------------
'postgradu':1 | 'postgr':*
- 因而它能够匹配其带前缀的后继形式
- postgraduate 。
+ 因而它能够匹配postgraduate 词干化后的形式。
@@ -3573,7 +3656,7 @@ SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' );
uuid 数据类型用于存储由
RFC 4122、
ISO/IEC 9834-8:2005 及相关标准定义的通用唯一标识符(UUID)。
- (有些系统把这种数据类型称为全局唯一标识符,或 GUID,
+ (有些系统把这种数据类型称为全局唯一标识符,或 GUID
GUID 。)这种标识符是一个
128 位的量,由某种算法生成,该算法被设计为使同一算法在已知宇宙中
被其他人生成出相同标识符的概率极低。因此,对于分布式系统而言,
@@ -3590,7 +3673,7 @@ SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' );
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
PostgreSQL 也接受其他输入形式:可以使用
- 大写字母、用花括号包围标准格式、忽略部分或全部连字符,或者在任意
+ 大写字母、用花括号包围标准格式、省略部分或全部连字符,或者在任意
4 位分组后额外加上连字符。例如:
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
@@ -3638,16 +3721,25 @@ a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
创建XML值
- 要生成xml 类型的值,可以对字符数据使用函数xmlparse :xmlparse
+
+ 要从字符数据生成 xml 类型的值,可以使用函数
+ xmlparse :xmlparse
XMLPARSE ( { DOCUMENT | CONTENT } value )
- 例如:
+ 示例:
+Manual ... ')
XMLPARSE (CONTENT 'abcbar foo ')
-]]> 按照 SQL 标准,这是将字符串转换为 XML 值的唯一方式,不过也可以使用以下 PostgreSQL 特有语法:
+ 按照 SQL 标准,这是把字符串转换为 XML 值的
+ 唯一方法;但 PostgreSQL 特有的下列语法:
+bar'
'bar '::xml
-]]> 。
+]]>
+ 也可以使用。
+
即使输入值指定了文档类型声明(DTD),xml 类型也不会
@@ -3656,18 +3748,25 @@ xml 'bar '
来执行验证。
- 相反的操作是把xml 值转换为字符串,这使用函数xmlserialize :xmlserialize
+
+ 反向操作,也就是从 xml 生成字符串值,则使用函数
+ xmlserialize :xmlserialize
XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type )
- type 可以是character , character varying 或text (或这些类型之一的别名)。同样,按照 SQL 标准,这是在xml 类型和字符类型之间转换的唯一方式,不过 PostgreSQL 也允许直接对值进行类型转换。
+ type 可以是
+ character 、character varying 或
+ text (或它们的别名)。同样,根据 SQL 标准,这是在
+ xml 与字符类型之间进行转换的唯一方式,但
+ PostgreSQL 也允许你直接进行类型转换。
+
当字符串值在不经过 XMLPARSE 或
XMLSERIALIZE 的情况下与 xml 类型互相转换时,
选择 DOCUMENT 还是 CONTENT
- 由会话配置参数 XML option
- XML option 决定,可以使用
+ 由会话配置参数 XML 选项
+ XML 选项 决定,可以使用
标准命令设置:
SET XML OPTION { DOCUMENT | CONTENT };
@@ -3731,7 +3830,7 @@ SET xmloption TO { DOCUMENT | CONTENT };
xml 数据类型有些特殊,因为它不提供任何比较操作符。
这是因为对 XML 数据并不存在良定义且通用的比较算法。其结果是,
- 你无法通过把某个 xml 值与搜索值比较来检索行。
+ 你无法通过把某个 xml 列与搜索值比较来检索行。
因此,XML 值通常应伴随一个独立的键字段,例如 ID。另一种比较
XML 值的办法,是先把它们转换成字符串;但请注意,字符串比较对
XML 的比较需求通常帮助不大。
@@ -3739,14 +3838,14 @@ SET xmloption TO { DOCUMENT | CONTENT };
由于 xml 数据类型没有可用的比较操作符,因此无法直接
- 在这种类型上创建索引。如果需要在 XML 中快速搜索,可行方案包括:
+ 在这种类型的列上创建索引。如果需要在 XML 中快速搜索,可行方案包括:
将表达式转换为字符串类型后为其建立索引,或者为某个 XPath 表达式
建立索引。当然,实际查询也必须相应调整为使用该被索引的表达式。
- PostgreSQL 的文本搜索功能也可用于加速
- XML 数据的全文搜索。不过,目前 PostgreSQL 发行版中仍缺少所需的
+ PostgreSQL 的文本检索功能也可用于加速
+ XML 数据的全文检索。不过,目前 PostgreSQL 发行版中仍缺少所需的
预处理支持。
@@ -3883,7 +3982,7 @@ SELECT * FROM pg_attribute
regprocedure
pg_proc
- 函数与参数类型
+ 带参数类型的函数
sum(int4)
@@ -3932,21 +4031,21 @@ SELECT * FROM pg_attribute
regconfig
pg_ts_config
- 文本搜索配置
+ 文本检索配置
english
regdictionary
pg_ts_dict
- 文本搜索字典
+ 文本检索词典
simple
- 对于按名字空间分组的对象,所有 OID 别名类型都接受模式限定名称;如果不加限定就无法在当前搜索路径中找到对象,输出时也会显示模式限定名称。regproc 和regoper 别名类型只接受唯一的(未重载的)输入名称,因此用途有限;对于大多数用途,regprocedure 或regoperator 更合适。对于regoperator ,通过将未使用的操作数写为NONE 来标识一元操作符。
+ 对于按命名空间分组的对象,所有 OID 别名类型都接受模式限定名称;如果不加限定就无法在当前搜索路径中找到对象,输出时也会显示模式限定名称。regproc 和regoper 别名类型只接受唯一的(未重载的)输入名称,因此用途有限;对于大多数用途,regprocedure 或regoperator 更合适。对于regoperator ,通过将未使用的操作数写为NONE 来标识一元操作符。
大多数 OID 别名类型还有一个附加特性,就是会创建依赖关系。如果
@@ -3954,9 +4053,8 @@ SELECT * FROM pg_attribute
它就会对被引用对象建立依赖。例如,如果某列的默认表达式是
nextval('my_seq'::regclass) ,
PostgreSQL 就会知道该默认表达式依赖于
- 序列 my_seq ,因此系统在删除该序列之前,必须先
- 移除该默认表达式。
- (regrole 是这一特性的例外:该类型的常量不允许出现在
+ 序列 my_seq ,因此系统不允许在尚未移除该默认表达式时删除序列。
+ (regrole 是这一特性的唯一例外:该类型的常量不允许出现在
存储表达式中。)
@@ -4118,7 +4216,7 @@ SELECT * FROM pg_attribute
anyarray
- 表示一个函数可以接受任意数组数据类型(参见)
+ 表示一个函数可以接受任意数组数据类型(参见)。
@@ -4173,12 +4271,12 @@ SELECT * FROM pg_attribute
trigger
- 触发器函数被声明为返回trigger.
+ 表示触发器函数被声明为返回 trigger 。
event_trigger
- 事件触发器函数被声明为返回event_trigger.
+ 表示事件触发器函数被声明为返回 event_trigger 。
@@ -4193,11 +4291,11 @@ SELECT * FROM pg_attribute
unknown
- 标识一种尚未解析出的类型,例如未修饰的字符串字面值。
+ 标识一种尚未解析出的类型,例如未修饰的字符串字面值的类型。
- opaque>
+ opaque
一个已废弃的类型名称,以前用于上述多种用途。
diff --git a/zh/10/dict-int.sgml b/zh/10/dict-int.sgml
index df327be2..b323402d 100644
--- a/zh/10/dict-int.sgml
+++ b/zh/10/dict-int.sgml
@@ -1,16 +1,16 @@
- dict_int — 用于整数的示例全文搜索词典
+ dict_int — 用于整数的示例全文检索词典
dict_int
- dict_int 是一个全文搜索附加词典模板的示例。
+ dict_int 是一个全文检索附加词典模板的示例。
引入这个示例词典是为了控制整数(有符号和无符号)的索引,
- 使这类数字能够被索引,同时又避免唯一词的数量过度增长,
+ 使这类数字能够被索引,同时又避免不同词的数量过度增长,
因为那会严重影响搜索性能。
@@ -42,7 +42,7 @@
用法
- 安装dict_int 扩展后,会创建一个文本搜索模板
+ 安装dict_int 扩展后,会创建一个文本检索模板
intdict_template 以及一个基于该模板、使用默认参数的词典
intdict 。你可以修改这些参数,例如:
@@ -65,7 +65,7 @@ mydb# select ts_lexize('intdict', '12345678');
但在实际使用中,通常需要像所述那样,
- 将它包含到某个文本搜索配置中。可能类似如下:
+ 将它包含到某个文本检索配置中。可能类似如下:
ALTER TEXT SEARCH CONFIGURATION english
diff --git a/zh/10/func.sgml b/zh/10/func.sgml
index 3d614011..df33bdd4 100644
--- a/zh/10/func.sgml
+++ b/zh/10/func.sgml
@@ -6851,7 +6851,7 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
- 文本搜索函数和操作符
+ 文本检索函数和操作符
全文检索
@@ -6859,7 +6859,7 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
- 文本搜索
+ 文本检索
函数和操作符
@@ -6867,11 +6867,11 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
、
以及
- 总结了为全文检索提供的函数和操作符。PostgreSQL 的文本搜索功能的详细解释可参考。
+ 总结了为全文检索提供的函数和操作符。PostgreSQL 的文本检索功能的详细解释可参考。
- 文本搜索操作符
+ 文本检索操作符
@@ -6954,10 +6954,10 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
tsquery 包含操作符只考虑两个查询中列出的词位,忽略组合操作符。
- 除了表中列出的操作符,tsvector 和 tsquery 类型还定义了普通的 B-树比较操作符(= 、< 等)。这些操作符对文本搜索用处不大,但可以用于其他用途,例如在这些类型的列上建立唯一索引。
+ 除了表中列出的操作符,tsvector 和 tsquery 类型还定义了普通的 B-树比较操作符(= 、< 等)。这些操作符对文本检索用处不大,但可以用于其他用途,例如在这些类型的列上建立唯一索引。
- 文本搜索函数
+ 文本检索函数
@@ -6979,7 +6979,7 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
get_current_ts_config get_current_ts_config()
regconfig
- 获取默认的文本搜索配置
+ 获取默认的文本检索配置
get_current_ts_config()
english
@@ -7174,17 +7174,17 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
- 所有接受一个可选的regconfig 参数的文本搜索函数在省略该参数时,会使用由指定的配置。
+ 所有接受一个可选的regconfig 参数的文本检索函数在省略该参数时,会使用由指定的配置。
- 中的函数被单独列出,因为它们通常不被用于日常的文本搜索操作。
- 它们有助于开发和调试新的文本搜索配置。
+ 中的函数被单独列出,因为它们通常不被用于日常的文本检索操作。
+ 它们有助于开发和调试新的文本检索配置。
- 文本搜索调试函数
+ 文本检索调试函数
diff --git a/zh/10/gist.sgml b/zh/10/gist.sgml
index 23317615..4965f1ea 100644
--- a/zh/10/gist.sgml
+++ b/zh/10/gist.sgml
@@ -670,7 +670,7 @@ my_fetch(PG_FUNCTION_ARGS)
示例
- PostgreSQL 源代码发行包包含了若干使用GiST 实现的索引方法示例。核心系统目前提供了文本搜索支持(为tsvector 和tsquery 建立索引),并为某些内置几何数据类型提供了与 R 树等价的功能(见src/backend/access/gist/gistproc.c )。下列contrib 模块中也包含GiST 操作符类:
+ PostgreSQL 源代码发行包包含了若干使用GiST 实现的索引方法示例。核心系统目前提供了文本检索支持(为tsvector 和tsquery 建立索引),并为某些内置几何数据类型提供了与 R 树等价的功能(见src/backend/access/gist/gistproc.c )。下列contrib 模块中也包含GiST 操作符类:
diff --git a/zh/10/json.sgml b/zh/10/json.sgml
index f2a4b761..18dc68a9 100644
--- a/zh/10/json.sgml
+++ b/zh/10/json.sgml
@@ -23,7 +23,7 @@
有两种 JSON 数据类型:json 和 jsonb 。它们接受的输入值集合几乎 相同。实际使用中的主要区别是效率。json 数据类型保存输入文本的精确副本,处理函数每次执行时都必须重新解析;而 jsonb 数据以分解后的二进制格式存储,额外的转换开销使输入稍慢,但无需重新解析,因此处理速度明显更快。jsonb 还支持索引,这可能带来显著优势。
- 由于 json 类型存储的是输入文本的精确副本,因此它会保留标记
+ 由于 json 类型存储的是输入文本的精确副本,因此它会保留词元
之间在语义上无关紧要的空白,以及 JSON 对象内部键的顺序。此外,如果值中
的某个 JSON 对象包含同一个键多次,所有键/值对都会被保留下来(处理函数会
将最后一个值视为生效值)。相比之下,jsonb 不保留空白,不保留
@@ -46,7 +46,7 @@
当把文本形式的 JSON 输入转换为 jsonb 时,
- RFC 7159 描述的基本类型会有效映射到原生的
+ RFC 7159 描述的基本类型实际上会映射到原生的
PostgreSQL 类型上,如
所示。因此,什么样的数据构成
有效的 jsonb 会有一些额外但较小的限制,这些限制不适用于
@@ -94,7 +94,7 @@
null
- (无)
+ (无)
SQL NULL 是不同的概念
@@ -109,18 +109,18 @@
以下都是有效的 json (或 jsonb )表达式:
--- Simple scalar/primitive value
--- Primitive values can be numbers, quoted strings, true, false, or null
+-- 简单的标量/基本值
+-- 基本值可以是数字、加引号的字符串、true、false 或 null
SELECT '5'::json;
--- Array of zero or more elements (elements need not be of same type)
+-- 包含零个或多个元素的数组(元素不必是同一类型)
SELECT '[1, 2, "foo", null]'::json;
--- Object containing pairs of keys and values
--- Note that object keys must always be quoted strings
+-- 包含键值对的对象
+-- 注意,对象的键必须始终是加引号的字符串
SELECT '{"bar": "baz", "balance": 7.77, "active": false}'::json;
--- Arrays and objects can be nested arbitrarily
+-- 数组和对象可以任意嵌套
SELECT '{"foo": [true, "bar"], "tags": {"a": 1, "b": null}}'::json;
@@ -171,8 +171,7 @@ SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
当 JSON 数据存储在表中时,它与任何其他数据类型一样,都要面对相同的并发控
制考量。虽然存储大型文档是可行的,但要记住,任何更新都会在整行上获取一个
行级锁。应考虑将 JSON 文档限制在可管理的大小,以减少更新事务之间的锁争用。
- 理想情况下,每个 JSON 文档都应表示一个原子数据项,按照业务规则,它不应被
- 合理地进一步拆分为更小且可独立修改的数据项。
+ 理想情况下,每个 JSON 文档都应表示一个原子数据项,根据业务规则,无法再合理地将它细分为更小且可独立修改的数据项。
@@ -180,11 +179,11 @@ SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
jsonb 包含与存在
jsonb
- containment
+ 包含
jsonb
- existence
+ 存在
测试 包含 是 jsonb 的一项重要能力。
@@ -193,33 +192,32 @@ SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
示例都返回真:
--- Simple scalar/primitive values contain only the identical value:
+-- 简单的标量/基本值只包含相同的值:
SELECT '"foo"'::jsonb @> '"foo"'::jsonb;
--- The array on the right side is contained within the one on the left:
+-- 左侧数组包含右侧数组:
SELECT '[1, 2, 3]'::jsonb @> '[1, 3]'::jsonb;
--- Order of array elements is not significant, so this is also true:
+-- 数组元素的顺序无关紧要,因此下面的结果也为真:
SELECT '[1, 2, 3]'::jsonb @> '[3, 1]'::jsonb;
--- Duplicate array elements don't matter either:
+-- 重复的数组元素也无关紧要:
SELECT '[1, 2, 3]'::jsonb @> '[1, 2, 2]'::jsonb;
--- The object with a single pair on the right side is contained
--- within the object on the left side:
+-- 左侧对象包含右侧只有一个键值对的对象:
SELECT '{"product": "PostgreSQL", "version": 9.4, "jsonb": true}'::jsonb @> '{"version": 9.4}'::jsonb;
--- The array on the right side is not considered contained within the
+-- The array on the right side is not> considered contained within the
-- array on the left, even though a similar array is nested within it:
-SELECT '[1, 2, [1, 3]]'::jsonb @> '[1, 3]'::jsonb; -- yields false
+SELECT '[1, 2, [1, 3]]'::jsonb @> '[1, 3]'::jsonb; -- 结果为假
--- But with a layer of nesting, it is contained:
+-- 但增加一层嵌套后,就构成了包含关系:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[[1, 3]]'::jsonb;
--- Similarly, containment is not reported here:
-SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"bar": "baz"}'::jsonb; -- yields false
+-- 同样,下面也不构成包含关系:
+SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"bar": "baz"}'::jsonb; -- 结果为假
--- A top-level key and an empty object is contained:
+-- 包含由顶层键和空对象构成的对象:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"foo": {}}'::jsonb;
@@ -234,11 +232,11 @@ SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"foo": {}}'::jsonb;
对于结构必须匹配这一一般原则,有一个特殊例外:数组可以包含一个基本值:
--- This array contains the primitive string value:
+-- 这个数组包含该基本字符串值:
SELECT '["foo", "bar"]'::jsonb @> '"bar"'::jsonb;
--- This exception is not reciprocal -- non-containment is reported here:
-SELECT '"bar"'::jsonb @> '["bar"]'::jsonb; -- yields false
+-- 这个例外并不对称——下面的结果表示不包含:
+SELECT '"bar"'::jsonb @> '["bar"]'::jsonb; -- 结果为假
@@ -248,19 +246,19 @@ SELECT '"bar"'::jsonb @> '["bar"]'::jsonb; -- yields false
外,下面这些示例都返回真:
--- String exists as array element:
+-- 字符串作为数组元素存在:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';
--- String exists as object key:
+-- 字符串作为对象键存在:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';
--- Object values are not considered:
-SELECT '{"foo": "bar"}'::jsonb ? 'bar'; -- yields false
+-- 不考虑对象的值:
+SELECT '{"foo": "bar"}'::jsonb ? 'bar'; -- 结果为假
--- As with containment, existence must match at the top level:
-SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- yields false
+-- 与包含关系一样,存在性必须在顶层匹配:
+SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- 结果为假
--- A string is considered to exist if it matches a primitive JSON string:
+-- 如果字符串与一个基本 JSON 字符串匹配,则认为它存在:
SELECT '"foo"'::jsonb ? 'foo';
@@ -274,8 +272,7 @@ SELECT '"foo"'::jsonb ? 'foo';
由于 JSON 包含是嵌套的,因此适当的查询可以跳过对子对象的显式选择。例如,
假设我们有一个 doc 列,其顶层是对象,而且大
多数对象都带有 tags 字段,该字段中包含子对象数组。下面
- 这个查询会找出那些包含同时带有 "term":"paris" 和
- "term":"food" 的子对象的项,同时忽略
+ 这个查询会找出同时出现包含 "term":"paris" 的子对象和包含 "term":"food" 的子对象的项,同时忽略
tags 数组之外的任何此类键:
SELECT doc->'site_name' FROM websites
@@ -305,7 +302,7 @@ SELECT doc->'site_name' FROM websites
jsonb 索引
jsonb
- indexes on
+ 索引
@@ -313,7 +310,7 @@ SELECT doc->'site_name' FROM websites
或键/值对。提供了两种 GIN 操作符类
,它们在性能和灵活性
之间提供不同的权衡。
- 对于jsonb ,默认 GIN 操作符类支持使用顶层键存在操作符? , ?& 和?| 以及路径/值存在操作符@> 的查询。(这些操作符所实现语义的详情,参见。)使用此操作符类创建索引的示例如下:
+ 对于jsonb ,默认 GIN 操作符类支持使用顶层键存在操作符? 、 ?& 和?| 以及路径/值存在操作符@> 的查询。(这些操作符所实现语义的详情,参见。)使用此操作符类创建索引的示例如下:
CREATE INDEX idxgin ON api USING GIN (jdoc);
非默认的 GIN 操作符类jsonb_path_ops 仅支持为@> 操作符建立索引。使用此操作符类创建索引的示例如下:
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
@@ -344,14 +341,14 @@ CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
名为 jdoc 的 jsonb 列里。
如果在该列上创建了 GIN 索引,那么下面这样的查询就可以利用这个索引:
--- Find documents in which the key "company" has value "Magnafone"
+-- 查找键 "company" 的值为 "Magnafone" 的文档
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"company": "Magnafone"}';
但是,类似下面这样的查询就无法使用该索引,因为虽然操作符
? 可索引,但它并未直接应用到被索引的列
jdoc 上:
--- Find documents in which the key "tags" contains key or array element "qui"
+-- 查找键 "tags" 包含键或数组元素 "qui" 的文档
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc -> 'tags' ? 'qui';
不过,只要适当地使用表达式索引,上述查询也可以利用索引。如果经常查询
@@ -368,7 +365,7 @@ CREATE INDEX idxgintags ON api USING GIN ((jdoc -> 'tags'));
另一种查询方法是利用包含,例如:
--- Find documents in which the key "tags" contains array element "qui"
+-- 查找键 "tags" 包含数组元素 "qui" 的文档
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"tags": ["qui"]}';
jdoc 列上的简单 GIN 索引可以支持这个查询。
@@ -391,9 +388,9 @@ SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"tags": ["qu
基本上,每个 jsonb_path_ops 索引项都是该值连同
- 通向该值的键一起计算出的哈希。例如,要索引
+ 通向该值的键一起计算出的 hash。例如,要索引
{"foo": {"bar": "baz"}} ,会创建一个单独的索引项,
- 其哈希值中同时纳入 foo 、bar 和
+ 其 hash 值中同时纳入 foo 、bar 和
baz 这三者。因此,查找这一结构的包含查询会得到一次
非常精确的索引搜索;但完全没有办法据此找出 foo 是否
作为键出现。另一方面,jsonb_ops 索引会分别创建三个
@@ -413,11 +410,11 @@ SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"tags": ["qu
jsonb 也支持btree 和hash 索引。通常只有在需要检查完整 JSON 文档是否相等时,这些索引才有用。对于btree 排序,jsonb 数据的顺序很少值得关注,但为求完整,列出如下:
-Object > Array > Boolean > Number > String > Null
+对象 > 数组 > 布尔值 > 数字 > 字符串 > Null
-Object with n pairs > object with n - 1 pairs
+包含 n 个键值对的对象 > 包含 n - 1 个键值对的对象
-Array with n elements > array with n - 1 elements
+包含 n 个元素的数组 > 包含 n - 1 个元素的数组
键值对数量相等的对象按以下顺序比较:
键-1 , 值-1 , 键-2 ...
注意,对象键按其存储顺序比较;尤其是,较短的键存储在较长的键之前,因此可能产生不直观的结果,例如:
diff --git a/zh/10/libpq.sgml b/zh/10/libpq.sgml
index d9201174..007172ab 100644
--- a/zh/10/libpq.sgml
+++ b/zh/10/libpq.sgml
@@ -12,19 +12,19 @@
- libpq 是应用程序员使用PostgreSQL 的C 接口。libpq 是一个库函数的集合,它们允许客户端程序传递查询给PostgreSQL 后端服务器并且接收这些查询的结果。
+ libpq 是PostgreSQL 的C 应用程序编程接口。libpq 是一组库函数,客户端程序可用它们向PostgreSQL 后端服务器发送查询并接收查询结果。
- libpq 也是很多其他PostgreSQL 应用接口的底层引擎,包括为 C++、Perl、Python、Tcl 和 ECPG 编写的接口。如果你使用那些包,某些方面的libpq 行为将会对你很重要。特别是,、和描述了任何使用libpq 的应用的用户可见的行为。
+ libpq 也是其他几个PostgreSQL 应用程序接口的底层引擎,包括为 C++、Perl、Python、Tcl 和ECPG 编写的接口。因此,对于这些包的用户,libpq 行为的某些方面也很重要。特别是,、和描述了任何使用libpq 的应用程序的用户都能观察到的行为。
- 在本章的末尾()包括了一些短程序来展示如何编写使用libpq 的应用。在源代码发布的src/test/examples 目录中还有一些完整的libpq 应用的示例。
+ 本章末尾()包含一些简短程序,展示如何编写使用libpq 的程序。源代码发行包的src/test/examples 目录中还提供了几个完整的libpq 应用程序示例。
- 使用libpq 的客户端程序必须包括头文件libpq-fe.h libpq-fe.h 并必须与libpq 库链接在一起。
+ 使用libpq 的客户端程序必须包含头文件libpq-fe.h libpq-fe.h ,并且必须与libpq 库链接。
@@ -39,7 +39,7 @@
- 在 Unix 上,复制一个拥有打开 libpq 连接的进程可能导致不可预料的结果,因为父进程和子进程会共享相同的套接字和操作系统资源。出于这个原因,我们不推荐这样的用法,尽管从子进程执行一个exec 来载入新的可执行代码是安全的。
+ 在 Unix 上,对持有已打开 libpq 连接的进程执行 fork 操作可能导致不可预料的结果,因为父进程和子进程会共享相同的套接字和操作系统资源。出于这个原因,我们不推荐这样的用法,尽管从子进程执行一个exec 来载入新的可执行程序是安全的。
@@ -66,32 +66,32 @@ PGconn *PQconnectdbParams(const char * const *keywords,
- 被传递的数组可以为空,这样就会使用所有默认参数。
- 也可以只包含一个或几个参数设置。他们在长度上必须匹配。
- 对于参数数组的处理将会停止于keywords 数组中第一个NULL 元素。
- 而且,如果与非-NULL keywords 条目相关联的values 条目为NULL 或者空字符串,则忽略该项并继续处理下一对数组项。
+ 传入的数组可以为空,以使用所有默认参数,也可以包含一个或多个参数设置。
+ 两个数组的长度必须相同。处理会在 keywords 数组的第一个 NULL 元素处停止。
+ 如果某个非 NULL 的 keywords 元素所对应的
+ values 元素为 NULL 或空字符串,则忽略这一项,继续处理下一对数组元素。
- 当expand_dbname 为非零时,会检查第一个dbname 关键词的值以查看它是否为一个连接字符串 。
- 如果是,它被扩展
到从字符串中提取的单独的连接参数。
- 该值被认为是一个连接字符串,而不仅是一个数据库名称,如果它包含一个等号(= )或者它以URI模式标志符开头,
- (有关连接字符串格式的更多详情可见。)
- 只有dbname 的第一次出现会按这种方式处理,任何后续dbname 值会被当做一个普通数据库名处理。
+ 当 expand_dbname 非零时,会检查第一个 dbname 关键词的值是否为
+ 连接字符串 。如果是,就将其展开
为从该字符串中提取的各个连接参数。
+ 如果该值包含等号(= ),或以 URI 方案标识符开头,就会将其视为连接字符串,而非单纯的数据库名。
+ (连接字符串格式的详细说明见 。)
+ 只有第一次出现的 dbname 会按这种方式处理;后续的 dbname 参数都作为普通数据库名处理。
- 通常,参数数组从开头到结尾进行处理。
- 当关键词有重复时,使用最后一个值(不是 NULL 或空)。
- 此规则特别适用于连接字符串中的关键字与一个出现在keywords 数组中的关键字冲突的情况。
- 因此,程序员可以决定数组条目是否能被覆盖或用连接字符串获取的值覆盖。
- 出现在扩展的dbname 条目之前的数组条目可以被连接字符串的字段所覆盖,反之,这些字段被dbname 之后出现的数组条目所覆盖。(但是,再有,只有在那些条目支持非空值时。)
+ 通常会从头到尾处理参数数组。如果某个关键词重复出现,则采用最后一个非 NULL 且非空的值。
+ 此规则也适用于连接字符串中的关键词与 keywords 数组中的关键词冲突的情况。
+ 因此,程序员可以决定数组元素是覆盖连接字符串中的值,还是被这些值覆盖。
+ 出现在要展开的 dbname 元素之前的数组元素,可以被连接字符串中的字段覆盖;
+ 而这些字段又会被出现在 dbname 之后的数组元素覆盖(同样,只有这些元素提供非空值时才会覆盖)。
- 在处理完所有数组条目和任何扩展的连接字符串后,所有未设置的连接参数都将使用默认值填充。
- 如果一个未设置参数的相关环境变量(参见 )被设置了,它的值会被使用。
- 如果环境变量未被设置,则使用参数的内置默认值。
+ 处理完所有数组元素及展开的连接字符串后,仍未设置的连接参数将填入默认值。
+ 如果某个未设置参数对应的环境变量(见 )已经设置,就使用该环境变量的值;
+ 否则使用该参数的内置默认值。
@@ -113,7 +113,7 @@ PGconn *PQconnectdb(const char *conninfo);
- 被传递的字符串可以为空,这样将会使用所有的默认参数。也可以包含由空格分隔的一个或多个参数设置,还可以包含一个URI 。详见。
+ 被传递的字符串可以为空,这样将会使用所有的默认参数。也可以包含由空白分隔的一个或多个参数设置,还可以包含一个URI 。详见。
@@ -135,9 +135,13 @@ PGconn *PQsetdbLogin(const char *pghost,
- 这是 PQconnectdb 的前身,使用固定的一组参数。除缺失参数始终采用默认值之外,功能相同。对于要使用默认值的任意固定参数,请传入 NULL 或空字符串。
+
+ 这是 PQconnectdb 的前身,使用固定的一组参数。除缺失参数始终采用默认值之外,功能相同。对于要使用默认值的任意固定参数,请传入 NULL 或空字符串。
+
- 如果 dbName 包含 = 符号,或具有有效的连接 URI 前缀,就会将其当作 conninfo 字符串处理,方式与将其传给 PQconnectdb 完全相同,然后按照 PQconnectdbParams 的规则应用其余参数。
+
+ 如果 dbName 包含 = 符号,或具有有效的连接 URI 前缀,就会将其当作 conninfo 字符串处理,方式与将其传给 PQconnectdb 完全相同,然后按照 PQconnectdbParams 的规则应用其余参数。
+
@@ -167,7 +171,7 @@ PGconn *PQsetdb(char *pghost,
PQconnectPoll PQconnectPoll
- nonblocking connection
+ 非阻塞连接
以非阻塞的方式建立一个到数据库服务器的连接。
@@ -200,7 +204,7 @@ PostgresPollingStatusType PQconnectPoll(PGconn *conn);
- 如果你调用PQtrace ,确保你追踪的该流对象不会阻塞。
+ 如果你调用PQtrace ,确保接收追踪输出的流对象不会阻塞。
@@ -213,7 +217,7 @@ PostgresPollingStatusType PQconnectPoll(PGconn *conn);
- 要开始无阻塞的连接请求,可调用PQconnectStart 或者PQconnectStartParams 。如果结果为空,则libpq 无法分配一个新的PGconn 结构体。否则,一个有效的PGconn 指针会被返回(不过还没有表示一个到数据库的有效连接)。接下来调用PQstatus(conn) 。如果结果是CONNECTION_BAD ,则连接尝试已经失败,通常是因为有无效的连接参数。
+ 要开始非阻塞连接请求,可调用PQconnectStart 或者PQconnectStartParams 。如果结果为空指针,则libpq 无法分配一个新的PGconn 结构体。否则,一个有效的PGconn 指针会被返回(不过还没有表示一个到数据库的有效连接)。接下来调用PQstatus(conn) 。如果结果是CONNECTION_BAD ,则连接尝试已经失败,通常是因为有无效的连接参数。
@@ -312,11 +316,11 @@ switch(PQstatus(conn))
- 在使用PQconnectPoll 时,连接参数connect_timeout 会被忽略:判断是否超时是应用的责任。否则,PQconnectStart 后面跟着PQconnectPoll 循环等效于PQconnectdb 。
+ 在使用PQconnectPoll 时,连接参数connect_timeout 会被忽略:判断是否超时是应用的责任。除此之外,PQconnectStart 后面跟着PQconnectPoll 循环等效于PQconnectdb 。
- 注意当PQconnectStart 或PQconnectStartParams 返回一个非空的指针时,你必须在用完它之后调用PQfinish 来处理那些结构体和任何相关的内存块。即使连接尝试失败或被放弃时也必须完成这些工作。
+ 注意当PQconnectStart 或PQconnectStartParams 返回一个非空的指针时,你必须在用完它之后调用PQfinish 来释放该结构体及其关联的所有内存块。即使连接尝试失败或被放弃时也必须完成这些工作。
@@ -332,21 +336,21 @@ PQconninfoOption *PQconndefaults(void);
typedef struct
{
char *keyword; /* 该选项的关键词 */
- char *envvar; /* 依赖的环境变量名 */
- char *compiled; /* 依赖的内置默认值 */
+ char *envvar; /* 后备环境变量名 */
+ char *compiled; /* 编译时设置的后备默认值 */
char *val; /* 选项的当前值,或者 NULL */
- char *label; /* 连接对话框中域的标签 */
- char *dispchar; /* 指示如何在一个连接对话框中显示这个域。值是:
+ char *label; /* 连接对话框中字段的标签 */
+ char *dispchar; /* 指示如何在连接对话框中显示此字段。可取值:
"" 显示输入的值
- "*" 密码域 - 隐藏值
+ "*" 密码字段 - 隐藏值
"D" 调试选项 - 默认不显示 */
- int dispsize; /* 用于对话框的以字符计的域尺寸 */
+ int dispsize; /* 对话框中的字段宽度,以字符计 */
} PQconninfoOption;
- 返回一个连接选项数组。这可以用来确定用于连接服务器的所有可能的PQconnectdb 选项和它们的当前缺省值。返回值指向一个PQconninfoOption 结构体的数组,该数组以一个包含空keyword 指针的条目结束。如果无法分配内存,则返回该空指针。注意当前缺省值(val 域)将依赖于环境变量和其他上下文。一个缺失或者无效的服务文件将会被无声地忽略掉。调用者必须把连接选项当作只读对待。
+ 返回一个连接选项数组。这可以用来确定用于连接服务器的所有可能的PQconnectdb 选项和它们的当前默认值。返回值指向一个PQconninfoOption 结构体的数组,该数组以一个包含空keyword 指针的条目结束。如果无法分配内存,则返回空指针。注意当前默认值(val 字段)将依赖于环境变量和其他上下文。一个缺失或者无效的服务文件将会被无声地忽略掉。调用者必须把连接选项当作只读对待。
@@ -366,7 +370,9 @@ PQconninfoOption *PQconninfo(PGconn *conn);
- 返回一个连接选项数组。可以用它确定所有可能的 PQconnectdb 选项,以及实际用于连接服务器的值。返回值指向一个 PQconninfoOption 结构体数组,该数组以 keyword 指针为空的条目结束。上文针对 PQconndefaults 的所有注意事项,也适用于 PQconninfo 的结果。
+
+ 返回一个连接选项数组。可以用它确定所有可能的 PQconnectdb 选项,以及实际用于连接服务器的值。返回值指向一个 PQconninfoOption 结构体数组,该数组以 keyword 指针为空的条目结束。上文针对 PQconndefaults 的所有注意事项,也适用于 PQconninfo 的结果。
+
@@ -392,7 +398,9 @@ PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);
- 如果errmsg 不是NULL ,那么成功时*errmsg 会被设置为NULL , 否则设置为被malloc 过的错误字符串以说明该问题(也可以将*errmsg 设置为NULL 并且函数返回NULL ,这表示一种内存耗尽的情况)。
+ 如果 errmsg 不是 NULL ,则成功时将 *errmsg 设为 NULL ;
+ 失败时将其设为由 malloc 分配的、用于说明问题的错误字符串。
+ (也可能出现 *errmsg 被设为 NULL ,同时函数返回 NULL 的情况;这表示内存不足。)
@@ -422,7 +430,7 @@ void PQfinish(PGconn *conn);
PQreset PQreset
- 重置与服务器的通讯通道。
+ 重置与服务器的通信通道。
void PQreset(PGconn *conn);
@@ -440,7 +448,7 @@ void PQreset(PGconn *conn);
PQresetPoll PQresetPoll
- 以非阻塞方式重置与服务器的通讯通道。
+ 以非阻塞方式重置与服务器的通信通道。
int PQresetStart(PGconn *conn);
@@ -451,7 +459,9 @@ PostgresPollingStatusType PQresetPoll(PGconn *conn);
这些函数会关闭与服务器的连接,并尝试使用与之前完全相同的参数建立新连接。如果原本可用的连接丢失,这可以用于错误恢复。它们与上文的 PQreset 不同之处在于采用非阻塞方式。它们受到与 PQconnectStartParams 、PQconnectStart 和 PQconnectPoll 相同的限制。
- 要开始重置连接,请调用 PQresetStart 。如果它返回 0,则重置失败。如果返回 1,则使用 PQresetPoll 轮询重置过程,其方式与使用 PQconnectPoll 创建连接完全相同。
+
+ 要开始重置连接,请调用 PQresetStart 。如果返回 0,表示重置失败。如果返回 1,则使用 PQresetPoll 轮询重置过程,方式与使用 PQconnectPoll 建立连接完全相同。
+
@@ -536,19 +546,19 @@ PGPing PQping(const char *conninfo);
几个libpq>函数解析用户指定的字符串以获取连接参数。
- 这些字符串有两种被接受的格式:普通的关键字/值字符串和URI。URI通常遵循
+ 这些字符串有两种被接受的格式:普通的关键词/值字符串和URI。URI通常遵循
RFC
- 3986 ,除了允许多主机连接字符串,如下面进一步描述的那样。
+ 3986,但也允许使用多主机连接字符串,详见下文。
关键词/值连接字符串
- 在关键词/值格式中,每一个参数设置的形式都是keyword = value ,在设置之间有空白。
- 设置的等号周围的空白是可选的。
- 要写一个空值或一个包含空白的值,将它用单引号包围,例如keyword = 'a value' 。
- 值里面的单引号和反斜线必须用一个反斜线转义,即\' 和\\ 。
+ 在关键词/值格式中,每一个参数设置的形式都是关键词 = 值 ,设置之间以空格分隔。
+ 设置的等号周围的空格是可选的。
+ 要写一个空值或一个包含空格的值,将它用单引号包围,例如keyword = 'a value' 。
+ 值里面的单引号和反斜杠必须用一个反斜杠转义,即\' 和\\ 。
@@ -571,22 +581,22 @@ host=localhost port=5432 dbname=mydb connect_timeout=10
postgresql://userspec @hostspec /dbname ?paramspec
-where userspec is:
+其中 userspec 为:
user :password
-and hostspec is:
+hostspec 为:
host :port ,...
-and paramspec is:
+paramspec 为:
name =value &...
- URI 模式标志符可以是postgresql:// 或postgres:// 。
+ URI 方案标识符可以是postgresql:// 或postgres:// 。
每一个剩下的URI 部分都是可选的。
下列示例展示了合法的URI 语法:
@@ -603,7 +613,7 @@ postgresql://host1:123,host2:456/somedb?target_session_attrs=any&application
postgresql:///mydb?host=localhost&port=5433
- 全部的命名参数必须匹配中列出的关键词,除了与JDBC连接URI 兼容之外,ssl=true 的实例转换到sslmode=require 。
+ 所有命名参数都必须与 中列出的关键词匹配;唯一的例外是,为兼容 JDBC 连接 URI ,会将 ssl=true 转换为 sslmode=require 。
可以在 URI 的任意部分使用百分号编码来包含具有特殊含义的符号,例如将 = 替换为 %3D 。
@@ -619,7 +629,7 @@ postgresql://[2001:db8::1234]/database
主机组件会被按照参数对应的描述来解释。
特别地,如果主机部分是空或看起来像一个绝对路径名称,将使用一个 Unix 域套接字连接,否则将启动一个 TCP/IP 连接。
不过要注意,斜线是 URI 层次部分中的一个保留字符。
- 因此,要指定一个非标准的 Unix 域套接字目录,要么忽略 URI 中的主机部分并且指定该主机为一个命名参数,要么在 URI 的主机部分用百分号编码路径:
+ 因此,要指定一个非标准的 Unix 域套接字目录,要么省略 URI 中的主机部分并且指定该主机为一个命名参数,要么在 URI 的主机部分用百分号编码路径:
postgresql:///dbname?host=/var/lib/postgresql
postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
@@ -629,7 +639,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
可以在一个URI中指定多个主机,每一个都有一个可选的端口。
一个形式为postgresql://host1:port1,host2:port2,host3:port3/ 的URI等效于host=host1,host2,host3 port=port1,port2,port3 形式的连接字符串。
- 如下所述,每一个主机都将被尝试,直到成功地建立一个连接。
+ 如下所述,每一个主机都将被依次尝试,直到成功地建立一个连接。
@@ -638,7 +648,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
可以指定多个要连接的主机,这样它们会按给定的顺序被尝试。
- 在键/值格式中,host 、hostaddr 和port 选项都接受逗号分隔的值列表。
+ 在关键词/值格式中,host 、hostaddr 和port 选项都接受逗号分隔的值列表。
在指定的每一个选项中都必须给出相同数量的元素,这样第一个hostaddr 对应于第一个主机名,第二个hostaddr 对应于第二个主机名,以此类推。
不过,如果仅指定一个port ,它将被应用于所有的主机。
@@ -648,7 +658,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 不管是哪一种格式,单一的主机名可以被翻译成多个网络地址。常见的示例是一个主机同时具有IPv4和IPv6地址。
+ 不管是哪一种格式,单一的主机名可以被解析成多个网络地址。常见的示例是一个主机同时具有IPv4和IPv6地址。
@@ -686,7 +696,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
如果指定了host 而没有指定hostaddr ,则会发生主机名查找。
(当使用PQconnectPoll 时,查找发生在PQconnectPoll 首次考虑此主机名时,
- 并且可能导致PQconnectPoll 阻塞一段时间。)
+ 并且可能导致PQconnectPoll 阻塞相当长的时间。)
@@ -698,11 +708,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 如果同时指定了host 和hostaddr ,
- 则hostaddr 的值给出服务器的网络地址。
- 除非认证方法需要,否则host 的值将被忽略,
- 在这种情况下,它将用作主机名。
-
+ 如果同时指定了 host 和 hostaddr ,则 hostaddr 的值给出服务器的网络地址。只有认证方法需要主机名时,才会将 host 的值用作主机名;否则忽略该值。
+
注意,以下情况很可能导致认证失败:host 不是位于网络地址hostaddr 的服务器名称。另外,同时指定host 和hostaddr 时,将使用host 来标识密码文件中的连接(参见)。
@@ -746,8 +753,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- PostgreSQL 用户连接的用户名。
- 默认为运行应用程序的操作系统用户名相同。
+ 建立连接所用的 PostgreSQL 用户名。默认与运行应用程序的操作系统用户名相同。
@@ -757,7 +763,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 如果服务器要求密码认证,则使用密码。
+ 服务器要求密码认证时所使用的密码。
@@ -827,9 +833,9 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 指定配置参数的回退值。
+ 指定配置参数的后备值。
如果没有通过连接参数或PGAPPNAME 环境变量为application_name 指定值,
- 则将使用此值。在通用实用程序中指定回退名称很有用,该程序希望设置默认应用程序名称,
+ 则将使用此值。在通用实用程序中指定后备名称很有用,该程序希望设置默认应用程序名称,
但允许用户覆盖它。
@@ -840,9 +846,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 控制是否使用客户端TCP保持活动。默认值为1,表示开启,但如果不想要保持活动,可以将其更改为0,表示关闭。
- 对于通过Unix域套接字进行的连接,此参数将被忽略。
-
+ 控制是否使用客户端 TCP keepalive。默认值为 1,表示开启;如果不需要 keepalive,可以将其设为 0,表示关闭。对于通过 Unix 域套接字建立的连接,此参数会被忽略。
+
@@ -851,11 +856,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 控制在多少秒的不活动后,TCP应向服务器发送保持活动消息。值为零使用系统默认值。
- 对通过Unix域套接字进行的连接或禁用保持活动的连接,此参数将被忽略。
- 仅在支持TCP_KEEPIDLE 或等效套接字选项的系统以及Windows上支持;
- 在其他系统上,它没有任何效果。
-
+ 控制在多久没有活动后,TCP 应向服务器发送 keepalive 消息,以秒为单位。值为零时使用系统默认值。对于通过 Unix 域套接字建立的连接,或禁用 keepalive 时,此参数会被忽略。此参数仅在支持 TCP_KEEPIDLE 或等效套接字选项的系统以及 Windows 上受支持;在其他系统上无效。
+
@@ -864,11 +866,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 控制在服务器未确认的情况下重新传输TCP保持活动消息的秒数。值为零时使用系统默认值。
- 此参数在通过Unix域套接字进行连接或禁用保持活动时将被忽略。
- 仅在支持TCP_KEEPINTVL 或等效套接字选项的系统和Windows上支持;
- 在其他系统上,此参数无效。
-
+ 控制未被服务器确认收到的 TCP keepalive 消息在多少秒后应被重传。值为零时使用系统默认值。对于通过 Unix 域套接字建立的连接,或禁用 keepalive 时,此参数会被忽略。此参数仅在支持 TCP_KEEPINTVL 或等效套接字选项的系统以及 Windows 上受支持;在其他系统上无效。
+
@@ -877,11 +876,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 控制在客户端与服务器之间连接被视为断开之前可以丢失的TCP keepalive数量。
- 值为零时使用系统默认值。对通过Unix域套接字建立的连接或禁用keepalives的连接,此参数将被忽略。
- 仅在支持TCP_KEEPCNT 或等效套接字选项的系统上受支持;
- 在其他系统上,此参数无效。
-
+ 控制在客户端与服务器之间的连接被视为中断之前,可以丢失多少个 TCP keepalive 消息。值为零时使用系统默认值。对于通过 Unix 域套接字建立的连接,或禁用 keepalive 时,此参数会被忽略。此参数仅在支持 TCP_KEEPCNT 或等效套接字选项的系统上受支持;在其他系统上无效。
+
@@ -918,7 +914,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- prefer (默认)
+ prefer (默认)
首先尝试SSL 连接;如果失败,则尝试非SSL 连接
@@ -958,13 +954,13 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- sslmode 被忽略用于Unix域套接字通信。
- 如果PostgreSQL 没有SSL支持编译,
+ 在 Unix 域套接字通信中,sslmode 会被忽略。
+ 如果PostgreSQL 编译时未启用 SSL 支持,
使用选项require 、verify-ca 或
verify-full 会导致错误,而选项allow 和prefer
将被接受,但libpq 实际上不会尝试建立SSL
连接。SSL 使用libpq的SSL
+ sortas="libpq">在 libpq 中
@@ -974,15 +970,15 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 此选项已被sslmode 设置所取代。
-
+ 此选项已弃用,请改用 sslmode 设置。
+
如果设置为1,则需要与服务器建立SSL 连接(这相当于sslmode
require )。libpq 将拒绝连接,如果服务器不接受
SSL 连接。如果设置为0(默认值),
libpq 将与服务器协商连接类型(相当于sslmode
- prefer )。此选项仅在PostgreSQL 编译时启用SSL支持。
+ prefer )。此选项仅在 PostgreSQL 编译时启用了 SSL 支持的情况下可用。
@@ -1014,7 +1010,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
这个参数指定了用于客户端证书的密钥的位置。它可以指定一个文件名,该文件名将被用来替代默认的
~/.postgresql/postgresql.key ,或者它可以指定一个从外部引擎
- (引擎是OpenSSL 可加载模块)获取的密钥。外部引擎规范应该包括一个由冒号分隔的引擎名称和
+ (引擎是OpenSSL 可加载模块)获取的密钥。外部引擎的指定形式应包含一个由冒号分隔的引擎名称和
一个引擎特定的密钥标识符。如果没有进行SSL连接,则此参数将被忽略。
@@ -1059,7 +1055,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
krbsrvname
- 用于使用GSSAPI进行认证时要使用的Kerberos服务名称。
+ 使用 GSSAPI 认证时所用的 Kerberos 服务名。
这必须与服务器配置中指定的Kerberos认证服务名称匹配,才能成功进行认证。
(另请参见。)
@@ -1104,20 +1100,21 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
连接状态函数
- 这些函数可以被用来询问一个已有数据库连接对象的状态。
+ 这些函数可用于查询现有数据库连接对象的状态。
- libpq-fe.h
- libpq-int.h
- libpq 应用程序员应该小心地维护PGconn 抽象。使用下面描述的访问函数来理解PGconn 的内容。我们不推荐使用libpq-int.h 引用内部的PGconn 域,因为它们可能在未来改变。
-
+ libpq-fe.h
+ libpq-int.h
+ 编写 libpq 应用程序时,应注意维护 PGconn 的抽象。请使用下述访问函数获取 PGconn 的内容。不建议通过 libpq-int.h 引用 PGconn 的内部字段,因为这些字段将来可能改变。
+
- 以下函数返回建立连接时确定的参数值。这些值在连接存续期间保持不变。如果使用多主机连接字符串,以下函数的值:PQhost ,
- PQport 和PQpass 可能会在使用同一个PGconn 对象建立新连接时改变。其他值在以下对象的整个生命周期内保持不变:PGconn 对象。
+
+ 以下函数返回建立连接时确定的参数值。这些值在连接存续期间保持不变。如果使用多主机连接字符串,并使用同一个 PGconn 对象建立新连接,则 PQhost 、PQport 和 PQpass 的返回值可能改变。其他值在 PGconn 对象的整个生命周期内保持不变。
+
PQdb PQdb
@@ -1164,7 +1161,7 @@ char *PQpass(const PGconn *conn);
- 返回活跃连接的服务器主机名。可能是主机名、IP 地址或者一个目录路径(如果通过 Unix 套接字连接,路径的情况很容易区分,因为路径总是一个绝对路径,以/ 开始)。
+ 返回活动连接的服务器主机名。可能是主机名、IP 地址或者一个目录路径(如果通过 Unix 套接字连接,路径的情况很容易区分,因为路径总是一个绝对路径,以/ 开始)。
char *PQhost(const PGconn *conn);
@@ -1176,7 +1173,7 @@ char *PQhost(const PGconn *conn);
- 如果conn 参数是NULL ,则PQhost 返回NULL 。否则,如果在生成主机信息时发生错误(或许是连接没有被完全建立或者有什么错误),它会返回一个空字符串。
+ 如果 conn 参数为 NULL ,则 PQhost 返回 NULL 。否则,如果在生成主机信息时发生错误(例如连接尚未完全建立,或出现了错误),则返回空字符串。
@@ -1190,7 +1187,7 @@ char *PQhost(const PGconn *conn);
- 返回活跃连接的端口。
+ 返回活动连接的端口。
char *PQport(const PGconn *conn);
@@ -1202,7 +1199,7 @@ char *PQport(const PGconn *conn);
- 如果conn 参数是NULL ,则PQport 返回NULL 。否则,如果在生成端口信息时发生错误(或许是连接没有被完全建立或者有什么错误),它会返回一个空字符串。
+ 如果 conn 参数为 NULL ,则 PQport 返回 NULL 。否则,如果在生成端口信息时发生错误(例如连接尚未完全建立,或出现了错误),则返回空字符串。
@@ -1215,7 +1212,9 @@ char *PQport(const PGconn *conn);
PQtty PQtty
- 返回连接的调试TTY 。(此设置已过时,因为服务器不再理会TTY 设置,但为保持向后兼容,仍保留了此函数。)
+
+ 返回该连接用于调试的TTY 。(此功能已过时,因为服务器不再使用TTY 设置,但为保持向后兼容仍保留此函数。)
+
char *PQtty(const PGconn *conn);
@@ -1227,7 +1226,7 @@ char *PQtty(const PGconn *conn);
- 返回被传递给连接请求的命令行选项。
+ 返回连接请求中传递的命令行选项。
char *PQoptions(const PGconn *conn);
@@ -1235,9 +1234,11 @@ char *PQoptions(const PGconn *conn);
-
+
- 以下函数返回的状态数据可能在执行操作时发生变化,这些操作针对PGconn 对象。
+
+ 以下函数返回的状态数据,可能随着对 PGconn 对象执行操作而改变。
+
PQstatus PQstatus
@@ -1273,7 +1274,7 @@ ConnStatusType PQstatus(const PGconn *conn);
PGTransactionStatusType PQtransactionStatus(const PGconn *conn);
- 该状态可能是PQTRANS_IDLE (当前空闲)、PQTRANS_ACTIVE (一个命令运行中)、PQTRANS_INTRANS (空闲,处于一个合法的事务块中)或者PQTRANS_INERROR (空闲,处于一个失败的事务块中)。如果该连接损坏,将会报告PQTRANS_UNKNOWN 。只有当一个查询已经被发送给服务器并且还没有完成时,才会报告PQTRANS_ACTIVE 。
+ 该状态可能是PQTRANS_IDLE (当前空闲)、PQTRANS_ACTIVE (一个命令运行中)、PQTRANS_INTRANS (空闲,处于一个有效的事务块中)或者PQTRANS_INERROR (空闲,处于一个失败的事务块中)。如果该连接异常,将会报告PQTRANS_UNKNOWN 。只有当一个查询已经被发送给服务器并且还没有完成时,才会报告PQTRANS_ACTIVE 。
@@ -1315,9 +1316,12 @@ const char *PQparameterStatus(const PGconn *conn, const char *paramName);
PQprotocolVersion PQprotocolVersion
- 查询正在使用的前端/后端协议。
+
+ 查询正在使用的前端/后端协议。
+
int PQprotocolVersion(const PGconn *conn);
- 应用程序可以使用此函数判断是否支持某些特性。目前可能的值为 2(协议 2.0)、3(协议 3.0)或零(连接无效)。连接启动完成后,协议版本不会改变,但理论上可能在重置连接时改变。与PostgreSQL 7.4 或更新版本的服务器通信时,通常使用协议 3.0;7.4 之前的服务器仅支持协议 2.0。(协议 1.0 已过时,且不被以下库支持:libpq 。)
+
+应用程序可以使用此函数判断是否支持某些特性。目前,可能的值为 2(协议 2.0)、3(协议 3.0)或零(连接异常)。连接启动完成后,协议版本不会改变,但理论上可能在连接重置期间改变。通常,与 PostgreSQL 7.4 或更高版本的服务器通信时使用协议 3.0;7.4 之前的服务器仅支持协议 2.0。(协议 1.0 已过时,libpq 不支持它。)
@@ -1338,11 +1342,11 @@ int PQserverVersion(const PGconn *conn);
- 在主版本10之前,PostgreSQL 采用一种由三个部分组成的版本号,其中前两部分共同表示主版本。对于那些版本,PQserverVersion 为每个部分使用两个数字,例如版本9.1.5将被返回为90105,而版本9.2.0将被返回为90200。
+ 在主版本10之前,PostgreSQL 采用一种由三个部分组成的版本号,其中前两部分共同表示主版本。对于那些版本,PQserverVersion 为每个部分使用两位数字,例如版本9.1.5将被返回为90105,而版本9.2.0将被返回为90200。
- 因此,出于判断特性兼容性的目的,应用应该将PQserverVersion 的结果除以100而不是10000来判断逻辑的主版本号。在所有的发行序列中,只有最后两个数字在次发行(问题修正发行)之间不同。
+ 因此,出于判断特性兼容性的目的,应用应该将PQserverVersion 的结果除以100而不是10000来判断逻辑的主版本号。在所有主版本系列中,各次版本(缺陷修复版本)之间只有最后两位数字不同。
@@ -1361,9 +1365,7 @@ char *PQerrorMessage(const PGconn *conn);
- 几乎所有的libpq 函数在失败时都会为PQerrorMessage 设置一个消息。
- 注意按照libpq 习惯,一个非空PQerrorMessage 结果可能由多行构成,并且将包括一个尾部新行。
- 调用者不应该直接释放结果。当相关的PGconn 句柄被传递给PQfinish 时,它将被释放。在PGconn 结构体上的多个操作之间,不能指望结果字符串会保持不变。
+ 几乎所有 libpq 函数在失败时都会设置一条供 PQerrorMessage 返回的消息。注意,按照 libpq 的约定,非空的 PQerrorMessage 结果可能包含多行,并以换行符结尾。调用者不应直接释放该结果;当关联的 PGconn 句柄被传给 PQfinish 时,结果会被释放。不能假定在对 PGconn 结构体执行其他操作后,结果字符串仍保持不变。
@@ -1372,7 +1374,7 @@ char *PQerrorMessage(const PGconn *conn);
PQsocket PQsocket
- 获得到服务器连接套接字的文件描述符号。一个合法的描述符将会大于等于零。结果为 -1 表示当前没有打开服务器连接(在普通操作期间这将不会改变,但是在连接设置或重置期间可能改变)。
+ 获取与服务器相连的套接字的文件描述符编号。有效描述符大于或等于 0。结果为 -1 表示当前没有打开服务器连接(在普通操作期间这将不会改变,但是在连接设置或重置期间可能改变)。
int PQsocket(const PGconn *conn);
@@ -1389,7 +1391,7 @@ int PQsocket(const PGconn *conn);
返回处理这个连接的后端进程的进程ID (PID)。
PID
确定服务器进程的 PID
- in libpq
+ 在 libpq 中
@@ -1398,7 +1400,7 @@ int PQbackendPID(const PGconn *conn);
- 后端PID 有助于调试目的并且可用于与NOTIFY 消息(它包括发出提示的后端进程的PID )进行比较。注意PID 属于一个在数据库服务器主机上执行的进程,而不是本地主机进程!
+ 后端 PID 可用于调试,也可与 NOTIFY 消息进行比较(消息包含发出通知的后端进程的 PID )。注意,该 PID 属于在数据库服务器主机上运行的进程,而非本地主机上的进程!
@@ -1437,15 +1439,17 @@ int PQconnectionUsedPassword(const PGconn *conn);
-
+
- 以下函数返回与 SSL 相关的信息。这些信息通常在连接建立后不会改变。
+
+ 以下函数返回与 SSL 相关的信息。这些信息通常在连接建立后不会改变。
+
PQsslInUse PQsslInUse
- 返回true(1)如果连接使用SSL,返回false(0)如果不使用。
+ 如果连接使用 SSL,则返回真(1);否则返回假(0)。
int PQsslInUse(const PGconn *conn);
@@ -1464,10 +1468,10 @@ const char *PQsslAttribute(const PGconn *conn, const char *attribute_name);
- 可用属性列表因使用的SSL库和连接类型而异。如果连接不使用SSL或指定的属性名称对于所使用的库未定义,则返回NULL。
+ 可用属性列表因所使用的 SSL 库和连接类型而异。如果某个属性不可用,则返回 NULL。
- 通常可以取得以下属性:
+ 通常可以获取以下属性:
library
@@ -1532,12 +1536,14 @@ const char * const * PQsslAttributeNames(const PGconn *conn);
PQsslStruct PQsslStruct
- 返回一个指向描述连接的SSL实现特定对象的指针。如果连接未加密或SSL实现不提供连接的请求对象类型,则返回NULL。
+ 返回指向描述此连接的对象的指针,该对象的类型由 SSL 实现决定。
void *PQsslStruct(const PGconn *conn, const char *struct_name);
- 可用的结构体取决于所使用的 SSL 实现。对于 OpenSSL,有一个名为 "OpenSSL" 的结构体,取得它时会返回指向 OpenSSLSSL 结构体的指针。可以使用类似以下的代码来调用此函数:
+ 可用的结构体取决于所使用的 SSL 实现。对于 OpenSSL,可以通过名称 "OpenSSL" 获取一个结构体,函数返回指向 OpenSSL 的 SSL 结构体的指针。可以使用如下代码调用此函数:
+
#include
@@ -1579,7 +1585,7 @@ void *PQgetssl(const PGconn *conn);
-
+
@@ -1587,7 +1593,7 @@ void *PQgetssl(const PGconn *conn);
命令执行函数
- 一旦到一个数据库服务器的连接被成功建立,这里描述的函数可以被用来执行 SQL 查询和命令。
+ 与数据库服务器的连接成功建立后,此处描述的函数用于执行 SQL 查询和命令。
@@ -1608,11 +1614,8 @@ PGresult *PQexec(PGconn *conn, const char *command);
- 返回一个PGresult 指针或者可能是一个空指针。
- 除了内存不足的情况或者由于严重错误无法将命令发送给服务器之外,一般都会返回一个非空指针。
- PQresultStatus 函数应当被调用来检查返回值是否代表错误(包括空指针的值,它会返回PGRES_FATAL_ERROR )。
- 用PQerrorMessage 可得到关于那些错误的详细信息。
-
+ 返回一个 PGresult 指针,也可能返回空指针。除内存不足或无法向服务器发送命令等严重错误外,通常都会返回非空指针。应调用 PQresultStatus 函数检查返回值是否表示错误(也应检查空指针,此时该函数返回 PGRES_FATAL_ERROR )。使用 PQerrorMessage 获取此类错误的更多信息。
+
命令字符串可以包含多个 SQL 命令(以分号分隔)。在一次PQexec 调用中发送的多个查询会在同一个事务中处理,除非查询字符串中显式包含BEGIN /COMMIT 命令将其划分为多个事务。不过要注意,返回的PGresult 结构体只描述该字符串中最后执行的命令的结果。如果其中一条命令失败,就会在此处停止处理该字符串,返回的PGresult 则描述该错误。
@@ -1685,8 +1688,8 @@ PGresult *PQexecParams(PGconn *conn,
paramValues[]
- 指定参数的实际值。这个数组中的一个空指针表示对应的参数为空,否则该指针指向一个以零终止的文本字符串(用于文本格式)或者以服务器所期待格式的二进制数据(用于二进制格式)。
-
+ 指定参数的实际值。数组中的空指针表示对应参数为 null;否则,指针指向以零结尾的文本字符串(文本格式),或采用服务器所要求格式的二进制数据(二进制格式)。
+
@@ -1694,8 +1697,8 @@ PGresult *PQexecParams(PGconn *conn,
paramLengths[]
- 指定二进制格式参数的实际数据长度。它对空参数和文本格式参数被忽略。当没有二进制参数时,该数组指针可以为空。
-
+ 指定二进制格式参数的实际数据长度。对于 null 参数和文本格式参数,该值会被忽略。如果没有二进制参数,数组指针可以为空指针。
+
@@ -1703,11 +1706,11 @@ PGresult *PQexecParams(PGconn *conn,
paramFormats[]
- 指定参数是否为文本(在参数相应的数组项中放一个零)或二进制(在参数相应的数组项中放一个一)。如果该数组指针为空,那么所有参数都会被假定为文本串。
-
+ 指定参数采用文本格式(在对应数组元素中填入零)还是二进制格式(填入一)。如果数组指针为空指针,则将所有参数视为文本字符串。
+
- 以二进制格式传递的值要求后端所期待的内部表示形式的知识。例如,整数必须以网络字节序被传递。传递numeric 值要求关于服务器存储格式的知识,正如src/backend/utils/adt/numeric.c::numeric_send() 以及src/backend/utils/adt/numeric.c::numeric_recv() 中所实现的。
-
+ 以二进制格式传递值时,需要了解后端所要求的内部表示形式。例如,整数必须以网络字节序传递。传递 numeric 值时,需要了解服务器的存储格式,其实现见 src/backend/utils/adt/numeric.c::numeric_send() 和 src/backend/utils/adt/numeric.c::numeric_recv() 。
+
@@ -1715,8 +1718,8 @@ PGresult *PQexecParams(PGconn *conn,
resultFormat
- 指定零来得到文本格式的结果,或者指定一来得到二进制格式的结果(目前没有规定要求以不同格式得到不同的结果列,尽管在底层协议中这是可以实现的)。
-
+ 指定零以获取文本格式的结果,指定一以获取二进制格式的结果。(目前无法让不同结果列使用不同格式,尽管底层协议支持这样做。)
+
@@ -1726,7 +1729,9 @@ PGresult *PQexecParams(PGconn *conn,
- PQexecParams 相对于 PQexec 的主要优点是可以将参数值与命令字符串分开,从而避免繁琐且容易出错的加引号和转义工作。
+
+ PQexecParams 相对于 PQexec 的主要优点是可以将参数值与命令字符串分开,从而避免繁琐且容易出错的加引号和转义工作。
+
和PQexec 不同,PQexecParams 至多允许在给定串中出现一个 SQL 命令(其中可以有分号,但是不能有超过一个非空命令)。这是底层协议的一个限制,但是有助于抵抗 SQL 注入攻击。
@@ -1735,12 +1740,12 @@ PGresult *PQexecParams(PGconn *conn,
- 通过 OID 指定参数类型很罗嗦,特别是如果你不愿意将特定的 OID 值硬编码到你的程序中时。不过,即使服务器本身也无法确定参数的类型,你可以避免这样做,或者选择一种与你想要的不同的类型。在 SQL 命令文本中,附加一个显式类型转换给参数符号来表示你将发送什么样的数据类型。例如:
+ 通过 OID 指定参数类型较为繁琐,尤其是在不希望将具体 OID 值写死在程序中时。不过,即使服务器无法自行确定参数类型,或者推断出的类型与你所需的不同,也可以避免直接指定 OID。在 SQL 命令文本中,为参数符号添加显式类型转换,即可指定要发送的数据类型。例如:
SELECT * FROM mytable WHERE x = $1::bigint;
- 这强制参数$1 被当作bigint ,而默认情况下它将被赋予与x 相同的类型。当以二进制格式发送参数值时,我们强烈推荐以这种方式或通过指定一个数字类型的 OID 来强制参数类型决定。因为二进制格式比文本格式具有更少的冗余,并且因此服务器将不会有更多机会为你检测一个类型匹配错误。
-
+这会强制将参数 $1 当作 bigint ,而默认情况下会为它分配与 x 相同的类型。以二进制格式发送参数值时,强烈建议采用这种方式,或直接指定类型的数值 OID,来明确决定参数类型。因为二进制格式的冗余比文本格式更少,服务器发现类型不匹配错误的机会也更少。
+
@@ -1760,13 +1765,15 @@ PGresult *PQprepare(PGconn *conn,
- PQprepare 创建一个预备语句,供随后使用 PQexecPrepared 执行。此功能允许重复执行命令,而不必每次都进行解析和规划;详见 。PQprepare 仅在使用协议 3.0 及更高版本的连接中受支持,使用协议 2.0 时会失败。
+
+ PQprepare 创建一个预备语句,供随后使用 PQexecPrepared 执行。此功能允许重复执行命令,而不必每次都进行解析和规划;详见 。PQprepare 仅在使用协议 3.0 及更高版本的连接中受支持,使用协议 2.0 时会失败。
+
该函数从query 串创建一个名为stmtName 的预备语句,该串必须包含一个单一 SQL 命令。
stmtName 可以是"" 来创建一个未命名语句,在这种情况下任何已存在未命名语句将被自动替换。
否则,如果语句名称已经在当前会话中被定义,则是一种错误。如果使用了任何参数,它们在查询中以$1 、$2 等引用。
- nParams 是参数的个数,其类型在数组paramTypes[] 中被预先指定(当nParams 为零时,该数组指针可以是NULL )。
+ nParams 是在数组 paramTypes[] 中预先指定了类型的参数数量(当nParams 为零时,该数组指针可以是NULL )。
paramTypes[] 通过 OID 指定要赋予给参数符号的数据类型。
如果paramTypes 是NULL 或者该数组中任何特定元素为零,服务器会用对待未指定类型的字符串字面量的方式为参数符号推测一种数据类型。
还有,查询能够使用编号高于nParams 的参数符号,它们的数据类型也会被自动推测(找出推测出的数据类型的方法见PQdescribePrepared )。
@@ -1774,7 +1781,7 @@ PGresult *PQprepare(PGconn *conn,
正如PQexec 一样,结果通常是一个PGresult 对象,其内容代表服务器端成功或失败。
- 一个空结果表示内存不足或者根本无法发送命令。关于错误的更多信息请见PQerrorMessage 。
+ 返回空指针表示内存不足,或者根本无法发送命令。关于错误的更多信息请见PQerrorMessage 。
@@ -1799,7 +1806,7 @@ PGresult *PQexecPrepared(PGconn *conn,
- PQexecPrepared 类似于PQexecParams , 但要执行的命令是通过指定先前准备好的语句来指定,而不是提供查询字符串。 此功能允许重复使用的命令只被解析和计划一次,而不是每次执行时都要进行。 该语句必须在当前会话中先前准备好。 PQexecPrepared 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
+ PQexecPrepared 类似于PQexecParams , 但它通过已创建的预备语句的名称指定要执行的命令,而非提供查询字符串。 此功能使重复使用的命令只需解析和规划一次,而不必在每次执行时都进行这些工作。 该语句必须事先在当前会话中创建为预备语句。 PQexecPrepared 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
参数与PQexecParams 相同,只是给出了预备语句的名称而不是查询字符串,
@@ -1813,21 +1820,21 @@ PGresult *PQexecPrepared(PGconn *conn,
- 提交请求以获取有关指定准备好的语句的信息,并等待完成。
+ 提交请求以获取有关指定预备语句的信息,并等待完成。
PGresult *PQdescribePrepared(PGconn *conn, const char *stmtName);
- PQdescribePrepared 允许应用程序获取关于先前准备的语句的信息。 PQdescribePrepared 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
+ PQdescribePrepared 允许应用程序获取关于先前创建的预备语句的信息。 PQdescribePrepared 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
stmtName 可以是"" 或NULL 来引用
- 未命名的语句,否则必须是现有准备好的语句的名称。成功时,返回一个
+ 未命名的语句,否则必须是现有预备语句的名称。成功时,返回一个
状态为PGRES_COMMAND_OK 的PGresult 。
函数PQnparams 和
PQparamtype 可以应用于此
- PGresult 以获取有关准备语句参数的信息,
+ PGresult 以获取有关预备语句参数的信息,
函数PQnfields 、PQfname 、
PQftype 等提供有关语句的结果列(如果有)的信息。
@@ -1839,13 +1846,15 @@ PGresult *PQdescribePrepared(PGconn *conn, const char *stmtName);
- 提交请求以获取有关指定门户的信息,并等待完成。
+ 提交请求以获取有关指定 portal 的信息,并等待完成。
PGresult *PQdescribePortal(PGconn *conn, const char *portalName);
- PQdescribePortal 允许应用程序获取有关先前创建的 portal 的信息。 (libpq 不直接提供对 portal 的访问,但你可以使用此函数检查通过DECLARE CURSOR SQL 命令创建的游标的属性。) PQdescribePortal 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
+
+ PQdescribePortal 允许应用程序获取先前创建的 portal 的信息。(libpq 不提供对 portal 的直接访问,但可以用此函数检查通过 DECLARE CURSOR SQL 命令创建的游标的属性。) PQdescribePortal 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
+
portalName 可以是"" 或NULL 来引用未命名的 portal,
@@ -1858,7 +1867,9 @@ PGresult *PQdescribePortal(PGconn *conn, const char *portalName);
- 该PGresult PGresult 结构体封装服务器返回的结果。libpq 应用程序的开发者应注意保持PGresult 的抽象性。请使用下面的访问函数获取PGresult 的内容。避免直接引用PGresult 结构体的字段,因为这些字段以后可能改变。
+
+ PGresult PGresult 结构体封装服务器返回的结果。编写 libpq 应用程序时,应注意维护 PGresult 的抽象。请使用下述访问函数获取 PGresult 的内容。避免直接引用 PGresult 结构体的字段,因为这些字段将来可能改变。
+
PQresultStatus PQresultStatus
@@ -1957,7 +1968,7 @@ ExecStatusType PQresultStatus(const PGresult *res);
PGRES_SINGLE_TUPLE
- PGresult 包含来自于当前命令的一个单一结果元组。这个状态只在查询选择了单一行模式时发生(见)。
+ PGresult 包含来自于当前命令的一个单一结果元组。这个状态只在查询选择了单行模式时发生(见)。
@@ -1974,10 +1985,12 @@ ExecStatusType PQresultStatus(const PGresult *res);
PQresStatus PQresStatus
- 将PQresultStatus 返回的枚举值转换为描述该状态码的字符串常量。调用者不应释放此结果。
+
+ 将 PQresultStatus 返回的枚举值转换为描述该状态码的字符串常量。调用者不应释放此结果。
+
char *PQresStatus(ExecStatusType status);
-
+
@@ -1985,10 +1998,13 @@ char *PQresStatus(ExecStatusType status);
PQresultErrorMessage PQresultErrorMessage
- 返回与命令关联的错误消息;如果没有错误,则返回空字符串。
+
+ 返回与命令关联的错误消息;如果没有错误,则返回空字符串。
+
char *PQresultErrorMessage(const PGresult *res);
- 如果发生了错误,返回的字符串会包含末尾换行符。调用者不应直接释放结果。在将关联的PGresult 句柄传给以下函数时,会释放该结果:PQclear 。
-
+
+如果发生了错误,返回的字符串会以换行符结尾。调用者不应直接释放结果;当关联的 PGresult 句柄被传给 PQclear 时,结果会被释放。
+
紧跟着一个PQexec 或 PQgetResult 调用,PQerrorMessage (在连接上)将返回与PQresultErrorMessage 相同的字符串(在结果上)。
@@ -2003,11 +2019,15 @@ char *PQresultErrorMessage(const PGresult *res);
PQresultVerboseErrorMessage PQresultVerboseErrorMessage
- 返回与PGresult 对象关联的错误消息的重新格式化版本。
+
+ 返回与 PGresult 对象关联的错误消息的重新格式化版本。
+
char *PQresultVerboseErrorMessage(const PGresult *res,
PGVerbosity verbosity,
PGContextVisibility show_context);
- 某些情况下,客户端可能希望取得之前报告的错误的更详细版本。PQresultVerboseErrorMessage 可以满足这一需求:它计算以下函数本应生成的消息:PQresultErrorMessage ,假设在生成给定的PGresult 时,连接已经采用指定的详细程度设置。如果PGresult 不是错误结果,则改为报告PGresult is not an error result>。返回的字符串包含末尾换行符。
+
+有时客户端希望获取先前报告过的错误的更详细版本。PQresultVerboseErrorMessage 可满足这一需求:它按指定的详细程度设置重新生成消息。假如在生成给定 PGresult 时,连接已经采用这些设置,那么 PQresultErrorMessage 返回的就会是这条消息。如果 PGresult 不是错误结果,则改为报告 PGresult is not an error result
。返回的字符串以换行符结尾。
+
和大部分从PGresult 中提取数据的其他函数不同,这个函数的结果是一个全新分配的字符串。调用者在不需要这个字符串以后,必须使用PQfreemem() 释放它。
@@ -2022,18 +2042,20 @@ char *PQresultVerboseErrorMessage(const PGresult *res,
PQresultErrorField PQresultErrorField
- 返回错误报告中的单个字段。
+
+ 返回错误报告中的单个字段。
+
char *PQresultErrorField(const PGresult *res, int fieldcode);
- fieldcode 是错误字段标识符,参见下文列出的符号。NULL 会在以下情况下返回:PGresult 不是错误或警告结果,或者不包含指定字段。字段值通常不含末尾换行符。调用者不应直接释放结果。在将关联的PGresult 句柄传给以下函数时,会释放该结果:PQclear 。
-
+fieldcode 是错误字段标识符,参见下文列出的符号。如果 PGresult 不是错误或警告结果,或者不包含指定字段,则返回 NULL 。字段值通常不含末尾换行符。调用者不应直接释放结果;当关联的 PGresult 句柄被传给 PQclear 时,结果会被释放。
+
可以使用以下字段代码:
PG_DIAG_SEVERITY
- 严重性。域的内容是ERROR 、FATAL 或PANIC (在一个错误消息中)。或者是WARNING 、NOTICE 、DEBUG 、INFO 或LOG (在一个提示消息中)。或者是其中之一的一个本地化翻译。总是存在。
+ 严重性。字段的内容是ERROR 、FATAL 或PANIC (在一个错误消息中)。或者是WARNING 、NOTICE 、DEBUG 、INFO 或LOG (在一个提示消息中)。或者是其中之一的一个本地化翻译。总是存在。
@@ -2042,16 +2064,16 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_SEVERITY_NONLOCALIZED
- 域的内容是ERROR 、FATAL 或PANIC (在一个错误消息中)。或者是WARNING 、NOTICE 、DEBUG 、INFO 或LOG (在一个提示消息中)。这和PG_DIAG_SEVERITY 域相同,不过内容不会被本地化。只存在于PostgreSQL 9.6 版本以后产生的报告中。
+ 严重性。字段的内容是ERROR 、FATAL 或PANIC (在一个错误消息中)。或者是WARNING 、NOTICE 、DEBUG 、INFO 或LOG (在一个提示消息中)。这和PG_DIAG_SEVERITY 字段相同,不过内容不会被本地化。只存在于PostgreSQL 9.6 及更高版本产生的报告中。
- PG_DIAG_SQLSTATE>error codes libpq
+ PG_DIAG_SQLSTATE>错误码 libpq
- 用于错误的 SQLSTATE 代码。SQLSTATE 代码标识了已经发生的错误的类型,它可以被前端应用用来执行特定操作(例如错误处理)来响应一个特定数据库错误。一个可能的 SQLSTATE 代码列表可见。这个域无法被本地化,并且总是存在。
+ 用于错误的 SQLSTATE 代码。SQLSTATE 代码标识了已经发生的错误的类型,它可以被前端应用用来执行特定操作(例如错误处理)来响应一个特定数据库错误。一个可能的 SQLSTATE 代码列表可见。这个字段无法被本地化,并且总是存在。
@@ -2078,7 +2100,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_MESSAGE_HINT
- 提示:一个关于如何处理该问题的可选建议。它与细节的区别在于它提供了建议(可能不合适)而不是铁的事实。可能有多行。
+ 提示:一个关于如何处理该问题的可选建议。它与细节的区别在于它提供了建议(可能不合适)而不是确切事实。可能有多行。
@@ -2096,7 +2118,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_INTERNAL_POSITION
- 这被定义为与PG_DIAG_STATEMENT_POSITION 域相同,但是它被用在游标位置引用一个内部产生的命令而不是客户端提交的命令时。当这个域出现时,PG_DIAG_INTERNAL_QUERY 域将总是出现。
+ 这被定义为与PG_DIAG_STATEMENT_POSITION 字段相同,但是它被用在游标位置引用一个内部产生的命令而不是客户端提交的命令时。当这个字段出现时,PG_DIAG_INTERNAL_QUERY 字段将总是出现。
@@ -2114,7 +2136,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_CONTEXT
- 指示错误发生的环境。当前这包括活动过程语言函数的调用栈追踪以及内部生成的查询。追踪是每行一项,最近的排在最前面。
+ 指示错误发生的上下文。当前这包括活动过程语言函数的调用栈追踪以及内部生成的查询。追踪是每行一项,最近的排在最前面。
@@ -2132,7 +2154,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_TABLE_NAME
- 如果错误与某个特定表相关,这里是该表的名字(该表的模式参考模式名域)。
+ 如果错误与某个特定表相关,这里是该表的名字(该表的模式参考模式名字段)。
@@ -2141,7 +2163,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_COLUMN_NAME
- 如果错误与一个特定表列相关,这里是该表列的名字(参考模式和表名域来标识该表)。
+ 如果错误与一个特定表列相关,这里是该表列的名字(参考模式和表名字段来标识该表)。
@@ -2150,7 +2172,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_DATATYPE_NAME
- 如果错误与一个特定数据类型相关,这里是该数据了行的名字(该数据类型的模式名参考模式名域)。
+ 如果错误与一个特定数据类型相关,这里是该数据类型的名字(该数据类型的模式名参考模式名字段)。
@@ -2159,7 +2181,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_CONSTRAINT_NAME
- 如果错误与一个特定约束相关,这里是该约束的名字。相关的表或域参考上面列出的域(为了这个目的,索引也被视作约束,即使它们不是用约束语法创建的)。
+ 如果错误与一个特定约束相关,这里是该约束的名字。相关的表或域参考上面列出的字段(为了这个目的,索引也被视作约束,即使它们不是用约束语法创建的)。
@@ -2195,12 +2217,12 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
- 用于模式名、表名、列名、数据类型名和约束名的域只提供给有限的错误类型,见。不要假定任何这些域的存在保证另一个域的存在。核心错误源会遵守上面提到的内在联系,但是用户定义的函数可能以其他方式使用这些域。同样地,不要假定这些域代表当前数据库中同类的对象。
+ 用于模式名、表名、列名、数据类型名和约束名的字段只提供给有限的错误类型,见。不要假定任何这些字段的存在保证另一个字段的存在。核心错误源会遵守上面提到的内在联系,但是用户定义的函数可能以其他方式使用这些字段。同样地,不要假定这些字段代表当前数据库中现存的对象。
- 客户端负责格式化显示信息来迎合它的需要,特别是根据需要打断长的行。出现在错误消息域中的新行字符应该被当作分段而不是换行。
+ 客户端负责按自身需要格式化所显示的信息,尤其应在需要时将长行折行。错误消息字段中的换行符应当视为段落分隔,而非行分隔。
libpq 内部产生的错误包含严重性和主要消息,但通常没有其他字段。使用 3.0 之前协议的服务器返回的错误包含严重性和主要消息,有时还包含详细消息,但没有其他字段。
@@ -2214,10 +2236,12 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PQclear PQclear
- 释放与PGresult 关联的存储空间。每个命令结果都应通过PQclear 在不再需要结果时将其释放。
+
+ 释放与 PGresult 关联的存储空间。每个命令结果在不再需要时都应通过 PQclear 释放。
+
void PQclear(PGresult *res);
-
+
你可以在需要时一直保留PGresult 对象;它不会在你发出新命令时消失,甚至在关闭连接后也不会消失。要销毁它,你必须调用PQclear 。否则应用程序会发生内存泄漏。
@@ -2225,15 +2249,15 @@ void PQclear(PGresult *res);
-
+
检索查询结果信息
- 这些函数被用来从一个代表成功查询结果(也就是状态为PGRES_TUPLES_OK 或者PGRES_SINGLE_TUPLE )的PGresult 对象中抽取信息。它们也可以被用来从一个成功的 Describe 操作中抽取信息:一个 Describe 的结果具有和该查询被实际执行所提供的完全相同的列信息,但是它没有行。对于其他状态值的对象,这些函数会认为结果具有零行和零列。
-
+ 这些函数用于从表示成功查询结果的 PGresult 对象中提取信息,即状态为 PGRES_TUPLES_OK 或 PGRES_SINGLE_TUPLE 的对象。它们也可用于提取成功 Describe 操作的结果信息:Describe 结果包含的列信息与实际执行查询时相同,但行数为零。对于其他状态值的对象,这些函数会将结果视为零行、零列。
+
@@ -2258,7 +2282,7 @@ int PQntuples(const PGresult *res);
- 返回查询结果中每一行的列(域)数。
+ 返回查询结果中每一行的列(字段)数。
int PQnfields(const PGresult *res);
@@ -2271,7 +2295,8 @@ int PQnfields(const PGresult *res);
PQfname PQfname
- 返回给定列号对应的列名。列号从 0 开始。调用者不应直接释放结果。在将关联的PGresult 句柄传给以下函数时,会释放该结果:PQclear 。
+
+ 返回给定列号对应的列名。列号从 0 开始。调用者不应直接释放结果;当关联的 PGresult 句柄被传给 PQclear 时,结果会被释放。
char *PQfname(const PGresult *res,
int column_number);
@@ -2302,11 +2327,11 @@ int PQfnumber(const PGresult *res,
- 给定的名称被视作一个 SQL 命令中的一个标识符,也就是说,除非被双引号引用,它是小写形式的。例如,给定一个 SQL 命令:
+ 给定名称按 SQL 命令中的标识符处理,即除非用双引号引用,否则会转换为小写。例如,对于以下 SQL 命令生成的查询结果:
SELECT 1 AS FOO, 2 AS "BAR";
- 我们将得到结果:
+会得到以下结果:
PQfname(res, 0) foo
PQfname(res, 1) BAR
@@ -2324,7 +2349,7 @@ PQfnumber(res, "\"BAR\"") 1
- 返回给定列从中取出的表的 OID。列号从 0 开始。
+ 返回给定列所取自的表的 OID。列号从 0 开始。
Oid PQftable(const PGresult *res,
int column_number);
@@ -2333,7 +2358,9 @@ Oid PQftable(const PGresult *res,
如果列号超出范围、指定的列不是对表列的简单引用,或者使用 3.0 之前的协议,则返回 InvalidOid 。可以查询系统表 pg_class ,确定所引用的具体表。
- 包含 libpq 头文件后,将定义类型 Oid 和常量 InvalidOid 。它们都属于某种整数类型。
+
+ 包含 libpq 头文件后,将定义类型 Oid 和常量 InvalidOid 。它们都属于某种整数类型。
+
@@ -2342,7 +2369,7 @@ Oid PQftable(const PGresult *res,
- 返回构成指定查询结果列的列(在其表中)的列号。查询结果列号从 0 开始,但是表列具有非零编号。
+ 返回指定查询结果列所对应的表列在表中的列号。查询结果的列号从 0 开始,而表列的编号非零。
int PQftablecol(const PGresult *res,
int column_number);
@@ -2359,7 +2386,7 @@ int PQftablecol(const PGresult *res,
- 返回指示给定列格式的格式编码。列号从 0 开始。
+ 返回表示给定列格式的格式代码。列号从 0 开始。
int PQfformat(const PGresult *res,
int column_number);
@@ -2367,7 +2394,7 @@ int PQfformat(const PGresult *res,
- 格式代码零指示文本数据表示,而格式代码一表示二进制表示(其他代码被保留用于未来的定义)。
+ 格式代码零表示文本数据,格式代码一表示二进制数据。(其他代码保留供将来定义。)
@@ -2394,7 +2421,7 @@ Oid PQftype(const PGresult *res,
- 返回与给定列号相关联的列的修饰符类型。列号从 0 开始。
+ 返回与给定列号相关联的列的类型修饰符。列号从 0 开始。
int PQfmod(const PGresult *res,
int column_number);
@@ -2402,7 +2429,7 @@ int PQfmod(const PGresult *res,
- 修饰符值的解释是与类型相关的,它们通常指示精度或尺寸限制。值 -1 被用来指示没有信息可用
。大部分的数据类型不适用修饰符,在那种情况中值总是 -1。
+ 修饰符值的含义由数据类型决定,通常表示精度或大小限制。值 -1 表示没有可用信息
。大多数数据类型不使用修饰符,此时该值始终为 -1。
@@ -2412,7 +2439,7 @@ int PQfmod(const PGresult *res,
- 返回与给定列号相关的列的尺寸(以字节计)。列号从 0 开始。
+ 返回给定列号对应列的大小,以字节计。列号从 0 开始。
int PQfsize(const PGresult *res,
int column_number);
@@ -2420,7 +2447,7 @@ int PQfsize(const PGresult *res,
- PQfsize 返回在一个数据库行中为这个列分配的空间,换句话说是服务器对该数据类型的内部表示的尺寸(因此,它对客户端并不是真地非常有用)。一个负值指示该数据类型是变长的。
+ PQfsize 返回数据库行中为该列分配的空间,即服务器内部表示该数据类型所需的大小。(因此,它对客户端用处不大。)负值表示该数据类型是变长类型。
@@ -2437,8 +2464,7 @@ int PQbinaryTuples(const PGresult *res);
- 这个函数已经被废弃(除了与COPY 一起使用),因为一个单一PGresult 可以在某些列中包含文本数据而且在另一些列中包含二进制数据。
- PQfformat 要更好。只有结果的所有列是二进制(格式 1)时PQbinaryTuples 才返回 1。
+ 此函数已弃用(与 COPY 配合使用的情况除外),因为单个 PGresult 可能在部分列中包含文本数据,而在其他列中包含二进制数据。推荐使用 PQfformat 。只有结果中的所有列都采用二进制格式(格式 1)时,PQbinaryTuples 才返回 1。
@@ -2447,7 +2473,8 @@ int PQbinaryTuples(const PGresult *res);
PQgetvalue PQgetvalue
- 返回以下结果中某一行的一个字段值:PGresult 。行号和列号都从 0 开始。调用者不应直接释放结果。在将关联的PGresult 句柄传给以下函数时,会释放该结果:PQclear 。
+
+ 返回 PGresult 中某一行的单个字段值。行号和列号从 0 开始。调用者不应直接释放结果;当关联的 PGresult 句柄被传给 PQclear 时,结果会被释放。
char *PQgetvalue(const PGresult *res,
int row_number,
@@ -2455,24 +2482,26 @@ char *PQgetvalue(const PGresult *res,
- 对于文本格式的数据,PQgetvalue 返回字段值的字符串表示,以零字节结尾。对于二进制格式的数据,返回值采用该数据类型的 typsend 和 typreceive 函数所决定的二进制表示。(这种情况下,值后面实际上也有一个零字节,但通常没有用处,因为值本身很可能包含零字节。)
+
+ 对于文本格式的数据,PQgetvalue 返回字段值的字符串表示,以零字节结尾。对于二进制格式的数据,返回值采用该数据类型的 typsend 和 typreceive 函数所决定的二进制表示。(这种情况下,值后面实际上也有一个零字节,但通常没有用处,因为值本身很可能包含零字节。)
+
- 如果该域值为空,则返回一个空串。关于区分空值和空字符串值请见PQgetisnull 。
+ 如果字段值为 null,则返回空字符串。关于如何区分 null 值与空字符串值,参见 PQgetisnull 。
- PQgetvalue 返回的指针指向作为PGresult 结构体一部分的存储。我们不应该修改它指向的数据,并且如果要在超过PGresult 结构体本身的生命期之外使用它,我们必须显式地把该数据拷贝到其他存储中。
+ PQgetvalue 返回的指针指向属于 PGresult 结构体的存储空间。不应修改它所指向的数据;如果需要在 PGresult 结构体的生命周期结束后继续使用这些数据,就必须显式地将数据复制到其他存储空间。
- PQgetisnull PQgetisnull null value in libpq
+ PQgetisnull PQgetisnull null 值 libpq 中的
- 测试一个域是否为空值。行号和列号从 0 开始。
+ 检查字段是否为 null 值。行号和列号从 0 开始。
int PQgetisnull(const PGresult *res,
int row_number,
@@ -2481,7 +2510,7 @@ int PQgetisnull(const PGresult *res,
- 如果该域是空,这个函数返回 1。如果它包含一个非空值,则返回 0(注意PQgetvalue 将为一个空域返回一个空串,不是一个空指针)。
+ 如果字段为 null,此函数返回 1;如果包含非 null 值,则返回 0。(注意,对于 null 字段,PQgetvalue 返回空字符串,而非空指针。)
@@ -2491,7 +2520,7 @@ int PQgetisnull(const PGresult *res,
- 返回一个域值的真实长度,以字节计。行号和列号从 0 开始。
+ 返回字段值的实际长度,以字节计。行号和列号从 0 开始。
int PQgetlength(const PGresult *res,
int row_number,
@@ -2500,9 +2529,7 @@ int PQgetlength(const PGresult *res,
- 这是特定数据值的真实数据长度,也就是PQgetvalue 指向的对象的尺寸。
- 对于文本数据格式,这和strlen() 相同。对于二进制格式这是基本信息。
- 注意我们不 应该依赖于PQfsize 来得到实际的数据长度。
+ 这是该数据值的实际数据长度,即 PQgetvalue 所指对象的大小。对于文本格式的数据,它与 strlen() 的结果相同。对于二进制格式,这是必不可少的信息。注意,不应 依赖 PQfsize 来获取实际数据长度。
@@ -2547,29 +2574,29 @@ Oid PQparamtype(const PGresult *res, int param_number);
- 将所有的行打印到指定的输出流,以及有选择地将列名打印到指定的输出流。
+ 将所有行输出到指定的输出流,并可选择输出列名。
void PQprint(FILE *fout, /* 输出流 */
const PGresult *res,
const PQprintOpt *po);
typedef struct
{
- pqbool header; /* 打印输出域标题和行计数 */
- pqbool align; /* 填充对齐域 */
- pqbool standard; /* 旧的格式 */
+ pqbool header; /* 打印输出字段标题和行数 */
+ pqbool align; /* 填充并对齐字段 */
+ pqbool standard; /* 旧的简陋格式 */
pqbool html3; /* 输出 HTML 表格 */
- pqbool expanded; /* 扩展表格 */
- pqbool pager; /* 如果必要为输出使用页 */
- char *fieldSep; /* 域分隔符 */
+ pqbool expanded; /* 展开表格 */
+ pqbool pager; /* 需要时使用分页器输出 */
+ char *fieldSep; /* 字段分隔符 */
char *tableOpt; /* 用于 HTML 表格元素的属性 */
char *caption; /* HTML 表格标题 */
- char **fieldName; /* 替换域名称的空终止数组 */
+ char **fieldName; /* 以空指针结尾的替换字段名数组 */
} PQprintOpt;
- 这个函数以前被psql 用来打印查询结果,但是现在不是这样了。注意它假定所有的数据都是文本格式。
+ psql 以前用此函数打印查询结果,现在已不再使用。注意,此函数假定所有数据都是文本格式。
@@ -2612,7 +2639,9 @@ char *PQcmdTuples(PGresult *res);
- 此函数返回一个字符串,其中包含产生该 PGresult 的 SQL 语句所影响的行数。此函数只能在执行 SELECT 、CREATE TABLE AS 、INSERT 、UPDATE 、DELETE 、MOVE 、FETCH 或 COPY 语句之后使用,也可以在对包含 INSERT 、UPDATE 或 DELETE 语句的预备查询执行 EXECUTE 之后使用。如果产生 PGresult 的是其他命令,PQcmdTuples 将返回空字符串。调用者不应直接释放返回值;将关联的 PGresult 句柄传给 PQclear 时,它会被释放。
+
+ 此函数返回一个字符串,其中包含产生该 PGresult 的 SQL 语句所影响的行数。此函数只能在执行 SELECT 、CREATE TABLE AS 、INSERT 、UPDATE 、DELETE 、MOVE 、FETCH 或 COPY 语句之后使用,也可以在对包含 INSERT 、UPDATE 或 DELETE 语句的预备查询执行 EXECUTE 之后使用。如果产生 PGresult 的是其他命令,PQcmdTuples 将返回空字符串。调用者不应直接释放返回值;当关联的 PGresult 句柄被传给 PQclear 时,返回值会被释放。
+
@@ -2622,7 +2651,7 @@ char *PQcmdTuples(PGresult *res);
- 如果该SQL 命令是一个正好将一行插入到具有 OID 的表的INSERT ,或者是一个包含合适INSERT 语句的预备查询的EXECUTE ,这个函数返回被插入行的 OIDOID in libpq 。否则,这个函数返回InvalidOid 。如果被INSERT 语句影响的表不包含 OID,这个函数也将返回InvalidOid 。
+ 如果该SQL 命令是一个正好将一行插入到具有 OID 的表的INSERT ,或者是一个包含合适INSERT 语句的预备查询的EXECUTE ,这个函数返回被插入行的 OIDOID libpq 中的 。否则,这个函数返回InvalidOid 。如果被INSERT 语句影响的表不包含 OID,这个函数也将返回InvalidOid 。
Oid PQoidValue(const PGresult *res);
@@ -2634,7 +2663,9 @@ Oid PQoidValue(const PGresult *res);
PQoidStatus PQoidStatus
- 此函数已弃用,推荐使用PQoidValue ,且此函数不是线程安全的。它返回包含插入行 OID 的字符串,而PQoidValue 返回 OID 值。
+
+ 此函数不是线程安全的,现已弃用,推荐改用 PQoidValue 。它返回包含插入行 OID 的字符串,而 PQoidValue 返回 OID 值。
+
char *PQoidStatus(const PGresult *res);
@@ -2650,7 +2681,7 @@ char *PQoidStatus(const PGresult *res);
转义字符串
- in libpq
+ libpq 中的
@@ -2666,17 +2697,13 @@ char *PQescapeLiteral(PGconn *conn, const char *str, size_t length);
为了让一个字符串可用于 SQL 命令,PQescapeLiteral 会对它进行转义。
- 当在 SQL 命令中把数据值作为字符串字面量插入时,这个函数很有用。一些字符(例如引号和反斜线)必须经过转义,才不会被 SQL 解析器解释成特殊含义。
+ 当在 SQL 命令中把数据值作为字符串字面量插入时,这个函数很有用。一些字符(例如引号和反斜杠)必须经过转义,才不会被 SQL 解析器解释成特殊含义。
PQescapeLiteral 执行这种操作。
- PQescapeLiteral 返回一个str 参数的已被转义版本,该版本被放在用malloc() 分配的内存中。
- 当该结果不再被需要时,这个内存应该用PQfreemem() 释放。
- 一个终止的零字节不是必须的,并且不应该被计入length (如果在length 字节被处理之前找到一个终止字节,PQescapeLiteral 会停止在零,该行为更像strncpy )。
- 返回字符串中的所有特殊字符都会被替换,这样它们就能被PostgreSQL 字符串字面量解析器正确处理。
- 结果中也会附加一个终止零字节,并包含包围PostgreSQL 字符串字面量所需的单引号。
-
+ PQescapeLiteral 返回 str 参数的转义版本,存放在通过 malloc() 分配的内存中。结果不再需要时,应使用 PQfreemem() 释放该内存。输入不必以零字节结尾,末尾零字节也不应计入 length 。(如果在处理完 length 个字节之前遇到末尾零字节,PQescapeLiteral 会在该字节处停止;这一行为类似于 strncpy 。)返回字符串中的所有特殊字符均已替换,以便 PostgreSQL 字符串字面量解析器正确处理。还会添加一个末尾零字节。包围 PostgreSQL 字符串字面量所需的单引号包含在结果字符串中。
+
发生错误时,PQescapeLiteral 返回NULL 并且一个合适的消息会被存储在conn 对象中。
@@ -2690,7 +2717,7 @@ char *PQescapeLiteral(PGconn *conn, const char *str, size_t length);
- 注意,当一个数据值被作为PQexecParams 或其兄弟例程中的一个独立参数传递时,没有必要做转义而且做转义也不正确。
+ 注意,当一个数据值被作为PQexecParams 或相关例程中的一个独立参数传递时,没有必要做转义而且做转义也不正确。
@@ -2705,14 +2732,13 @@ char *PQescapeIdentifier(PGconn *conn, const char *str, size_t length);
- PQescapeIdentifier 对字符串进行转义,使其可用作 SQL 标识符,例如表名、列名或函数名。当用户提供的标识符可能包含未经转义就不会被 SQL 解析器视为标识符一部分的特殊字符,或包含需要保留大小写的大写字符时,此函数很有用。
+
+ PQescapeIdentifier 对字符串进行转义,使其可用作 SQL 标识符,例如表名、列名或函数名。当用户提供的标识符可能包含未经转义就不会被 SQL 解析器视为标识符一部分的特殊字符,或包含需要保留大小写的大写字符时,此函数很有用。
+
- PQescapeIdentifier 返回一个str 参数的已被转义为 SQL 标识符的版本,该版本被放在用malloc() 分配的内存中。
- 当该结果不再被需要时,这个内存必须用PQfreemem() 释放。
- 一个终止的零字节不是必须的,并且不应该被计入length (如果在length 字节被处理之前找到一个终止字节,PQescapeIdentifier 会停止在零,该行为更像strncpy )。
- 返回串中的所有特殊字符都被替换掉,这样它们能被作为一个 SQL 标识符正确地处理。还会加上一个终止零字节。返回串也将被双引号包围。
-
+ PQescapeIdentifier 返回 str 参数作为 SQL 标识符的转义版本,存放在通过 malloc() 分配的内存中。结果不再需要时,必须使用 PQfreemem() 释放该内存。输入不必以零字节结尾,末尾零字节也不应计入 length 。(如果在处理完 length 个字节之前遇到末尾零字节,PQescapeIdentifier 会在该字节处停止;这一行为类似于 strncpy 。)返回字符串中的所有特殊字符均已替换,以便正确地作为 SQL 标识符处理。还会添加一个末尾零字节,并用双引号包围返回的字符串。
+
发生错误时,PQescapeIdentifier 返回NULL 并且一个合适的消息会被存储在conn 对象中。
@@ -2721,7 +2747,7 @@ char *PQescapeIdentifier(PGconn *conn, const char *str, size_t length);
- 与字符串一样,要阻止 SQL 注入攻击,当从一个不可信的来源接收到 SQL 标识符时,它们必须被转义。
+ 与字符串字面量一样,为防止 SQL 注入攻击,从不可信来源接收到的 SQL 标识符必须经过转义。
@@ -2740,18 +2766,12 @@ size_t PQescapeStringConn(PGconn *conn,
- PQescapeStringConn 转义字符串,它很像PQescapeLiteral 。
- 与PQescapeLiteral 不一样的是,调用者负责提供一个合适尺寸的缓冲区。
- 此外,PQescapeStringConn 不产生必须包围PostgreSQL 字符串的单引号。
- 它们应该在结果要插入的 SQL 命令中提供。参数from 指向要被转义的串的第一个字符,并且length 参数给出了这个串中的字节数。
- 一个终止的零字节不是必须的,并且不应该被计入length (如果在length 字节被处理之前找到一个终止字节,PQescapeStringConn 会停止在零,该行为更像strncpy )。
- to 应当指向一个缓冲区,它至少能容纳length 值的两倍再加一个字节,否则该行为是未被定义的。
- 如果to 和from 串重叠,行为也是未被定义的。
-
+ PQescapeStringConn 对字符串字面量进行转义,与 PQescapeLiteral 类似。与 PQescapeLiteral 不同,调用者需要提供大小合适的缓冲区。此外,PQescapeStringConn 不会生成包围 PostgreSQL 字符串字面量所需的单引号;应在包含转义结果的 SQL 命令中提供这些引号。from 参数指向待转义字符串的首字符,length 参数给出该字符串的字节数。输入不必以零字节结尾,末尾零字节也不应计入 length 。(如果在处理完 length 个字节之前遇到末尾零字节,PQescapeStringConn 会在该字节处停止;这一行为类似于 strncpy 。)to 必须指向一个缓冲区,其容量至少为 length 的两倍加一个字节,否则行为未定义。如果 to 与 from 字符串重叠,行为同样未定义。
+
- 如果error 参数不是NULL ,那么成功时*error 被设置为零,错误时设置为非零。当前唯一可能的错误情况涉及源串中非法的多字节编码。错误时仍然会产生输出串,但是可以预期服务器将认为它是畸形的并且拒绝它。在发生错误时,一个合适的消息被存储在conn 对象中,不管error 是不是NULL 。
-
+ 如果 error 参数不是 NULL ,则成功时将 *error 设为零,出错时设为非零。目前唯一可能的错误是源字符串中存在无效的多字节编码。出错时仍会生成输出字符串,但预计服务器会因其格式错误而拒绝它。发生错误时,无论 error 是否为 NULL ,都会在 conn 对象中保存相应消息。
+
PQescapeStringConn 返回写到to 的字节数,不包括终止的零字节。
@@ -2764,15 +2784,19 @@ size_t PQescapeStringConn(PGconn *conn,
- PQescapeString 是以下函数的旧版本,现已弃用:PQescapeStringConn 。
+ PQescapeString 是 PQescapeStringConn 的旧版本,现已弃用。
size_t PQescapeString (char *to, const char *from, size_t length);
-
+
- 与 PQescapeStringConn 唯一的区别是,PQescapeString 不接受 PGconn 或 error 参数。因此,它无法根据连接属性(例如字符编码)调整行为,可能给出错误的结果 。此外,它也无法报告错误情况。
+
+ 与 PQescapeStringConn 唯一的区别是,PQescapeString 不接受 PGconn 或 error 参数。因此,它无法根据连接属性(例如字符编码)调整行为,可能给出错误的结果 。此外,它也无法报告错误情况。
+
- PQescapeString 可以在同一时刻仅使用一个 PostgreSQL 连接的客户端程序中安全使用(在这种情况下,它能够在内部
取得所需信息)。在其他情形下,它存在安全隐患,应改用 PQescapeStringConn 。
+
+ PQescapeString 可以在同一时刻仅使用一个 PostgreSQL 连接的客户端程序中安全使用(在这种情况下,它能够在内部
取得所需信息)。在其他情形下,它存在安全隐患,应改用 PQescapeStringConn 。
+
@@ -2780,7 +2804,9 @@ size_t PQescapeString (char *to, const char *from, size_t length);
PQescapeByteaConn PQescapeByteaConn
- 对二进制数据进行转义,使其能够在 SQL 命令中用作以下类型的值:bytea 。与PQescapeStringConn 一样,这仅用于将数据直接插入 SQL 命令字符串的情况。
+
+ 对二进制数据进行转义,使其能够在 SQL 命令中用作 bytea 类型的值。与 PQescapeStringConn 一样,这仅用于将数据直接插入 SQL 命令字符串的情况。
+
unsigned char *PQescapeByteaConn(PGconn *conn,
const unsigned char *from,
size_t from_length,
@@ -2794,10 +2820,12 @@ unsigned char *PQescapeByteaConn(PGconn *conn,
- from 参数指向要被转义的串的第一个字节,并且from_length 参数给出这个二进制串中的字节数(一个终止的零字节是不需要的也是不被计算的)。to_length 参数指向一个将保持生成的已转义串长度的变量。这个结果串长度包括结果的终止零字节。
+ from 参数指向待转义字符串的首字节,from_length 参数给出该二进制字符串的字节数。(末尾零字节既不需要,也不计入长度。)to_length 参数指向用于保存转义后字符串长度的变量。该结果字符串长度包含结果末尾的零字节。
- PQescapeByteaConn 返回 from 参数所指二进制字符串的转义版本,存放在通过 malloc() 分配的内存中。结果不再需要时,应使用 PQfreemem() 释放该内存。返回字符串中的所有特殊字符都已替换,以便 PostgreSQL 字符串字面量解析器和 bytea 输入函数正确处理。还会添加一个末尾零字节。包围 PostgreSQL 字符串字面量所需的单引号不包含在结果字符串中。
+
+ PQescapeByteaConn 返回 from 参数所指二进制字符串的转义版本,存放在通过 malloc() 分配的内存中。结果不再需要时,应使用 PQfreemem() 释放该内存。返回字符串中的所有特殊字符都已替换,以便 PostgreSQL 字符串字面量解析器和 bytea 输入函数正确处理。还会添加一个末尾零字节。包围 PostgreSQL 字符串字面量所需的单引号不包含在结果字符串中。
+
在发生错误时,将返回一个空指针,并且一个合适的错误消息被存储在conn 对象中。当前,唯一可能的错误是没有足够的内存用于结果串。
@@ -2810,7 +2838,7 @@ unsigned char *PQescapeByteaConn(PGconn *conn,
- PQescapeBytea 是以下函数的旧版本,现已弃用:PQescapeByteaConn 。
+ PQescapeBytea 是 PQescapeByteaConn 的旧版本,现已弃用。
unsigned char *PQescapeBytea(const unsigned char *from,
size_t from_length,
@@ -2819,9 +2847,7 @@ unsigned char *PQescapeBytea(const unsigned char *from,
- 与PQescapeByteaConn 的唯一区别是PQescapeBytea 不用一个PGconn 参数。
- 正因为这样,PQescapeBytea 只能在一次只使用一个PostgreSQL 连接的客户端程序中安全地使用(在这种情况下它可以在内部
找出它需要知道的东西)。
- 如果在有多个数据库连接的程序中使用,它可能给出错误的结果 (在那种情况下使用PQescapeByteaConn )。
+ 与 PQescapeByteaConn 唯一的区别是,PQescapeBytea 不接受 PGconn 参数。因此,PQescapeBytea 只能在同一时刻仅使用一个 PostgreSQL 连接的客户端程序中安全使用(在这种情况下,它能够在内部
取得所需信息)。如果在使用多个数据库连接的程序中使用,它可能给出错误的结果 (此时应使用 PQescapeByteaConn )。
@@ -2887,26 +2913,26 @@ unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length);
- PQexec 总是收集命令的整个结果,把它缓存在一个单一的PGresult 中。虽然这简化了应用的错误处理逻辑,它对于包含很多行的结果并不现实。
-
+ PQexec 总是收集命令的完整结果,并将其缓存在单个 PGresult 中。这简化了应用程序的错误处理逻辑,但对于包含大量行的结果,可能不切实际。
+
- 如果应用程序不希望受到这些限制,可以改用构成PQexec 的底层函数:PQsendQuery 和PQgetResult 。此外,还有PQsendQueryParams ,
- PQsendPrepare ,
- PQsendQueryPrepared ,
- PQsendDescribePrepared ,以及PQsendDescribePortal ,它们可以与PQgetResult 配合使用,分别实现以下函数的功能:PQexecParams ,
- PQprepare ,
- PQexecPrepared ,
- PQdescribePrepared ,以及PQdescribePortal 。
+
+ 如果应用程序不希望受到这些限制,可以改用构成 PQexec 的底层函数:PQsendQuery 和 PQgetResult 。此外,PQsendQueryParams 、PQsendPrepare 、PQsendQueryPrepared 、PQsendDescribePrepared 、PQsendDescribePortal 可以与 PQgetResult 配合使用,分别实现 PQexecParams 、PQprepare 、PQexecPrepared 、PQdescribePrepared 、PQdescribePortal 的功能。
+
PQsendQuery PQsendQuery
- 向服务器提交命令,不等待结果。命令发送成功时返回 1,否则返回 0(此时可以使用PQerrorMessage 取得更多失败信息)。
+
+ 向服务器提交命令,不等待结果。命令发送成功时返回 1,否则返回 0(此时可使用 PQerrorMessage 获取更多失败信息)。
+
int PQsendQuery(PGconn *conn, const char *command);
- 成功调用PQsendQuery 之后,应调用PQgetResult 一次或多次来取得结果。PQsendQuery 在同一连接上不能再次调用,直到PQgetResult 返回空指针,表明命令已经完成。
+
+成功调用 PQsendQuery 后,应调用 PQgetResult 一次或多次来获取结果。在 PQgetResult 返回空指针、表明命令已完成之前,不得在同一连接上再次调用 PQsendQuery 。
+
@@ -2914,7 +2940,9 @@ int PQsendQuery(PGconn *conn, const char *command);
PQsendQueryParams PQsendQueryParams
- 向服务器提交命令及独立指定的参数,不等待结果。
+
+ 向服务器提交命令及独立指定的参数,不等待结果。
+
int PQsendQueryParams(PGconn *conn,
const char *command,
int nParams,
@@ -2923,7 +2951,9 @@ int PQsendQueryParams(PGconn *conn,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
- 该函数等价于PQsendQuery ,但查询参数可以与查询字符串分开指定。函数参数的处理方式与PQexecParams 相同。与PQexecParams 一样,它不能用于协议 2.0 的连接,并且查询字符串中只允许包含一条命令。
+
+该函数等价于 PQsendQuery ,但查询参数可以与查询字符串分开指定。函数参数的处理方式与 PQexecParams 相同。与 PQexecParams 一样,它不能用于协议 2.0 的连接,并且查询字符串中只允许包含一条命令。
+
@@ -2931,13 +2961,17 @@ int PQsendQueryParams(PGconn *conn,
PQsendPrepare PQsendPrepare
- 发送按给定参数创建预备语句的请求,不等待完成。
+
+ 发送按给定参数创建预备语句的请求,不等待完成。
+
int PQsendPrepare(PGconn *conn,
const char *stmtName,
const char *query,
int nParams,
const Oid *paramTypes);
- 这是PQprepare 的异步版本:请求发送成功时返回 1,否则返回 0。调用成功后,再调用PQgetResult ,确定服务器是否成功创建了预备语句。函数参数的处理方式与PQprepare 相同。与PQprepare 一样,它不能用于协议 2.0 的连接。
+
+这是 PQprepare 的异步版本:请求发送成功时返回 1,否则返回 0。调用成功后,再调用 PQgetResult ,确定服务器是否成功创建了预备语句。函数参数的处理方式与 PQprepare 相同。与 PQprepare 一样,它不能用于协议 2.0 的连接。
+
@@ -2945,7 +2979,9 @@ int PQsendPrepare(PGconn *conn,
PQsendQueryPrepared PQsendQueryPrepared
- 发送使用给定参数执行预备语句的请求,不等待结果。
+
+ 发送使用给定参数执行预备语句的请求,不等待结果。
+
int PQsendQueryPrepared(PGconn *conn,
const char *stmtName,
int nParams,
@@ -2953,7 +2989,9 @@ int PQsendQueryPrepared(PGconn *conn,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
- 该函数类似于PQsendQueryParams ,但通过指定先前已准备好的语句的名称来确定要执行的命令,而不是提供查询字符串。函数参数的处理方式与PQexecPrepared 相同。与PQexecPrepared 一样,它不能用于协议 2.0 的连接。
+
+该函数类似于 PQsendQueryParams ,但通过已创建的预备语句的名称指定要执行的命令,而非提供查询字符串。函数参数的处理方式与 PQexecPrepared 相同。与 PQexecPrepared 一样,它不能用于协议 2.0 的连接。
+
@@ -2990,7 +3028,9 @@ PGresult *PQgetResult(PGconn *conn);
- 必须反复调用 PQgetResult ,直到它返回空指针,表明命令已经完成。(如果当前没有正在执行的命令,调用 PQgetResult 会立即返回空指针。)对于 PQgetResult 返回的每个非空结果,都应使用前文介绍的 PGresult 访问函数处理。使用完毕后,不要忘记调用 PQclear 释放每个结果对象。注意,只有存在正在执行的命令,且所需响应数据尚未被 PQconsumeInput 读取时,PQgetResult 才会阻塞。
+
+ 必须反复调用 PQgetResult ,直到它返回空指针,表明命令已经完成。(如果当前没有正在执行的命令,调用 PQgetResult 会立即返回空指针。)对于 PQgetResult 返回的非空指针,应使用前文介绍的 PGresult 访问函数处理相应结果。使用完毕后,不要忘记调用 PQclear 释放每个结果对象。注意,只有存在正在执行的命令,且所需响应数据尚未被 PQconsumeInput 读取时,PQgetResult 才会阻塞。
+
@@ -3001,37 +3041,36 @@ PGresult *PQgetResult(PGconn *conn);
-
+
- 使用PQsendQuery 和PQgetResult 解决了PQexec 的一个问题:如果一个命令字符串包含多个SQL 命令,这些命令的结果可以被个别地获得(顺便说一句:这样就允许一种简单的重叠处理形式, 客户端可以处理一个命令的结果,而同时服务器可以继续处理同一命令字符串中后面的查询)。
-
+ 使用 PQsendQuery 和 PQgetResult 可以解决 PQexec 的一个问题:如果命令字符串包含多个 SQL 命令,就能分别获取这些命令的结果。(这也支持一种简单的重叠处理方式:客户端可以处理某条命令的结果,同时服务器继续处理同一命令字符串中后面的查询。)
+
- 可以被PQsendQuery 和PQgetResult 获得的另一种常常想要的特性是一次从大型结果中检索一行。这会在中讨论。
-
+ 使用 PQsendQuery 和 PQgetResult 还可以实现另一项常见需求:从大型查询结果中一次读取一行。详见 。
+
- 仅仅调用PQgetResult 仍会使客户端阻塞,直到服务器完成下一条SQL 命令。可以通过正确使用另外两个函数来避免这种情况:
+
+ 仅仅调用 PQgetResult 仍会使客户端阻塞,直到服务器完成下一条 SQL 命令。可以通过正确使用另外两个函数来避免这种情况:
+
PQconsumeInput PQconsumeInput
- 如果有来自服务器的输入可用,则使用之。
+ 如果服务器有可读取的输入,则读取这些输入。
int PQconsumeInput(PGconn *conn);
- PQconsumeInput 通常返回 1 表明没有错误
,而返回 0 表明有某种麻烦发生(此时可以用PQerrorMessage )。
- 注意该结果并不表明是否真正收集了任何输入数据。在调用PQconsumeInput 之后,应用可以检查PQisBusy 和/或PQnotifies 来看看它们的状态是否改变。
+ PQconsumeInput 通常返回 1,表示没有错误
;发生问题时则返回 0(此时可查看 PQerrorMessage )。注意,返回值并不说明是否实际读取了输入数据。调用 PQconsumeInput 后,应用程序可以检查 PQisBusy 和/或 PQnotifies ,以确定其状态是否发生变化。
- 即使应用还不准备处理一个结果或通知,PQconsumeInput 也可以被调用。
- 这个函数将读取可用的数据并且把它保存在一个缓冲区中,从而导致一个select() 的读准备好指示消失。
- 因此应用可以使用PQconsumeInput 立即清除select() 条件,并且在空闲时再检查结果。
+ 即使应用程序尚未准备好处理结果或通知,也可以调用 PQconsumeInput 。此函数会读取可用数据并将其保存在缓冲区中,从而清除 select() 的可读就绪指示。因此,应用程序可以用 PQconsumeInput 立即清除 select() 的就绪条件,随后在合适的时候检查结果。
@@ -3051,22 +3090,20 @@ int PQisBusy(PGconn *conn);
-
+
- 一个使用这些函数的典型应用将有一个主循环,在主循环中会使用select() 或poll() 等待所有它必须响应的情况。
- 其中之一将是来自服务器的输入可用,对select() 来说意味着PQsocket 标识的文件描述符上有可读的数据。
- 当主循环检测到输入准备好时,它将调用PQconsumeInput 读取输入。
- 然后它可以调用PQisBusy ,如果PQisBusy 返回假(0)则接着调用PQgetResult 。
- 它还可以调用PQnotifies 检测NOTIFY 消息(见)。
-
+ 使用这些函数的典型应用程序会在主循环中通过 select() 或 poll() 等待需要响应的各种条件。其中一个条件是服务器有可读取的输入;对于 select() ,这意味着 PQsocket 标识的文件描述符上有可读数据。主循环检测到输入就绪时,应调用 PQconsumeInput 读取输入,然后调用 PQisBusy 。如果 PQisBusy 返回假(0),就可以接着调用 PQgetResult 。还可以调用 PQnotifies 检测 NOTIFY 消息(见 )。
+
一个使用PQsendQuery /PQgetResult 的客户端也可以尝试取消一个正在被服务器处理的命令,见。
但是,不管PQcancel 的返回值是什么,应用都必须继续使用PQgetResult 进行正常的结果读取序列。一次成功的取消只会导致命令比不取消时更快终止。
- 使用上述函数可以避免在等待数据库服务器输入时阻塞。不过,应用程序仍可能在等待向服务器发送输出时阻塞。这种情况较少见,但发送很长的 SQL 命令或数据值时可能发生。(如果应用程序通过COPY IN 发送数据,发生的可能性则大得多。)为了防止这种情况,实现完全非阻塞的数据库操作,可以使用以下附加函数。
+
+ 使用上述函数可以避免在等待数据库服务器输入时阻塞。不过,应用程序仍可能在等待向服务器发送输出时阻塞。这种情况较少见,但发送很长的 SQL 命令或数据值时可能发生。(如果应用程序通过 COPY IN 发送数据,发生的可能性则大得多。)为了防止这种情况,实现完全非阻塞的数据库操作,可以使用以下附加函数。
+
PQsetnonblocking PQsetnonblocking
@@ -3113,9 +3150,7 @@ int PQisnonblocking(const PGconn *conn);
- 尝试将任何排队的输出数据刷新到服务器。如果成功(或发送队列为空),则返回0;
- 如果由于某种原因失败,则返回-1;如果尚未能够发送发送队列中的所有数据(只有在连接为非阻塞时才会发生此情况),
- 则返回1。
+ 尝试将发送队列中的输出数据发送到服务器。成功(或发送队列为空)时返回 0;因某种原因失败时返回 -1;如果尚未能发送队列中的全部数据,则返回 1(这种情况只可能发生在非阻塞连接上)。
int PQflush(PGconn *conn);
@@ -3123,15 +3158,11 @@ int PQflush(PGconn *conn);
-
+
- 在一个非阻塞连接上发送任何命令或者数据之后,要调用PQflush 。
- 如果它返回 1,就要等待套接字变成读准备好或写准备好。如果它变为写准备好,应再次调用PQflush 。
- 如果它变为读准备好,则应先调用PQconsumeInput ,然后再调用PQflush 。
- 一直重复直到PQflush 返回 0(有必要检查读准备好并且用PQconsumeInput 耗尽输入,因为服务器可能阻塞给我们发送数据的尝试,例如 NOTICE 消息,并且在我们读它的数据之前它都不会读我们的数据)。
- 一旦PQflush 返回 0,应等待套接字变成读准备好并且接着按照上文所述读取响应。
-
+ 在非阻塞连接上发送命令或数据后,应调用 PQflush 。如果返回 1,就等待套接字变为可读或可写。套接字可写时,再次调用 PQflush ;可读时,先调用 PQconsumeInput ,再调用 PQflush 。重复上述步骤,直到 PQflush 返回 0。(必须检查套接字是否可读,并用 PQconsumeInput 读完输入,因为服务器可能在尝试向客户端发送数据时阻塞,例如发送 NOTICE 消息;在客户端读取这些数据之前,服务器不会读取客户端发送的数据。)当 PQflush 返回 0 后,等待套接字变为可读,再按前述方法读取响应。
+
@@ -3259,7 +3290,7 @@ int PQrequestCancel(PGconn *conn);
快速路径接口
- fast path
+ 快速路径
@@ -3295,21 +3326,22 @@ typedef struct
- fnid 参数是要被执行的函数的 OID。args 和nargs 定义了要传递给函数的参数;它们必须匹配已声明的函数参数列表。当一个参数结构体的isint 域为真时,u.integer 值被以指定长度(必须是 2 或 4 字节)整数的形式发送给服务器;这时候会发生恰当的字节交换。当isint 为假时,*u.ptr 中指定数量的字节将不做任何处理被发送出去;这些数据必须是服务器 预期的用于该函数参数数据类型的二进制传输的格式(由于历史原因u.ptr 被声明为类型int * ,其实把它考虑成void * 会更好)。result_buf 是放置该函数返回值的缓冲区。调用者必须已经分配了足够的空间来存储返回值(这里没有检查!)。实际的结果长度将被放在result_len 指向的整数中返回。如果预期结果是 2 或 4 字节整数,把result_is_int 设为 1;否则设为 0。把result_is_int 设为 1 导致libpq 在必要时对值进行交换字节,这样它就作为对客户端机器正确的int 值被传输,注意对任一种允许的结果大小都会传递一个 4 字节整数到*result_buf 。当result_is_int 是 0 时,服务器发送的二进制格式字节将不做修改直接返回(在这种情况下,把result_buf 考虑为类型void * 更好)。
-
+ fnid 参数是要执行函数的 OID。args 和 nargs 指定传给函数的参数,必须与函数声明中的参数列表匹配。参数结构体的 isint 字段为真时,u.integer 值会以指定长度的整数发送到服务器,该长度必须是 2 或 4 字节,并会进行适当的字节序转换。isint 为假时,位于 *u.ptr 的指定数量字节会原样发送;数据必须符合服务器对该函数参数数据类型的二进制传输格式要求。(将 u.ptr 声明为 int * 是历史原因;将其视为 void * 更合适。)result_buf 指向用于存放函数返回值的缓冲区。调用者必须事先分配足够空间来保存返回值,这里不会检查!实际结果长度以字节为单位,返回到 result_len 指向的整数中。如果预期结果是 2 或 4 字节整数,将 result_is_int 设为 1,否则设为 0。将 result_is_int 设为 1 后,libpq 会按需转换字节序,使结果成为适合客户端机器的 int 值;注意,无论是哪种允许的结果大小,传入 *result_buf 的都是 4 字节整数。result_is_int 为 0 时,服务器发送的二进制格式字节串会原样返回。(此时,将 result_buf 视为 void * 更合适。)
+
- PQfn 总是返回一个有效的PGresult 指针,成功时状态为PGRES_COMMAND_OK ,遇到问题时为PGRES_FATAL_ERROR 。
- 在使用结果之前应该检查结果状态。
- 当结果不再使用后,调用者有义务使用PQclear 释放PGresult 。
-
+ PQfn 总是返回有效的 PGresult 指针:成功时状态为 PGRES_COMMAND_OK ,遇到问题时为 PGRES_FATAL_ERROR 。使用结果前应检查其状态。不再需要结果时,调用者负责使用 PQclear 释放 PGresult 。
+
- 要传递NULL参数到函数,将参数结构体的len 字段设置为-1 ;isint 和 u 字段就不相关了。(但这仅适用于使用协议 3.0 及更高版本的连接。)
+ 要向函数传入 NULL 参数,将该参数结构体的 len 字段设为 -1 ;此时,isint 和 u 字段便不再相关。(但这仅适用于使用协议 3.0 及更高版本的连接。)
+
如果函数返回 NULL,则将 *result_len 设为 -1 ,而不修改 *result_buf 。(这仅适用于使用协议 3.0 及更高版本的连接;在协议 2.0 中,既不修改 *result_len ,也不修改 *result_buf 。)
- 注意,使用此接口时无法处理集合值结果。此外,函数必须是普通函数,不能是聚合函数或窗口函数。
+
+ 注意,使用此接口时无法处理集合值结果。此外,函数必须是普通函数,不能是聚合函数或窗口函数。
+
@@ -3318,7 +3350,7 @@ typedef struct
NOTIFY
- in libpq
+ 在 libpq 中
@@ -3327,32 +3359,36 @@ typedef struct
libpq 应用把LISTEN 、UNLISTEN 和NOTIFY 命令作为普通 SQL 命令提交。
- 随后通过调用PQnotifies .PQnotifies>>来检测NOTIFY 消息的到达。
+ 随后通过调用PQnotifies PQnotifies>>来检测NOTIFY 消息的到达。
- 函数PQnotifies 从已收到但尚未处理的服务器通知消息列表中返回下一条通知。如果没有待处理的通知,则返回空指针。一旦通知由PQnotifies 返回,就被视为已处理,并从通知列表中移除。
+
+ 函数 PQnotifies 从已收到但尚未处理的服务器通知消息列表中返回下一条通知。没有待处理通知时返回空指针。一旦 PQnotifies 返回一条通知,该通知就被视为已处理,并从通知列表中移除。
+
PGnotify *PQnotifies(PGconn *conn);
typedef struct pgNotify
{
- char *relname; /* notification channel name */
- int be_pid; /* process ID of notifying server process */
- char *extra; /* notification payload string */
+ char *relname; /* 通知通道名称 */
+ int be_pid; /* 发送通知的服务器进程 ID */
+ char *extra; /* 通知载荷字符串 */
} PGnotify;
- 处理完一个PGnotify 对象(由PQnotifies 返回)后,一定要用PQfreemem 释放它。只需释放PGnotify 指针;relname 和extra 字段并非独立分配。(这些字段名称是历史遗留的;尤其是,通道名称与关系名称不必有任何关联。)
+
+处理完 PQnotifies 返回的 PGnotify 对象后,务必使用 PQfreemem 释放它。只需释放 PGnotify 指针;relname 和 extra 字段并非独立分配。(这些字段名称是历史遗留的;尤其是,通道名称与关系名称不必有任何关联。)
+
给出了一个示例程序展示异步通知的使用。
- PQnotifies 实际上并不从服务器读取数据;它只是返回之前已被其他libpq 函数吸收的消息。
+ PQnotifies 实际上并不从服务器读取数据;它只是返回之前已被其他libpq 函数读取的消息。
在较早版本的libpq 中,及时收到NOTIFY 消息的唯一方法是不断提交命令,哪怕是空命令,然后在每次PQexec 后检查PQnotifies 。
- 虽然这种方法仍然有效,但由于效率过低,现已废弃。
+ 虽然这种方法仍然有效,但由于浪费处理能力,现已弃用。
- 当你没有可用的命令提交时,一种更好的检查NOTIFY 消息的方法是调用PQconsumeInput ,然后检查PQnotifies 。
+ 当没有需要执行的实际命令时,一种更好的检查NOTIFY 消息的方法是调用PQconsumeInput ,然后检查PQnotifies 。
你可以使用select() 等待服务器数据到达,这样在无事可做时就不会浪费CPU 资源(参见PQsocket 以获得可传给select() 的文件描述符)。
注意不管是用PQsendQuery /PQgetResult 提交命令还是简单地使用PQexec ,这种方法都能正常工作。
不过,你应该记住在每次PQgetResult 或 PQexec 之后检查PQnotifies ,看看在命令的处理过程中是否有通知到达。
@@ -3365,20 +3401,16 @@ typedef struct pgNotify
COPY
- with libpq
+ 使用 libpq
- PostgreSQL 中的COPY 命令有用于libpq 的对网络连接读出或者写入的选项。这一节描述的函数允许应用通过提供或者消耗已拷贝的数据来充分利用这个功能。
-
+ PostgreSQL 的 COPY 命令提供了选项,可以通过 libpq 使用的网络连接读取或写入数据。本节介绍的函数允许应用程序通过提供或接收复制数据来使用这一能力。
+
- 整个处理是应用首先通过PQexec 或者一个等效的函数发出 SQL COPY 命令。
- 对这个命令的响应(如果命令无误)将是一个状态代码是PGRES_COPY_OUT 或 者PGRES_COPY_IN (取决于指定的拷贝方向)的PGresult 对象。
- 应用然后就应该使用这一节的函数接收或者传送数据行。在数据传输结束之后,另外一个PGresult 对象会被返回以表明传输的成功或者失败。
- 它的状态将是:PGRES_COMMAND_OK 表示成功,PGRES_FATAL_ERROR 表示发生了一些问题。
- 此时我们可以通过PQexec 发出进一步的 SQL 命令(在COPY 操作的处理过程中,不能用同一个连接执行其它 SQL 命令)。
-
+ 整体流程如下:应用程序先通过 PQexec 或等效函数发出 SQL COPY 命令。如果命令没有错误,响应就是一个 PGresult 对象,其状态码为 PGRES_COPY_OUT 或 PGRES_COPY_IN ,取决于指定的复制方向。应用程序随后应使用本节函数接收或发送数据行。数据传输完成后,会返回另一个 PGresult 对象,表示传输成功或失败:成功时状态为 PGRES_COMMAND_OK ,出现问题时为 PGRES_FATAL_ERROR 。此时可以通过 PQexec 继续发出 SQL 命令。(COPY 操作进行期间,不能在同一连接上执行其他 SQL 命令。)
+
如果一个COPY 命令是通过PQexec 在一个可能包含额外命令的字符串中发出的,那么应用在完成COPY 序列之后必须继续用PQgetResult 取得结果。
@@ -3386,12 +3418,14 @@ typedef struct pgNotify
- 这一节的函数应该只在从PQexec 或 PQgetResult 获得了PGRES_COPY_OUT 或PGRES_COPY_IN 结果状态后执行。
-
+ 只有从 PQexec 或 PQgetResult 获得 PGRES_COPY_OUT 或 PGRES_COPY_IN 结果状态后,才应调用本节函数。
+
- 一个PGresult 对象若带有上述某个状态值,还会携带关于即将开始的COPY 操作的附加数据。这些数据可以通过下列函数取得,这些函数也用于查询结果:
+
+ 带有上述某个状态值的 PGresult 对象,还会携带关于即将开始的 COPY 操作的附加数据。这些数据可以通过下列函数获取,这些函数也用于查询结果:
+
- PQnfields PQnfields with COPY
+ PQnfields PQnfields 用于 COPY
@@ -3401,7 +3435,7 @@ typedef struct pgNotify
- PQbinaryTuples PQbinaryTuples with COPY
+ PQbinaryTuples PQbinaryTuples 用于 COPY
@@ -3412,7 +3446,7 @@ typedef struct pgNotify
- PQfformat PQfformat with COPY
+ PQfformat PQfformat 用于 COPY
@@ -3424,7 +3458,7 @@ typedef struct pgNotify
-
+
这些附加数据值仅在使用协议 3.0 时可用。使用协议 2.0 时,这些函数都返回 0。
@@ -3434,8 +3468,8 @@ typedef struct pgNotify
用于发送COPY 数据的函数
- 这些函数用于在COPY FROM STDIN 期间发送数据。如果在连接不是COPY_IN 状态,调用它们会失败。
-
+ 这些函数用于在 COPY FROM STDIN 期间发送数据。如果连接不处于 COPY_IN 状态,调用它们会失败。
+
@@ -3452,12 +3486,11 @@ int PQputCopyData(PGconn *conn,
- 传输指定buffer 中长度为nbytes 的COPY 数据到服务器。
- 如果数据被放在队列中,结果是 1;如果因为缓冲区满而无法被放在队列中(只可能发生在连接是非阻塞模式时),那么结果是零;如果发生错误,结果为 -1(如果返回值为 -1,那么使用PQerrorMessage 检索细节。如果值是零,那么等待写准备好然后重试)。
+ 将指定 buffer 中长度为 nbytes 的 COPY 数据传输到服务器。数据成功加入队列时返回 1;因缓冲区已满而无法加入队列时返回零(仅可能发生在非阻塞模式下);发生错误时返回 -1。(返回 -1 时,可用 PQerrorMessage 获取详细信息。返回零时,应等待可写就绪后重试。)
- 应用可以把COPY 数据流划分成任意方便的大小放到缓冲区中。在发送时,缓冲区载荷的边界没有什么语意。数据流的内容必须匹配COPY 命令预期的数据格式;详见。
+ 应用程序可以将 COPY 数据流分成任意方便大小的数据块,逐块装入缓冲区。发送时,这些数据块的边界没有语义含义。数据流内容必须符合 COPY 命令预期的数据格式;详见 。
@@ -3474,13 +3507,16 @@ int PQputCopyEnd(PGconn *conn,
- 如果 errormsg 为 NULL ,则成功结束 COPY_IN 操作。如果 errormsg 不为 NULL ,则强制 COPY 失败,并将 errormsg 指向的字符串用作错误消息。(但不应假定服务器一定会返回这条完全相同的错误消息,因为服务器可能已经因自身原因使 COPY 失败。还要注意,在使用 3.0 之前协议的连接上,强制失败选项不起作用。)
+
+ 如果 errormsg 为 NULL ,则成功结束 COPY_IN 操作。如果 errormsg 不为 NULL ,则强制 COPY 失败,并将 errormsg 指向的字符串用作错误消息。(但不应假定服务器一定会返回这条完全相同的错误消息,因为服务器可能已经因自身原因使 COPY 失败。还要注意,在使用 3.0 之前协议的连接上,强制失败选项不起作用。)
+
- 如果终止消息被发送,则结果为 1;在非阻塞模式中,结果为 1 也可能只表示终止消息被成功地放在了发送队列中 (在非阻塞模式中,要确认数据确实被发送出去,你应该接着等待写准备好并且调用PQflush ,重复这些直到返回零)。 零表示该函数由于缓冲区满而无法将该终止消息放在队列中,这只会发生在非阻塞模式中(在这种情况下,等待写准备好并且再次尝试PQputCopyEnd 调用)。 如果发生系统错误,则返回 -1,可以使用PQerrorMessage 检索详情。
+
+ 终止消息已发送时返回 1;在非阻塞模式下,返回 1 也可能仅表示该消息已成功加入发送队列。(在非阻塞模式下,要确认数据已经发送,应接着等待可写就绪并调用 PQflush ,反复执行直到返回零。)返回零表示缓冲区已满,无法将终止消息加入队列;这种情况仅可能发生在非阻塞模式下。(此时,应等待可写就绪,再次调用 PQputCopyEnd 。)发生严重错误时返回 -1,可用 PQerrorMessage 获取详细信息。
+
- 在成功调用PQputCopyEnd 之后,调用PQgetResult 获取COPY 命令的最终结果状态。
- 我们可以用平常的方法来等待这个结果可用。然后返回到正常的操作。
+ 成功调用 PQputCopyEnd 后,调用 PQgetResult 获取 COPY 命令的最终结果状态。可以按通常方式等待该结果就绪,然后恢复正常操作。
@@ -3510,24 +3546,19 @@ int PQgetCopyData(PGconn *conn,
- 在一个COPY 期间尝试从服务器获取另外一行数据。数据总是以每次一个数据行的方式被返回;如果只有一个部分行可用,那么它不会被返回。
- 成功返回一个数据行涉及到分配一块内存来保存该数据。buffer 参数必须为非NULL 。
- *buffer 被设置为指向分配到的内存的指针,或者是在没有返回缓冲区的情况下指向NULL 。
- 一个非NULL 的结果缓冲区在不需要时必须用PQfreemem 释放。
+ 在 COPY 期间尝试从服务器获取下一行数据。每次总是返回一个完整数据行;如果只有部分行可用,则不返回。成功返回数据行时,会分配一块内存保存数据。buffer 参数必须为非 NULL 。*buffer 会被设置为指向所分配的内存;如果没有返回缓冲区,则设为 NULL 。非 NULL 的结果缓冲区在不再需要时应使用 PQfreemem 释放。
- 在成功返回一行之后,返回的值就是该数据行里数据的字节数(将是大于零)。
- 被返回的字符串总是以零字节结尾,虽然这可能只是对文本COPY 有用。
- 一个零结果表示该COPY 仍然在处理中,但是还没有可用的行(只在async 为真时才可能)。
- 一个 -1 结果表示COPY 已经完成。-2 结果表示发生了错误(参考PQerrorMessage 获取原因)。
+ 成功返回一行时,返回值是该行的数据字节数,始终大于零。返回的字符串总是以零字节结尾,不过这可能仅对文本 COPY 有用。返回零表示 COPY 仍在进行,但尚无可用行(仅在 async 为真时可能发生)。返回 -1 表示 COPY 已完成;返回 -2 表示发生了错误(可用 PQerrorMessage 查看原因)。
- 当 async 为真(非零)时,PQgetCopyData 不会阻塞等待输入;如果 COPY 仍在进行,但没有完整的行可用,则返回零。(这种情况下,应等待读就绪,随后先调用 PQconsumeInput ,再调用 PQgetCopyData 。)当 async 为假(零)时,PQgetCopyData 会阻塞,直到有数据可用或操作完成。
+
+ 当 async 为真(非零)时,PQgetCopyData 不会阻塞等待输入;如果 COPY 仍在进行,但没有完整行可用,则返回零。(此时,应等待读就绪,先调用 PQconsumeInput ,再调用 PQgetCopyData 。)当 async 为假(零)时,PQgetCopyData 会阻塞,直到数据可用或操作完成。
+
- 在PQgetCopyData 返回 -1 之后,调用PQgetResult 获取COPY 命令的最后结果状态。
- 我们可以用平常的方法来等待这个结果可用。然后返回到正常的操作。
+ 在 PQgetCopyData 返回 -1 后,调用 PQgetResult 获取 COPY 命令的最终结果状态。可以按通常方式等待该结果就绪,然后恢复正常操作。
@@ -3536,11 +3567,11 @@ int PQgetCopyData(PGconn *conn,
- 用于COPY 的废弃函数
+ 用于COPY 的过时函数
- 这些函数代表了以前的处理COPY 的方法。尽管它们还能用,但是现在已经被废弃,因为它们的错误处理很糟糕、检测结束数据的方法也不方便,并且缺少对二进制或非阻塞传输的支持。
-
+ 这些函数使用较旧的方式处理 COPY 。虽然仍然可用,但由于错误处理欠佳、检测数据结束的方式不便,而且缺少对二进制或非阻塞传输的支持,已被弃用。
+
@@ -3548,7 +3579,7 @@ int PQgetCopyData(PGconn *conn,
- 读取一个以新行终止的字符行到(由服务器传输) 到一个长度为length 的字符串缓冲区。
+ 将服务器传来的、以换行符结尾的一行字符读入大小为 length 的字符串缓冲区。
int PQgetline(PGconn *conn,
char *buffer,
@@ -3557,11 +3588,10 @@ int PQgetline(PGconn *conn,
- 这个函数拷贝最多length -1 个字符到该缓冲区中,并且把终止的新行转换成一个零字节。
- PQgetline 在输入结束时返回EOF ,如果整行都被读取则返回 0,如果缓冲区填满了而还没有遇到结束的新行则返回 1。
-
+ 此函数最多将 length -1 个字符复制到缓冲区,并将末尾的换行符转换为零字节。PQgetline 在输入结束时返回 EOF ,读完一整行时返回 0,缓冲区已满但尚未读到末尾换行符时返回 1。
+
- 注意,应用必须检查是否一个新行包含两个字符\. ,这表明服务器 已经完成了COPY 命令的结果发送。如果应用可能收到超过length -1 字符长的行, 我们就应该确保正确识别\. 行(例如,不要把一个长数据行的结束当作一个终止行)。
+ 注意,应用程序必须检查新读入的一行是否仅由 \. 两个字符组成,这表示服务器已发送完 COPY 命令的结果。如果可能收到长度超过 length -1 个字符的行,必须确保正确识别 \. 行,例如不能把长数据行的末尾误当作终止行。
@@ -3571,7 +3601,7 @@ int PQgetline(PGconn *conn,
- 不阻塞地读取一行COPY 数据(由服务器传输)到一个缓冲区中。
+ 以非阻塞方式将服务器传来的一行 COPY 数据读入缓冲区。
int PQgetlineAsync(PGconn *conn,
char *buffer,
@@ -3580,22 +3610,18 @@ int PQgetlineAsync(PGconn *conn,
- 这个函数类似于PQgetline ,但是可以被用于那些必须异步读取COPY 数据的应用, 也就是不阻塞的应用。
- 在发出了COPY 命令并得到了PGRES_COPY_OUT 响应之后,
- 应用应该调用PQconsumeInput 和 PQgetlineAsync 直到检测到结束数据的信号。
-
+ 此函数类似于 PQgetline ,但可用于必须异步读取 COPY 数据的应用程序,即读取时不阻塞。发出 COPY 命令并收到 PGRES_COPY_OUT 响应后,应用程序应调用 PQconsumeInput 和 PQgetlineAsync ,直到检测到数据结束信号。
+
- 不像PQgetline ,这个函数负责检测结束数据。
+ 与 PQgetline 不同,此函数会负责检测数据结束。
- 在每次调用时,如果libpq 的输入缓冲区中有一个完整的数据行可用,PQgetlineAsync 都将返回数据。
- 否则,在剩余行到达之前不会返回数据。如果识别到拷贝数据结束的标志,此函数返回 -1;如果没有可用数据则返回 0;
- 或者返回一个正数,表示返回的数据字节数。如果返回 -1,调用者下一步必须调用PQendcopy ,然后回到正常处理。
+ 每次调用时,如果 libpq 的输入缓冲区中有完整数据行,PQgetlineAsync 就会返回数据;否则,要等该行剩余部分到达后才返回数据。识别到复制数据结束标记时返回 -1,没有可用数据时返回 0,否则返回正数,表示返回的数据字节数。返回 -1 后,调用者必须接着调用 PQendcopy ,然后恢复正常处理。
- 返回的数据将不超过一个数据行的范围。如果可能,每次将返回一个完整行。但如果调用者提供的缓冲区太小不足以容下服务器发送的行,那么将返回部分行。对于文本数据,这可以通过测试返回的最后一个字节是否\n 来检测(在二进制COPY 中, 需要对COPY 数据格式进行实际的分析,以便做相同的判断)。被返回的字符串不是空结尾的(如果你想增加一个终止空,确保传递一个比实际可用空间少一字节的bufsize )。
+ 返回的数据不会跨越数据行边界。只要可能,每次就返回一整行;但如果调用者提供的缓冲区太小,容不下服务器发送的一行,则只返回部分行。对于文本数据,可检查最后返回的字节是否为 \n ,以判断是否返回了完整行。(对于二进制 COPY ,则必须实际解析 COPY 数据格式才能作出相同判断。)返回的字符串不以零字节结尾。(如果要自行添加末尾的零字节,务必将传入的 bufsize 设置为比实际可用空间少一字节。)
@@ -3605,7 +3631,7 @@ int PQgetlineAsync(PGconn *conn,
- 向服务器发送一个空终止的字符串。如果 OK 则返回 0;如果不能发送字符串则返回EOF 。
+ 向服务器发送以零字节结尾的字符串。成功时返回 0,无法发送字符串时返回 EOF 。
int PQputline(PGconn *conn,
const char *string);
@@ -3613,16 +3639,13 @@ int PQputline(PGconn *conn,
- 一系列PQputline 调用发送的COPY 数据流和PQgetlineAsync 返回的数据具有相同的格式,
- 只是应用不需要每次PQputline 调用中发送刚好一个数据行;在每次调用中发送多行或者部分行都是可以的。
+ 连续调用 PQputline 发送的 COPY 数据流,与 PQgetlineAsync 返回的数据格式相同。不过,应用程序不必在每次 PQputline 调用中恰好发送一个数据行;每次发送部分行或多行也可以。
- 在PostgreSQL 协议 3.0 之前,应用必须显式地发送两个字符\. 作为最后一行来告知服务器应用程序已完成发送COPY 数据。
- 虽然这么做仍然有效,但是它已经被废弃并且\. 的特殊含义可能在将来的版本中删除。
- 在发送完实际数据之后, 调用PQendcopy 就足够了。
-
+ 在 PostgreSQL 协议 3.0 之前,应用程序必须显式发送由 \. 两个字符组成的最后一行,告知服务器应用程序已发送完 COPY 数据。虽然这种方式仍然有效,但已被弃用,\. 的特殊含义预计会在未来版本中移除。发送完实际数据后,调用 PQendcopy 即可。
+
@@ -3632,7 +3655,7 @@ int PQputline(PGconn *conn,
- 向服务器发送一个非空终止的字符串。如果 OK 则返回 0,如果不能发送字符串则返回EOF 。
+ 向服务器发送不以零字节结尾的字符串。成功时返回 0,无法发送字符串时返回 EOF 。
int PQputnbytes(PGconn *conn,
const char *buffer,
@@ -3641,7 +3664,7 @@ int PQputnbytes(PGconn *conn,
- 这个函数类似PQputline ,除了数据缓冲区不需要以零字节结尾,因为要发送的字节数是直接指定的。在发送二进制数据时使用这个函数。
+ 此函数与 PQputline 完全相同,只是直接指定了要发送的字节数,因此数据缓冲区不必以零字节结尾。发送二进制数据时可使用此函数。
@@ -3650,15 +3673,16 @@ int PQputnbytes(PGconn *conn,
PQendcopy PQendcopy
- 与服务器同步。
+
+ 与服务器同步。
+
int PQendcopy(PGconn *conn);
- 此函数会等待服务器完成复制。调用时机应为:使用PQputline 向服务器发送最后一个字符串后,或者使用PQgetline 从服务器收到最后一个字符串后。必须调用此函数,否则服务器与客户端将会不同步
。此函数返回后,服务器便准备好接收下一条 SQL 命令。成功完成时返回 0,否则返回非零值。(若返回非零值,可使用PQerrorMessage 取得详细信息。)
+
+此函数会等待服务器完成复制。应在使用 PQputline 向服务器发送最后一个字符串后,或使用 PQgetline 从服务器接收最后一个字符串后调用它。必须调用此函数,否则服务器与客户端会失去同步
。函数返回后,服务器便准备好接收下一条 SQL 命令。成功完成时返回 0,否则返回非零值。(返回非零值时,可用 PQerrorMessage 获取详细信息。)
+
- 在使用PQgetResult 时,应用应该通过反复调用PQgetline 并且在看到终止行后调用PQendcopy 来响应PGRES_COPY_OUT 结果。
- 然后它应该返回到PQgetResult 循环直到PQgetResult 返回一个空指针。
- 类似地,PGRES_COPY_IN 结果会用一系列PQputline 加上之后的PQendcopy 来处理,然后返回到PQgetResult 循环。
- 这样的安排将保证嵌入到一系列SQL 命令中的COPY 命令将被正确执行。
+ 使用 PQgetResult 时,收到 PGRES_COPY_OUT 结果后,应用程序应反复调用 PQgetline ,并在看到终止行后调用 PQendcopy 。随后应回到 PQgetResult 循环,直到 PQgetResult 返回空指针。类似地,收到 PGRES_COPY_IN 结果后,应连续调用 PQputline ,再调用 PQendcopy ,然后回到 PQgetResult 循环。这样可以保证嵌在一系列 SQL 命令中的 COPY 命令正确执行。
@@ -3677,8 +3701,8 @@ int PQendcopy(PGconn *conn);
控制函数
- 这些函数控制libpq 行为各种各样的细节。
-
+ 这些函数控制 libpq 行为的各种细节。
+
@@ -3687,17 +3711,15 @@ int PQendcopy(PGconn *conn);
- 返回客户端编码。
+ 返回客户端编码。
int PQclientEncoding(const PGconn *conn );
-
- 请注意,它返回的是编码 ID,而不是一个符号串字符串,如EUC_JP 。如果不成功,它会返回 -1。要把一个编码 ID 转换为为一个编码名称,可以用:
-
+注意,返回的是编码 ID,而不是 EUC_JP 这样的符号字符串。失败时返回 -1。要将编码 ID 转换为编码名称,可以使用:
char *pg_encoding_to_char(int encoding_id );
-
+
@@ -3759,16 +3781,16 @@ PGContextVisibility PQsetErrorContextVisibility(PGconn *conn, PGContextVisibilit
- 启用对客户端/服务器通讯的跟踪,把跟踪信息输出到一个调试文件流中。
+ 启用客户端/服务器通信跟踪,将跟踪信息写入调试文件流。
void PQtrace(PGconn *conn, FILE *stream);
-
+
- 在 Windows上,如果libpq 库和应用使用了不同的标志编译,那么这个函数调用会导致应用崩溃,因为FILE 指针的内部表达是不一样的。特别是多线程/单线程、发布/调试 以及静态/动态标志应该是库和所有使用库的应用都一致。
+ 在 Windows 上,如果 libpq 库与应用程序使用不同的标志编译,调用此函数会导致应用程序崩溃,因为 FILE 指针的内部表示不同。具体而言,库与所有使用它的应用程序都应使用相同的多线程/单线程、发布/调试和静态/动态标志。
@@ -3779,11 +3801,12 @@ void PQtrace(PGconn *conn, FILE *stream);
PQuntrace PQuntrace
- 禁用以下函数启动的跟踪:PQtrace 。
+
+ 禁用由 PQtrace 启动的跟踪。
void PQuntrace(PGconn *conn);
-
+
@@ -3810,11 +3833,8 @@ void PQfreemem(void *ptr);
- 释放libpq 分配的内存,尤其是PQescapeByteaConn ,PQescapeBytea ,PQunescapeBytea ,和PQnotifies 分配的内存。
- 特别重要的是,在微软 Windows 上使用这个函数,而不是free() 。
- 这是因为只有 当 DLL 和应用的多线程/单线程、发布/调试以及静态/动态标志相同时,才能在一个 DLL 中分配内存并且在应用中释放它。
- 在非微软 Windows 平台上,这个函数与标准库函数free() 相同。
-
+ 释放 libpq 分配的内存,特别是 PQescapeByteaConn 、PQescapeBytea 、PQunescapeBytea 和 PQnotifies 分配的内存。在 Microsoft Windows 上,务必使用此函数,而不是 free() 。这是因为只有 DLL 与应用程序使用相同的多线程/单线程、发布/调试和静态/动态标志,才能在 DLL 中分配内存并在应用程序中释放它。在 Microsoft Windows 以外的平台上,此函数与标准库函数 free() 相同。
+
@@ -3822,7 +3842,8 @@ void PQfreemem(void *ptr);
PQconninfoFree PQconninfoFree
- 释放以下函数分配的数据结构:PQconndefaults 或PQconninfoParse 。
+
+ 释放PQconndefaults 或 PQconninfoParse 分配的数据结构。
void PQconninfoFree(PQconninfoOption *connOptions);
@@ -3866,10 +3887,13 @@ char *PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user,
PQencryptPassword PQencryptPassword
- 准备经过 md5 加密的PostgreSQL 密码。
+
+ 准备一个PostgreSQL 密码的md5加密形式。
+
char *PQencryptPassword(const char *passwd, const char *user);
- PQencryptPassword 是以下函数的旧版本,现已弃用:PQencryptPasswordConn 。区别在于PQencryptPassword 不需要连接对象,并且md5 始终用作加密算法。
+ PQencryptPassword 是PQencryptPasswordConn 的旧版本,现已弃用。其差别是PQencryptPassword 不需要连接对象,并且总是用md5 作为加密算法。
+
@@ -3888,8 +3912,8 @@ PGresult *PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);
这是libpq 内部用于分配并初始化一个空PGresult 对象的函数。
如果无法分配内存,此函数返回NULL 。
将它导出供外部调用,是因为一些应用需要自行生成结果对象,特别是带有错误状态的对象。
- 如果conn 非空,并且status 表示错误,指定连接的当前错误消息会被复制到PGresult 中。
- 此外,如果conn 非空,连接中注册的所有事件过程也会被复制到PGresult 中。
+ 如果conn 不为 null,并且status 表示错误,指定连接的当前错误消息会被复制到PGresult 中。
+ 此外,如果conn 不为 null,连接中注册的所有事件过程也会被复制到PGresult 中。
(这些过程不会收到PGEVT_RESULTCREATE 调用,但可参见PQfireResultCreateEvents 。)
注意,最终应对该对象调用PQclear ,就像处理libpq 自身返回的PGresult 一样。
@@ -3908,16 +3932,16 @@ int PQfireResultCreateEvents(PGconn *conn, PGresult *res);
- conn 参数被传送给事件过程,但不会被直接使用。如果事件过程不使用它,则会返回NULL 。
-
+ conn 参数会传递给事件过程,但此函数不会直接使用它。如果事件过程不使用此参数,则可以传入 NULL 。
+
已经接收到这个对象的PGEVT_RESULTCREATE 或PGEVT_RESULTCOPY 事件的事件过程不会被再次触发。
- 这个函数与PQmakeEmptyPGresult 分开的主要原因是在调用事件过程之前创建一个PGresult 并且填充它常常是合适的。
-
+ 此函数与 PQmakeEmptyPGresult 分开的主要原因是,通常适合先创建 PGresult 并填充数据,然后再调用事件过程。
+
@@ -3925,10 +3949,12 @@ int PQfireResultCreateEvents(PGconn *conn, PGresult *res);
PQcopyResult PQcopyResult
- 创建一个PGresult 对象的副本。副本与源结果没有任何关联,并且PQclear 必须在不再需要该副本时调用。如果函数失败,会返回NULL 。
+
+ 创建 PGresult 对象的副本。副本与源结果没有任何关联,不再需要副本时必须调用 PQclear 。函数失败时返回 NULL 。
+
PGresult *PQcopyResult(const PGresult *src, int flags);
-
+
这不是为了制作一个精确的副本。返回的结果总是放在PGRES_TUPLES_OK 状态中,并且不复制源中的任何错误消息。 (但是会复制命令状态字符串。)flags 参数确定要复制的其他内容。它是几个标志的按位或。 PG_COPYRES_ATTRS 指定复制源结果的属性(列定义)。 PG_COPYRES_TUPLES 指定复制源结果的元组。(这也意味着复制属性。) PG_COPYRES_NOTICEHOOKS 指定复制源结果的通知钩子。 PG_COPYRES_EVENTS 指定复制源结果的事件。(但不复制与源相关的任何实例数据。)
@@ -3957,18 +3983,15 @@ int PQsetResultAttrs(PGresult *res, int numAttributes, PGresAttDesc *attDescs);
- 设置一个PGresult 对象的一个元组域值。
+ 设置 PGresult 对象中某个元组的字段值。
int PQsetvalue(PGresult *res, int tup_num, int field_num, char *value, int len);
-
+
- 这个函数将自动按需增加结果的内部元组数组。但是,tup_num 参数必须小于等于PQntuples ,意味着这个函数对元组数组一次只能增加一个元组。
- 但已存在的任意元组中的任意域可以以任意顺序进行调整。如果field_num 的一个值已经存在,它会被覆盖。
- 如果len 是 -1,或value 是NULL , 该域值会被设置为一个 SQL 空值。
- value 会被复制到结果的私有存储中,因此函数返回后就不再需要了。如果函数失败,返回值是 0。如果函数成功,返回值会是非 0。
-
+ 此函数会根据需要自动扩展结果内部的元组数组。不过,tup_num 参数必须小于或等于 PQntuples ,也就是说,每次只能向元组数组增加一个元组。已有元组的任何字段都可以按任意顺序修改。如果 field_num 指定的位置已有值,该值会被覆盖。如果 len 为 -1 或 value 为 NULL ,则将该字段设置为 SQL null 值。value 会被复制到结果的私有存储中,因此函数返回后就不再需要它。函数失败时返回零,成功时返回非零值。
+
@@ -3985,8 +4008,8 @@ void *PQresultAlloc(PGresult *res, size_t nBytes);
- 当res 被清除时,这个函数分配的内存也会被释放掉。如果函数失败,返回值是NULL 。结果被保证为按照数据的任意类型充分地对齐,正如malloc 所作的。
-
+ 使用此函数分配的所有内存都会在清除 res 时释放。函数失败时返回 NULL 。与 malloc 一样,返回的内存保证满足任意数据类型的对齐要求。
+
@@ -4002,28 +4025,25 @@ int PQlibVersion(void);
- 在运行时,这个函数的结果可以被用来决定在当前已载入的 libpq 版本中特定的功能是否可用。
- 例如,这个函数可以被用来决定哪些选项可以被用于PQconnectdb 。
-
+ 可在运行时根据此函数的结果,判断当前已加载的 libpq 版本是否具有特定功能。例如,可用它判断 PQconnectdb 支持哪些连接选项。
+
- 结果通过将库的主版本号乘以10000再加上次版本号形成。例如,版本10.1将被返回为100001,而版本11.0将被返回为110000。
-
+ 返回值等于库的主版本号乘以 10000 再加上次版本号。例如,版本 10.1 返回 100001,版本 11.0 返回 110000。
+
- 在主版本10之前,PostgreSQL 采用一种由三个部分组成的版本号,其中前两部分共同表示主版本。
- 对于那些版本,PQlibVersion 为每个部分使用两个数字,例如版本9.1.5将被返回为90105,而版本9.2.0将被返回为90200。
-
+ 在主版本 10 之前,PostgreSQL 使用由三个部分组成的版本号,前两个部分共同表示主版本。对于这些版本,PQlibVersion 用两位数字表示每个部分;例如,版本 9.1.5 返回 90105,版本 9.2.0 返回 90200。
+
- 因此,出于判断特性兼容性的目的,应用应该将PQlibVersion 的结果除以100而不是10000来判断逻辑的主版本号。
- 在所有的发行序列中,只有最后两个数字在次发行(问题修正发行)之间不同。
-
+ 因此,为了判断功能兼容性,应用程序应将 PQlibVersion 的结果除以 100 而非 10000,得到逻辑上的主版本号。在所有版本系列中,次版本(错误修复版本)之间只有最后两位数字不同。
+
- 这个函数出现于PostgreSQL 版本 9.1,因此它不能被用来在早期的版本中检测所需的功能,因为调用它将会创建一个对版本9.1及其后版本的链接依赖。
+ 此函数从 PostgreSQL 9.1 起提供,因而不能用它检测更早版本是否具有所需功能:调用它会建立对 9.1 或更高版本的链接依赖。
@@ -4037,13 +4057,13 @@ int PQlibVersion(void);
通知处理
- notice processing
- in libpq
+ 通知处理
+ 在 libpq 中
- 服务器产生的通知和警告消息不会被查询执行函数返回,因为它们不代表查询失败。它们可以被传递给一个通知处理函数,并且在处理者返回后执行会继续正常进行。默认的处理函数会把消息打印在stderr 上,但是应用可以通过提供它自己的处理函数来重载这种行为。
-
+ 服务器生成的通知和警告消息不由查询执行函数返回,因为它们并不表示查询失败。这些消息会传递给通知处理函数,处理函数返回后,执行正常继续。默认通知处理函数将消息打印到 stderr ,应用程序也可以提供自己的处理函数来替换这一行为。
+
由于历史原因,通知处理有两个级别,称为通知接收器和通知处理器。通知接收器的默认行为是格式化通知并且将一个字符串传递给通知处理器来打印。不过,如果一个应用选择提供自己的通知接收器,它通常会忽略通知处理器层并且在通知接收器中完成所有工作。
@@ -4051,10 +4071,10 @@ int PQlibVersion(void);
函数PQsetNoticeReceiver
- notice receiver>>
+ 通知接收器>>
PQsetNoticeReceiver>>为一个连接对象设置或者检查当前的通知接收器。
相似地,PQsetNoticeProcessor
- notice processor>>
+ 通知处理器>>
PQsetNoticeProcessor>>设置或检查当前的通知处理器。
@@ -4077,19 +4097,16 @@ PQsetNoticeProcessor(PGconn *conn,
- 当接收到一个服务器产生的或者libpq 内部产生的通知或警告消息,通知接收器函数会被调用。
- 该函数会以一种PGRES_NONFATAL_ERROR PGresult 的形式接收该消息
- (这允许接收器使用PQresultErrorField 抽取个别的域,或者使用PQresultErrorMessage 或者PQresultVerboseErrorMessage 得到一个完整的预格式化的消息)。
- 被传递给PQsetNoticeReceiver 的同一个 void 指针也被传递(必要时,这个指针可以被用来访问应用相关的状态)。
-
+ 从服务器收到通知或警告消息,或者 libpq 内部生成这类消息时,便会调用通知接收器函数。消息以状态为 PGRES_NONFATAL_ERROR 的 PGresult 对象传给该函数。(接收器可使用 PQresultErrorField 提取单个字段,也可使用 PQresultErrorMessage 或 PQresultVerboseErrorMessage 获取完整的预格式化消息。)传给 PQsetNoticeReceiver 的同一个 void 指针也会传入。(必要时,可通过该指针访问应用程序特有的状态。)
+
默认的通知接收器会简单地抽取消息(使用PQresultErrorMessage )并且将它传递给通知处理器。
- 通知处理器负责处理一个以文本形式给出的通知或警告消息。该消息的字符串文本(包括一个收尾的新行)被传递给通知处理器,外加一个同时被传递给PQsetNoticeProcessor 的空指针(必要时,这个指针可以被用来访问应用相关的状态)。
-
+ 通知处理器负责处理以文本形式提供的通知或警告消息。传给它的参数包括消息字符串(含末尾的换行符),以及先前传给 PQsetNoticeProcessor 的同一个 void 指针。(必要时,可通过该指针访问应用程序特有的状态。)
+
默认的通知处理器很简单:
@@ -4103,9 +4120,8 @@ defaultNoticeProcessor(void *arg, const char *message)
- 一旦你设定了一个通知接收器或处理器,你应该期待只要PGconn 对象或者从它构造出的PGresult 对象存在,该函数就可能被调用。
- 在一个PGresult 创建时,PGconn 的当前通知处理指针被复制到PGresult 中,以备类似PQgetvalue 的函数使用。
-
+ 设置通知接收器或处理器后,应当预期:只要 PGconn 对象或由它生成的 PGresult 对象仍存在,就可能调用该函数。创建 PGresult 时,会将 PGconn 当前的通知处理指针复制到 PGresult 中,供 PQgetvalue 等函数在需要时使用。
+
@@ -4113,10 +4129,10 @@ defaultNoticeProcessor(void *arg, const char *message)
事件系统
- libpq 的事件系统被设计为通知已注册的事件处理器它感兴趣的libpq 事件,例如PGconn 以及PGresult 对象的创建和毁灭。一种主要的使用情况是这允许应用将自己的数据与一个PGconn 或者PGresult 关联在一起,并且确保那些数据在适当的时候被释放。
+ libpq 的事件系统被设计为通知已注册的事件处理器它感兴趣的libpq 事件,例如PGconn 以及PGresult 对象的创建和销毁。一个主要用途是允许应用将自己的数据与一个PGconn 或者PGresult 关联在一起,并且确保那些数据在适当的时候被释放。
- 每个注册的事件处理程序都与两个数据相关联,libpq 仅将其视为不透明的void * 指针。 有一个透传 指针,当事件处理程序与PGconn 注册时,应用程序提供。 透传指针在PGconn 及其生成的所有PGresult 的生命周期内永远不会更改; 因此,如果使用,它必须指向长期存在的数据。 此外,还有一个实例数据 指针,在每个PGconn 和PGresult 中一开始都是NULL 。 可以使用PQinstanceData 、PQsetInstanceData 、 PQresultInstanceData 和PQsetResultInstanceData 函数来操作此指针。 请注意,与透传指针不同,PGconn 的实例数据不会自动继承到从中创建的PGresult 。 libpq 不知道透传和实例数据指针指向的内容(如果有的话),也永远不会尝试释放它们 —— 这是事件处理程序的责任。
+ 每个注册的事件处理程序都与两项数据相关联,libpq 仅将其视为不透明的void * 指针。 有一个透传 指针,由应用程序在向 PGconn 注册事件处理程序时提供。 透传指针在PGconn 及其生成的所有PGresult 的生命周期内永远不会更改; 因此,如果使用,它必须指向长期存在的数据。 此外,还有一个实例数据 指针,在每个PGconn 和PGresult 中一开始都是NULL 。 可以使用PQinstanceData 、PQsetInstanceData 、 PQresultInstanceData 和PQresultSetInstanceData 函数来操作此指针。 请注意,与透传指针不同,PGconn 的实例数据不会自动继承到从中创建的PGresult 。 libpq 不知道透传和实例数据指针指向的内容(如果有的话),也永远不会尝试释放它们 — 这是事件处理程序的责任。
事件类型
@@ -4129,7 +4145,7 @@ defaultNoticeProcessor(void *arg, const char *message)
PGEVT_REGISTER
- 注册事件在PQregisterEventProc 被调用时触发。此时最适合初始化事件处理函数可能需要的instanceData 。每个连接中的每个事件处理函数只会触发一次注册事件。如果事件处理函数失败,则中止注册。
+ 注册事件在PQregisterEventProc 被调用时触发。此时最适合初始化事件过程可能需要的instanceData 。每个连接中的每个事件过程只会触发一次注册事件。如果事件过程失败,则中止注册。
typedef struct
{
PGconn *conn;
@@ -4141,26 +4157,26 @@ typedef struct
PGEVT_CONNRESET
- 连接重置事件会在完成以下调用时触发:PQreset 或PQresetPoll 。在这两种情况下,只有重置成功才会触发该事件。如果事件处理函数失败,整个连接重置就会失败;PGconn 会被置于CONNECTION_BAD 状态,并且PQresetPoll 将返回PGRES_POLLING_FAILED 。
+ 连接重置事件会在完成以下调用时触发:PQreset 或PQresetPoll 。在这两种情况下,只有重置成功才会触发该事件。如果事件过程失败,整个连接重置就会失败;PGconn 会被置于CONNECTION_BAD 状态,并且PQresetPoll 将返回PGRES_POLLING_FAILED 。
typedef struct
{
PGconn *conn;
} PGEventConnReset;
- 收到PGEVT_CONNRESET 事件时,应将evtInfo 指针强制转换为PGEventConnReset * 。虽然其中的PGconn 刚刚被重置,但所有事件数据都保持不变。应利用此事件重置、重新加载或重新查询相关联的instanceData 。注意,即使事件处理函数未能处理PGEVT_CONNRESET ,它仍会在连接关闭时收到PGEVT_CONNDESTROY>事件。
+ 收到PGEVT_CONNRESET 事件时,应将evtInfo 指针强制转换为PGEventConnReset * 。虽然其中的PGconn 刚刚被重置,但所有事件数据都保持不变。应利用此事件重置、重新加载或重新查询相关联的instanceData 。注意,即使事件过程未能处理PGEVT_CONNRESET ,它仍会在连接关闭时收到PGEVT_CONNDESTROY>事件。
PGEVT_CONNDESTROY
- 连接销毁事件由以下调用触发:PQfinish 。事件处理函数负责正确清理其事件数据,因为 libpq 无法管理这部分内存。如果不清理,就会造成内存泄漏。
+ 连接销毁事件由以下调用触发:PQfinish 。事件过程负责正确清理其事件数据,因为 libpq 无法管理这部分内存。如果不清理,就会造成内存泄漏。
typedef struct
{
PGconn *conn;
} PGEventConnDestroy;
- 收到PGEVT_CONNDESTROY 事件时,应将evtInfo 指针强制转换为PGEventConnDestroy * 。该事件触发于以下函数执行任何其他清理工作之前:PQfinish 。事件处理函数的返回值会被忽略,因为无法通过以下函数报告失败:PQfinish 。此外,事件处理函数失败不应中止清理不再使用的内存的过程。
+ 收到PGEVT_CONNDESTROY 事件时,应将evtInfo 指针强制转换为PGEventConnDestroy * 。该事件触发于以下函数执行任何其他清理工作之前:PQfinish 。事件过程的返回值会被忽略,因为无法通过以下函数报告失败:PQfinish 。此外,事件过程失败不应中止清理不再使用的内存的过程。
@@ -4192,32 +4208,32 @@ typedef struct
PGEVT_RESULTCOPY
- 结果复制事件会在调用PQcopyResult 时触发。只有复制完成后才会触发该事件。只有为源结果成功处理过PGEVT_RESULTCREATE 或PGEVT_RESULTCOPY 事件的事件处理函数,才会收到PGEVT_RESULTCOPY 事件。
+ 结果复制事件会在调用PQcopyResult 时触发。只有复制完成后才会触发该事件。只有为源结果成功处理过PGEVT_RESULTCREATE 或PGEVT_RESULTCOPY 事件的事件过程,才会收到PGEVT_RESULTCOPY 事件。
typedef struct
{
const PGresult *src;
PGresult *dest;
} PGEventResultCopy;
- 收到PGEVT_RESULTCOPY 事件时,应将evtInfo 指针强制转换为PGEventResultCopy * 。其中,src 结果是复制源,而dest 结果是复制目标。可以利用此事件对instanceData 进行深复制,因为PQcopyResult 无法完成这项工作。如果事件处理函数失败,整个复制操作就会失败,并且dest 结果将被清除。返回失败代码时,必须完成所有清理工作,因为不会为目标结果发送PGEVT_RESULTDESTROY 事件。
+ 收到PGEVT_RESULTCOPY 事件时,应将evtInfo 指针强制转换为PGEventResultCopy * 。其中,src 结果是复制源,而dest 结果是复制目标。可以利用此事件对instanceData 进行深复制,因为PQcopyResult 无法完成这项工作。如果事件过程失败,整个复制操作就会失败,并且dest 结果将被清除。返回失败代码时,必须完成所有清理工作,因为不会为目标结果发送PGEVT_RESULTDESTROY 事件。
PGEVT_RESULTDESTROY
- 结果销毁事件由以下调用触发:PQclear 。事件处理函数负责正确清理其事件数据,因为 libpq 无法管理这部分内存。如果不清理,就会造成内存泄漏。
+ 结果销毁事件由以下调用触发:PQclear 。事件过程负责正确清理其事件数据,因为 libpq 无法管理这部分内存。如果不清理,就会造成内存泄漏。
typedef struct
{
PGresult *result;
} PGEventResultDestroy;
- 收到PGEVT_RESULTDESTROY 事件时,应将evtInfo 指针强制转换为PGEventResultDestroy * 。该事件触发于以下函数执行任何其他清理工作之前:PQclear 。事件处理函数的返回值会被忽略,因为无法通过以下函数报告失败:PQclear 。此外,事件处理函数失败不应中止清理不再使用的内存的过程。
+ 收到PGEVT_RESULTDESTROY 事件时,应将evtInfo 指针强制转换为PGEventResultDestroy * 。该事件触发于以下函数执行任何其他清理工作之前:PQclear 。事件过程的返回值会被忽略,因为无法通过以下函数报告失败:PQclear 。此外,事件过程失败不应中止清理不再使用的内存的过程。
- 事件回调函数
+ 事件回调过程
@@ -4225,9 +4241,12 @@ typedef struct
- PGEventProc 是通过 typedef 定义的事件处理函数指针类型,也就是接收 libpq 事件的用户回调函数的指针类型。事件处理函数的签名必须为
+ PGEventProc 是通过 typedef 定义的事件过程指针类型,也就是接收 libpq 事件的用户回调函数的指针类型。事件过程的签名必须为:
+
int eventproc(PGEventId evtId, void *evtInfo, void *passThrough)
- 其中,evtId 参数指示发生了哪一种PGEVT 事件。必须将evtInfo 指针强制转换为适当的结构体类型,以获取关于该事件的更多信息。passThrough 参数是在注册事件处理函数时传给以下函数的指针:PQregisterEventProc 。函数应在成功时返回非零值,在失败时返回零。
+
+evtId 参数指示发生了哪一种 PGEVT 事件。必须将 evtInfo 指针强制转换为适当的结构体类型,以获取关于该事件的更多信息。passThrough 参数是在注册事件过程时传给 PQregisterEventProc 的指针。函数应在成功时返回非零值,在失败时返回零。
+
在任何一个PGconn 中,一个特定事件过程只能被注册一次。这是因为该过程的地址被用作查找键来标识相关的实例数据。
@@ -4236,8 +4255,8 @@ int eventproc(PGEventId evtId, void *evtInfo, void *passThrough)
- 在 Windows 上,函数能够有两个不同的地址:一个对 DLL 之外可见而另一个对 DLL 之内可见。我们应当小心只有其中之一会被用于libpq 的事件过程函数,否则将会产生混淆。编写代码的最简单规则是将所有的事件过程声明为static 。如果过程的地址必须对它自己的源代码文件之外可见,提供一个单独的函数来返回该地址。
-
+ 在 Windows 上,函数可能有两个不同的地址:一个在 DLL 外部可见,另一个在 DLL 内部可见。使用 libpq 的事件过程函数时,务必始终使用其中同一个地址,否则会产生混淆。确保代码正常工作的最简单做法,是将事件过程声明为 static 。如果需要在过程所在的源文件之外取得其地址,应提供一个单独的函数来返回该地址。
+
@@ -4263,7 +4282,7 @@ int PQregisterEventProc(PGconn *conn, PGEventProc proc,
- 在每一个你想要接收事件的PGconn 上必须注册一个事件过程。和内存不同,没有限制说一个连接上能注册多少个事件过程。如果该函数成功,它会返回一个非零值。如果它失败,则会返回零。
+ 对于希望接收其事件的每个 PGconn ,都必须注册一次事件过程。一个连接可注册的事件过程数量只受内存限制。函数成功时返回非零值,失败时返回零。
@@ -4303,7 +4322,9 @@ void *PQinstanceData(const PGconn *conn, PGEventProc proc);
PQresultSetInstanceData PQresultSetInstanceData
- 将结果的instanceData (针对proc )设置为data 。成功时返回非零,失败时返回零。(只有当proc 未在结果中正确注册时,才可能失败。)
+
+ 将结果中针对 proc 的 instanceData 设置为 data 。成功时返回非零值,失败时返回零。(只有当 proc 未在结果中正确注册时,才可能失败。)
+
int PQresultSetInstanceData(PGresult *res, PGEventProc proc, void *data);
@@ -4327,18 +4348,18 @@ void *PQresultInstanceData(const PGresult *res, PGEventProc proc);
- 事件实例
+ 事件示例
- 这里是一个管理与 libpq 连接和结果相关的私有数据的示例的框架。
-
+ 下面给出一个示例框架,用于管理与 libpq 连接和结果关联的私有数据。
+
-/* The instanceData */
+/* instanceData 数据 */
typedef struct
{
int n;
@@ -4364,8 +4385,8 @@ main(void)
return 1;
}
- /* called once on any connection that should receive events.
- * Sends a PGEVT_REGISTER to myEventProc.
+ /* 在每个需要接收事件的连接上调用一次。
+ * 向 myEventProc 发送 PGEVT_REGISTER 事件。
*/
if (!PQregisterEventProc(conn, myEventProc, "mydata_proc", NULL))
{
@@ -4374,28 +4395,28 @@ main(void)
return 1;
}
- /* conn instanceData is available */
+ /* 可以取得 conn 的 instanceData */
data = PQinstanceData(conn, myEventProc);
- /* Sends a PGEVT_RESULTCREATE to myEventProc */
+ /* 向 myEventProc 发送 PGEVT_RESULTCREATE 事件 */
res = PQexec(conn, "SELECT 1 + 1");
- /* result instanceData is available */
+ /* 可以取得结果的 instanceData */
data = PQresultInstanceData(res, myEventProc);
- /* If PG_COPYRES_EVENTS is used, sends a PGEVT_RESULTCOPY to myEventProc */
+ /* 使用 PG_COPYRES_EVENTS 时,向 myEventProc 发送 PGEVT_RESULTCOPY 事件 */
res_copy = PQcopyResult(res, PG_COPYRES_TUPLES | PG_COPYRES_EVENTS);
- /* result instanceData is available if PG_COPYRES_EVENTS was
- * used during the PQcopyResult call.
+ /* 如果调用 PQcopyResult 时使用了 PG_COPYRES_EVENTS,
+ * 就可以取得结果的 instanceData。
*/
data = PQresultInstanceData(res_copy, myEventProc);
- /* Both clears send a PGEVT_RESULTDESTROY to myEventProc */
+ /* 两次清除操作都会向 myEventProc 发送 PGEVT_RESULTDESTROY 事件 */
PQclear(res);
PQclear(res_copy);
- /* Sends a PGEVT_CONNDESTROY to myEventProc */
+ /* 向 myEventProc 发送 PGEVT_CONNDESTROY 事件 */
PQfinish(conn);
return 0;
@@ -4411,7 +4432,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGEventRegister *e = (PGEventRegister *)evtInfo;
mydata *data = get_mydata(e->conn);
- /* associate app specific data with connection */
+ /* 将应用程序特有的数据与连接关联 */
PQsetInstanceData(e->conn, myEventProc, data);
break;
}
@@ -4431,7 +4452,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGEventConnDestroy *e = (PGEventConnDestroy *)evtInfo;
mydata *data = PQinstanceData(e->conn, myEventProc);
- /* free instance data because the conn is being destroyed */
+ /* 连接正在销毁,因此释放实例数据 */
if (data)
free_mydata(data);
break;
@@ -4443,8 +4464,8 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
mydata *conn_data = PQinstanceData(e->conn, myEventProc);
mydata *res_data = dup_mydata(conn_data);
- /* associate app specific data with result (copy it from conn) */
- PQsetResultInstanceData(e->result, myEventProc, res_data);
+ /* 将应用程序特有的数据与结果关联(从 conn 复制) */
+ PQresultSetInstanceData(e->result, myEventProc, res_data);
break;
}
@@ -4454,8 +4475,8 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
mydata *src_data = PQresultInstanceData(e->src, myEventProc);
mydata *dest_data = dup_mydata(src_data);
- /* associate app specific data with result (copy it from a result) */
- PQsetResultInstanceData(e->dest, myEventProc, dest_data);
+ /* 将应用程序特有的数据与结果关联(从另一个结果复制) */
+ PQresultSetInstanceData(e->dest, myEventProc, dest_data);
break;
}
@@ -4464,18 +4485,18 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGEventResultDestroy *e = (PGEventResultDestroy *)evtInfo;
mydata *data = PQresultInstanceData(e->result, myEventProc);
- /* free instance data because the result is being destroyed */
+ /* 结果正在销毁,因此释放实例数据 */
if (data)
free_mydata(data);
break;
}
- /* unknown event ID, just return TRUE. */
+ /* 未知的事件 ID,直接返回 TRUE。 */
default:
break;
}
- return TRUE; /* event processing succeeded */
+ return TRUE; /* 事件处理成功 */
}
]]>
@@ -4489,7 +4510,9 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
环境变量
- 以下环境变量可用于选择连接参数的默认值,供以下函数使用:PQconnectdb , PQsetdbLogin 和PQsetdb ,前提是调用代码没有直接指定这些参数的值。例如,这样可以避免在简单的客户端应用程序中硬编码数据库连接信息。
+
+ 以下环境变量可用于选择连接参数的默认值,供 PQconnectdb 、PQsetdbLogin 和 PQsetdb 在调用代码未直接指定参数值时使用。例如,这样可以避免在简单的客户端应用程序中硬编码数据库连接信息。
+
@@ -4586,9 +4609,8 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGSERVICEFILE
- PGSERVICEFILE 指定每个用户的连接服务文件的名称
- (参见)。
- 默认为~/.pg_service.conf ,或者在Microsoft Windows上为%APPDATA%\postgresql\.pg_service.conf 。
+ PGSERVICEFILE 指定每个用户的连接服务文件的名称(参见)。
+ 默认为~/.pg_service.conf ,或者在 Microsoft Windows 上为%APPDATA%\postgresql\.pg_service.conf 。
@@ -4633,7 +4655,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGREQUIRESSL 的行为与连接参数相同。
- 这个环境变量已被弃用,推荐使用PGSSLMODE 变量;设置这两个变量会抑制这个变量的效果。
+ 这个环境变量已被弃用,推荐使用PGSSLMODE 变量;同时设置这两个变量时,前者不再生效。
@@ -4760,7 +4782,9 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
- 以下环境变量可用于指定每个PostgreSQL 会话的默认行为。(也可参见和命令,了解按用户或按数据库设置默认行为的方法。)
+
+ 以下环境变量可用于指定每个 PostgreSQL 会话的默认行为。(也可参见 和 命令,了解按用户或按数据库设置默认行为的方法。)
+
@@ -4787,7 +4811,9 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGGEQO 为遗传查询优化器设置默认模式(等同于SET geqo TO ... )。
- 有关这些环境变量的正确取值,请参见SQL 命令。
+
+有关这些环境变量的正确取值,请参见 SQL 命令 。
+
下面的环境变量决定libpq 的内部行为,它们会覆盖编译在程序中的默认值。
@@ -4835,7 +4861,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
(可以复制上面这一行,并在行首加上#>,在文件中加入提示注释。)前四个字段中的每一个都可以是字面值,或者是* ,后者可以匹配任何内容。将使用与当前连接参数匹配的第一行中的密码字段。(因此,使用通配符时,应将更具体的条目放在前面。)如果条目需要包含: 或\ ,请使用\ 转义该字符。主机名字段首先匹配已指定的host 连接参数;否则匹配已指定的hostaddr 参数。如果两者都未指定,则查找主机名localhost 。在以下情况下也会查找主机名localhost :连接使用 Unix 域套接字,且host 参数与libpq 的默认套接字目录路径匹配。在备库中,数据库字段为replication 时,匹配连接到主库的流复制连接。除此之外,数据库字段的用途有限,因为同一用户在同一数据库集簇的所有数据库中使用相同的密码。
- 在 Unix 系统上,密码文件上的权限必须不允许所有人或组内访问,可以用chmod 0600 ~/.pgpass 这样的命令实现。如果权限没有这么严格,该文件将被忽略。在微软 Windows 上,该文件被假定存储在一个安全的目录中,因此不会进行特别的权限检查。
+ 在 Unix 系统上,密码文件的权限必须禁止所属组及其他用户的任何访问;可以用 chmod 0600 ~/.pgpass 这样的命令实现。如果权限没有这么严格,该文件将被忽略。在 Microsoft Windows 上,假定该文件存储在安全的目录中,因此不进行特殊的权限检查。
@@ -4857,10 +4883,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
- 连接服务文件允许 libpq 连接参数与一个单一服务名称关联。
- 那个服务名称可以在一个 libpq 连接字符串里面指定,与其相关的设置将被使用。
- 这允许在不重新编译使用 libpq 的应用的前提下修改连接参数。
- 服务名称也可以被使用PGSERVICE 环境变量来指定。
+ 连接服务文件允许将 libpq 连接参数与单个服务名称关联。随后可以在 libpq 连接字符串中指定该服务名称,从而使用关联的设置。这样便可以修改连接参数,而无需重新编译使用 libpq 的应用程序。也可以使用 PGSERVICE 环境变量指定服务名称。
@@ -4876,23 +4899,19 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
- 或者服务文件使用一种INI 文件
格式,其中小节名是服务名并且参数是连接参数。
- 列表见。例如:
+ 两种服务文件均使用 INI 文件
格式,其中配置段名称是服务名称,参数是连接参数;参数列表见 。例如:
-# comment
+# 注释
[mydb]
host=somehost
port=5433
user=admin
- 在PostgreSQL 安装的share/pg_service.conf.sample 中提供了一个示例文件。
+PostgreSQL 安装目录中的 share/pg_service.conf.sample 提供了一个示例文件。
- 从服务文件中获取的连接参数与从其他来源获取的参数相结合。
- 服务文件设置覆盖相应的环境变量,然后反过来可以由连接字符串中直接给出的值覆盖。
- 例如,使用上面的服务文件,连接字符串service=mydb port=5434 将使用主机somehost ,端口5434 ,
- 用户admin ,以及由环境变量或内置默认所设置的其他参数。
+ 从服务文件中获取的连接参数会与其他来源的参数合并。服务文件中的设置会覆盖相应的环境变量,而连接字符串中直接给出的值又会覆盖服务文件中的设置。例如,使用上述服务文件时,连接字符串 service=mydb port=5434 将使用主机 somehost 、端口 5434 、用户 admin ,以及由环境变量或内置默认值设置的其他参数。
@@ -4935,7 +4954,7 @@ ldap://ldap.mycompany.com/dc=mycompany,dc=com?description?one?(cn=mydatabase)
你也可以将常规的服务文件条目和 LDAP 查找混合。pg_service.conf 中一节的完整示例:
-# 只有主机和端口存储在LDAP中,显式指定dbname和user。
+# 仅 host 和 port 存储在 LDAP 中;显式指定 dbname 和 user
[customerdb]
dbname=customer
user=appuser
@@ -4960,13 +4979,13 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
- 服务器证书的客户端验证
+ 客户端对服务器证书的验证
- 默认情况下,PostgreSQL 将不会执行服务器证书的任何验证。这意味着可以在不被客户端知晓的情况下伪造服务器身份(例如通过修改一个 DNS 记录或者接管服务器的 IP 地址)。为了阻止哄骗,客户端必须能够通过一条信任链验证服务器的身份。信任链可以这样建立:在一台计算机上放置一个根(自签名的)证书机构(CA )的证书并且在另一台计算机上放置一个由根证书签发 的叶子证书。还可以使用一种中间
证书,它由根证书签发并且可以签发叶子证书。
+ 默认情况下,PostgreSQL 不会对服务器证书执行任何验证。这意味着可以在客户端不知情的情况下伪造服务器身份,例如修改 DNS 记录或接管服务器的 IP 地址。要防止身份伪造,客户端必须能够通过信任链验证服务器身份。建立信任链的方法是:在一台计算机上放置根证书机构(CA )的自签名证书,在另一台计算机上放置由根证书签发 的叶证书。也可以使用由根证书签发、又用于签发叶证书的中间
证书。
- 要让客户端验证服务器的身份,请在客户端放置根证书,并在服务器上放置由该根证书签名的叶证书。要让服务器验证客户端的身份,请在服务器上放置根证书,并在客户端放置由该根证书签名的叶证书。也可以使用一个或多个中间证书(通常与叶证书存储在一起),将叶证书链接到根证书。
+ 要让客户端验证服务器的身份,请在客户端放置根证书,并在服务器上放置由该根证书签发的叶证书。要让服务器验证客户端的身份,请在服务器上放置根证书,并在客户端放置由该根证书签发的叶证书。也可以使用一个或多个中间证书(通常与叶证书存储在一起),将叶证书链接到根证书。
建立信任链后,客户端可以通过两种方式验证服务器发送的叶证书。如果参数 sslmode 设为 verify-ca ,libpq 会沿证书链检查到存储在客户端上的根证书,以验证服务器是否可信。如果 sslmode 设为 verify-full ,libpq 还会 验证服务器主机名是否与服务器证书中存储的名称匹配。如果无法验证服务器证书,SSL 连接将失败。在大多数对安全敏感的环境中,建议使用 verify-full 。
@@ -4985,8 +5004,8 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
- 为了与 PostgreSQL 的早期版本达到向后兼容,如果存在一个根 CA 文件,sslmode =require 的行为将与verify-ca 相同,即服务器证书根据 CA 验证。我们鼓励依赖这种行为,并且需要证书验证的应用应该总是使用verify-ca 或者verify-full 。
-
+ 为与 PostgreSQL 的早期版本向后兼容,如果存在根 CA 文件,sslmode =require 的行为将与 verify-ca 相同,即根据 CA 验证服务器证书。不建议依赖这种行为;需要证书验证的应用程序应始终使用 verify-ca 或 verify-full 。
+
@@ -4994,38 +5013,26 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
客户端证书
- 如果服务器尝试通过请求客户端的叶证书来验证客户端的身份,
- libpq 将发送存储在文件
- ~/.postgresql/postgresql.crt 中的证书,该文件位于用户的主目录中。
- 证书必须链到服务器信任的根证书。匹配的
- 私钥文件~/.postgresql/postgresql.key 也必须存在。
- 在Microsoft Windows上,这些文件的名称分别为
- %APPDATA%\postgresql\postgresql.crt 和
- %APPDATA%\postgresql\postgresql.key 。
- 证书和密钥文件的位置可以通过连接参数
- sslcert 和sslkey ,
- 或通过环境变量PGSSLCERT 和PGSSLKEY 来覆盖。
-
+ 如果服务器请求客户端的叶证书以验证客户端身份,libpq 将发送用户主目录下 ~/.postgresql/postgresql.crt 文件中存储的证书。这些证书必须通过证书链连接到服务器信任的根证书。还必须存在匹配的私钥文件 ~/.postgresql/postgresql.key 。在 Microsoft Windows 上,这两个文件分别名为 %APPDATA%\postgresql\postgresql.crt 和 %APPDATA%\postgresql\postgresql.key 。可以通过连接参数 sslcert 和 sslkey ,或环境变量 PGSSLCERT 和 PGSSLKEY ,覆盖证书和密钥文件的位置。
+
- 在Unix系统上,私钥文件的权限必须禁止任何对世界或组的访问;可以通过类似以下命令来实现:
- chmod 0600 ~/.postgresql/postgresql.key 。
- 或者,该文件可以由root拥有并具有组读取权限(即0640 权限)。
- 该设置适用于由操作系统管理证书和密钥文件的安装。然后,libpq 的用户应该成为具有对这些证书和密钥文件访问权限的组的成员。
- (在Microsoft Windows上,没有文件权限检查,因为假定%APPDATA%\postgresql 目录是安全的。)
-
+ 在 Unix 系统上,私钥文件的权限必须禁止所属组及其他用户的任何访问;可以用 chmod 0600 ~/.postgresql/postgresql.key 这样的命令实现。另一种做法是使文件归 root 所有,并允许组用户读取(即 0640 权限)。这种设置适用于由操作系统管理证书和密钥文件的安装环境。此时,应将 libpq 用户加入有权访问这些证书和密钥文件的组。(在 Microsoft Windows 上,不检查文件权限,因为假定 %APPDATA%\postgresql 目录是安全的。)
+
- postgresql.crt 中的第一个证书必须是客户端证书,因为它必须与客户端私钥匹配。可以选择在文件后面追加中间
证书,这样就无需在服务器的 root.crt 文件中存储中间证书。
+ postgresql.crt 中的第一个证书必须是客户端证书,因为它必须与客户端私钥匹配。可以选择在文件后面追加中间
证书 — 这样就无需在服务器的 root.crt 文件中存储中间证书。
- 创建证书的指令请参考。
+ 有关创建证书的说明,请参见 。
不同模式中提供的保护
- 为sslmode 参数选择不同的值可以提供不同程度的保护。SSL 可以防范三类攻击:
+
+ sslmode 参数的不同值提供不同级别的保护。SSL 可以防范三类攻击:
+
窃听
@@ -5037,31 +5044,33 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
中间人(MITM )
- 如果一个第三方能对客户端和服务器之间传送的数据进行修改,它就能假装是服务器并且因此能看见并且修改数据,即使这些数据已被加密 。然后第三方可以将连接信息和数据转送给原来的服务器,使得它不可能检测到攻击。这样做的通常途径包括 DNS 污染和地址劫持,借此客户端被重定向到一个不同的服务器。还有几种其他的攻击方式能够完成这种攻击。SSL 使用证书验证让客户端认证服务器,就可以阻止这种攻击。
-
+
+ 如果第三方能修改客户端与服务器之间传输的数据,就可以冒充服务器,进而查看和修改数据,即使数据已经加密 。随后,第三方可以将连接信息和数据转发给原来的服务器,使攻击无法被察觉。常见的手段包括 DNS 污染和地址劫持,从而将客户端引向预期之外的服务器。还有其他几种攻击手段可以达到同样的目的。SSL 使用证书验证,让客户端认证服务器身份,以防范这种攻击。
+
- 模仿
+ 冒充
- 如果一个第三方能假装是一个授权的客户端,它能够简单地访问它本不能访问的数据。通常这可以由不安全的密码管理所致。SSL 使用客户端证书来确保只有持有合法证书的客户端才能访问服务器,这样就能阻止这种攻击。
-
+
+ 如果第三方能冒充获授权的客户端,就能直接访问其无权访问的数据。这通常可能由不安全的密码管理导致。SSL 使用客户端证书,确保只有持有有效证书的客户端才能访问服务器,以防范这种攻击。
+
- 对于一个已知受 SSL 保护的连接,在连接建立之前,必须在客户端和服务器 两端都配置 SSL。如果只在服务器端配置,客户端在得知服务器要求高安全性之前,可能就已经开始发送敏感信息(例如密码)。在 libpq 中,要确保连接安全,可以把sslmode 参数设置为verify-full 或verify-ca ,并为系统提供一个用于验证的根证书。这类似于使用https URL 浏览加密网页。
+ 要确保连接安全,必须在建立连接之前,在客户端和服务器两端 配置 SSL。如果仅在服务器上配置,客户端可能在得知服务器要求高安全性之前就已发送敏感信息(例如密码)。在 libpq 中,可以将 sslmode 参数设为 verify-full 或 verify-ca ,并向系统提供用于验证的根证书,以确保连接安全。这类似于使用 https URL 进行加密的网页浏览。
- 一旦服务器已经被认证,客户端可以传递敏感数据。这意味着直到这一点,客户端都不需要知道是否证书将被用于认证,这样只需要在服务器配置中指定就比较安全。
+ 服务器通过身份认证后,客户端便可以传送敏感数据。这意味着,在此之前,客户端无需知道是否会使用证书进行认证,因此可以安全地仅在服务器配置中指定这一点。
- 所有SSL 选项都带来了加密和密钥交换的负荷,因此必须在性能和安全性之间做出平衡。不同sslmode 值所保护的风险,以及它们是怎样看待安全性和负荷的。
+ 所有 SSL 选项都会产生加密和密钥交换的开销,因此必须在性能与安全性之间作出权衡。 说明了不同 sslmode 值所能防范的风险,以及它们所表达的对安全性和开销的取舍。
@@ -5082,7 +5091,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
disable
否
否
- 我不关心安全性,并且我不想为加密增加负荷。
+ 我不关心安全性,并且我不想为加密增加开销。
@@ -5090,7 +5099,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
allow
可能
否
- 我不关心安全性,但如果服务器坚持,我将承担加密带来的负荷。
+ 我不关心安全性,但如果服务器坚持,我将承担加密带来的开销。
@@ -5098,7 +5107,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
prefer
可能
否
- 我不关心安全性,但如果服务器支持,我希望承担加密带来的负荷。
+ 我不关心加密,但如果服务器支持,我希望承担加密带来的开销。
@@ -5106,7 +5115,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
require
是
否
- 我想要对数据加密,并且我接受因此带来的负荷。我信任该网络会保证我总是连接到想要连接的服务器。
+ 我想要对数据加密,并且我接受因此带来的开销。我信任该网络会保证我总是连接到想要连接的服务器。
@@ -5114,7 +5123,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
verify-ca
是
取决于 CA 策略
- 我想要对数据加密,并且我接受因此带来的负荷。我想要确保我连接到的是我信任的服务器。
+ 我想要对数据加密,并且我接受因此带来的开销。我想要确保我连接到的是我信任的服务器。
@@ -5122,7 +5131,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
verify-full
是
是
- 我想要对数据加密,并且我接受因此带来的负荷。我想要确保我连接到的是我信任的服务器,并且就是我指定的那一个。
+ 我想要对数据加密,并且我接受因此带来的开销。我想要确保我连接到的是我信任的服务器,并且就是我指定的那一个。
@@ -5135,7 +5144,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
- sslmode 的默认值是prefer 。如表中所示,这在安全性的角度来说没有意义,并且它只承诺可能的性能负荷。提供它作为默认值只是为了向后兼容,并且我们不推荐在安全部署中使用它。
+ sslmode 的默认值是 prefer 。如表所示,从安全角度看,这一设置没有意义;它只会在可能时带来性能开销。将其作为默认值仅出于向后兼容的考虑,不建议在有安全要求的部署中使用。
@@ -5177,8 +5186,8 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
~/.postgresql/root.crt
- 可信的证书机构
- 检查服务器证书是由一个可信的证书机构签发
+ 受信任的证书机构
+ 检查服务器证书是由一个受信任的证书机构签发
@@ -5196,9 +5205,9 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
SSL 库初始化
- 如果您的应用程序初始化libssl 和/或libcrypto 库,并且libpq
- 构建时带有SSL 支持,您应该调用PQinitOpenSSL 告诉libpq
- libssl 和/或libcrypto 库已被您的应用程序初始化,以便
+ 如果你的应用程序初始化libssl 和/或libcrypto 库,并且libpq
+ 构建时带有SSL 支持,你应该调用PQinitOpenSSL 告诉libpq
+ libssl 和/或libcrypto 库已被你的应用程序初始化,以便
libpq 不会再初始化这些库。
@@ -5209,7 +5218,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
- 允许应用选择要初始化哪个安全性库。
+ 允许应用程序选择要初始化的安全库。
void PQinitOpenSSL(int do_ssl, int do_crypto);
@@ -5234,7 +5243,7 @@ void PQinitOpenSSL(int do_ssl, int do_crypto);
- 允许应用选择要初始化哪个安全性库。
+ 允许应用程序选择要初始化的安全库。
void PQinitSSL(int do_ssl);
@@ -5259,7 +5268,7 @@ void PQinitSSL(int do_ssl);
- 在线程化程序中的行为
+ 多线程程序中的行为
线程
@@ -5293,7 +5302,9 @@ int PQisthreadsafe();
PGresult 对象在创建后通常是只读的,因此可以在线程之间自由传递。不过,如果你使用或中描述的任何会修改PGresult 的函数,则需要自行避免对同一个PGresult 执行并发操作。
- 已弃用的 PQrequestCancel 和 PQoidStatus 函数不是线程安全的,不应在多线程程序中使用。可以用 PQcancel 替代 PQrequestCancel ,用 PQoidValue 替代 PQoidStatus 。
+
+ 已弃用的函数 PQrequestCancel 和 PQoidStatus 不是线程安全的,不应在多线程程序中使用。PQrequestCancel 可以用 PQcancel 替代;PQoidStatus 可以用 PQoidValue 替代。
+
如果你在应用程序中使用 Kerberos(除了libpq 内部之外),则需要在 Kerberos 调用周围加锁,因为 Kerberos 函数不是线程安全的。可参考libpq 源代码中的PQregisterThreadLock 函数,它提供了一种在libpq 与应用程序之间协作加锁的方法。
@@ -5303,7 +5314,7 @@ int PQisthreadsafe();
- 编译 libpq 程序
+ 构建 libpq 程序
编译
@@ -5311,16 +5322,16 @@ int PQisthreadsafe();
- 要编译(即编译并且链接)一个使用libpq 的程序,你需要做下列所有的事情:
+ 要构建(即编译和链接)一个使用 libpq 的程序,需要完成以下所有步骤:
- 包括libpq-fe.h 头文件:
+ 包含 libpq-fe.h 头文件:
#include <libpq-fe.h>
- 如果你无法这样做,那么你通常会从你的编译器得到像这样的错误消息:
+如果没有这样做,编译器通常会给出类似以下内容的错误消息:
foo.c: In function `main':
foo.c:34: `PGconn' undeclared (first use in this function)
@@ -5329,24 +5340,24 @@ foo.c:54: `CONNECTION_BAD' undeclared (first use in this function)
foo.c:68: `PGRES_COMMAND_OK' undeclared (first use in this function)
foo.c:95: `PGRES_TUPLES_OK' undeclared (first use in this function)
-
+
- 通过为你的编译器提供-Idirectory 选项,向你的编译器指出PostgreSQL 头文件安装在哪里(在某些情况下编译器默认将查看该目录,因此你可以忽略这个选项)。例如你的编译命令行可能看起来像:
+ 向编译器提供 -Idirectory 选项,指定 PostgreSQL 头文件的安装目录。(某些情况下,编译器默认会搜索该目录,此时可以省略这个选项。)例如,编译命令行可以是:
cc -c -I/usr/local/pgsql/include testprog.c
- 如果你在使用 makefile,那么把该选项加到CPPFLAGS 变量中:
+如果使用 makefile,请将该选项添加到 CPPFLAGS 变量中:
CPPFLAGS += -I/usr/local/pgsql/include
-
+
如果你的程序可能由其他用户编译,那么你不应该像那样硬编码目录位置。你可以运行工具pg_config pg_config with libpq 在本地系统上找出头文件在哪里:
+ sortas="libpq">用于 libpq在本地系统上找出头文件在哪里:
$ pg_config --includedir
/usr/local/include
@@ -5354,8 +5365,7 @@ CPPFLAGS += -I/usr/local/pgsql/include
- 如果你安装了pkg-config pkg-config with
- libpq ,你可以运行:
+ 如果你安装了pkg-config pkg-config 用于 libpq ,你可以运行:
$ pkg-config --cflags libpq
-I/usr/local/include
@@ -5364,20 +5374,20 @@ CPPFLAGS += -I/usr/local/pgsql/include
- 无法为编译器指定正确的选项将导致一个错误消息,例如:
+ 未向编译器指定正确的选项将导致类似以下内容的错误消息:
testlibpq.c:8:22: libpq-fe.h: No such file or directory
-
+
- 当链接最终的程序时,指定选项-lpq ,这样libpq 库会被编译进去,也可以用选项-Ldirectory 向编译器指出libpq 库所在的位置(再次,编译器将默认搜索某些目录)。为了最大的可移植性,将-L 选项放在-lpq 选项前面。例如:
+ 链接最终程序时,指定 -lpq 选项以链接 libpq 库,同时指定 -Ldirectory 选项,告知编译器 libpq 库所在的目录。(同样,编译器默认会搜索某些目录。)为获得最大的可移植性,请将 -L 选项放在 -lpq 选项之前。例如:
cc -o testprog testprog1.o testprog2.o -L/usr/local/pgsql/lib -lpq
-
+
你也可以使用pg_config 找出库目录:
@@ -5404,7 +5414,7 @@ testlibpq.o(.text+0x60): undefined reference to `PQsetdbLogin'
testlibpq.o(.text+0x71): undefined reference to `PQstatus'
testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'
- 这意味着你忘了 -lpq .
+ 这意味着你忘记了 -lpq 。
/usr/bin/ld: cannot find -lpq
@@ -5421,7 +5431,7 @@ testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'
示例程序
- 这些示例和其他示例可以在源代码发布的src/test/examples 目录中找到。
+ 这些示例和其他示例可在源代码发行包的src/test/examples 目录中找到。
@@ -5435,7 +5445,7 @@ testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'
*
* testlibpq.c
*
- * Test the C version of libpq, the PostgreSQL frontend library.
+ * 测试 PostgreSQL 前端库 libpq 的 C 语言版本。
*/
#include
#include
@@ -5459,19 +5469,18 @@ main(int argc, char **argv)
j;
/*
- * If the user supplies a parameter on the command line, use it as the
- * conninfo string; otherwise default to setting dbname=postgres and using
- * environment variables or defaults for all other connection parameters.
+ * 如果用户在命令行上提供了一个参数,就将其用作 conninfo 字符串;
+ * 否则默认设置 dbname=postgres,并对所有其他连接参数使用环境变量或默认值。
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
- /* Make a connection to the database */
+ /* 连接数据库 */
conn = PQconnectdb(conninfo);
- /* Check to see that the backend connection was successfully made */
+ /* 检查是否已成功建立到后端的连接 */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
@@ -5479,7 +5488,7 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* Set always-secure search path, so malicious users can't take control. */
+ /* 设置始终安全的搜索路径,防止恶意用户取得控制权。 */
res = PQexec(conn,
"SELECT pg_catalog.set_config('search_path', '', false)");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
@@ -5490,19 +5499,17 @@ main(int argc, char **argv)
}
/*
- * Should PQclear PGresult whenever it is no longer needed to avoid memory
- * leaks
+ * 不再需要 PGresult 时,应调用 PQclear 将其释放,以避免内存泄漏。
*/
PQclear(res);
/*
- * Our test case here involves using a cursor, for which we must be inside
- * a transaction block. We could do the whole thing with a single
- * PQexec() of "select * from pg_database", but that's too trivial to make
- * a good example.
+ * 这里的测试用例使用游标,因此必须处于事务块内。
+ * 只需调用一次 PQexec() 执行 "select * from pg_database" 就能完成全部操作,
+ * 但这太简单了,不足以作为一个好的示例。
*/
- /* Start a transaction block */
+ /* 开始一个事务块 */
res = PQexec(conn, "BEGIN");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
@@ -5513,7 +5520,7 @@ main(int argc, char **argv)
PQclear(res);
/*
- * Fetch rows from pg_database, the system catalog of databases
+ * 从数据库系统目录 pg_database 中获取行
*/
res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
@@ -5532,13 +5539,13 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* first, print out the attribute names */
+ /* 首先,打印属性名 */
nFields = PQnfields(res);
for (i = 0; i < nFields; i++)
printf("%-15s", PQfname(res, i));
printf("\n\n");
- /* next, print out the rows */
+ /* 接着,打印各行 */
for (i = 0; i < PQntuples(res); i++)
{
for (j = 0; j < nFields; j++)
@@ -5548,15 +5555,15 @@ main(int argc, char **argv)
PQclear(res);
- /* close the portal ... we don't bother to check for errors ... */
+ /* 关闭 portal……这里不再检查错误…… */
res = PQexec(conn, "CLOSE myportal");
PQclear(res);
- /* end the transaction */
+ /* 结束事务 */
res = PQexec(conn, "END");
PQclear(res);
- /* close the connection to the database and cleanup */
+ /* 关闭数据库连接并清理 */
PQfinish(conn);
return 0;
@@ -5575,15 +5582,15 @@ main(int argc, char **argv)
*
*
* testlibpq2.c
- * Test of the asynchronous notification interface
+ * 测试异步通知接口
*
- * Start this program, then from psql in another window do
+ * 启动此程序,然后在另一个窗口中通过 psql 执行
* NOTIFY TBL2;
- * Repeat four times to get this program to exit.
+ * 重复四次后,此程序便会退出。
*
- * Or, if you want to get fancy, try this:
- * populate a database with the following commands
- * (provided in src/test/examples/testlibpq2.sql):
+ * 或者,可以尝试更复杂的示例:
+ * 使用以下命令填充数据库
+ * (这些命令位于 src/test/examples/testlibpq2.sql 中):
*
* CREATE SCHEMA TESTLIBPQ2;
* SET search_path = TESTLIBPQ2;
@@ -5592,7 +5599,7 @@ main(int argc, char **argv)
* CREATE RULE r1 AS ON INSERT TO TBL1 DO
* (INSERT INTO TBL2 VALUES (new.i); NOTIFY TBL2);
*
- * Start this program, then from psql do this four times:
+ * 启动此程序,然后通过 psql 将以下命令执行四次:
*
* INSERT INTO TESTLIBPQ2.TBL1 VALUES (10);
*/
@@ -5629,19 +5636,18 @@ main(int argc, char **argv)
int nnotifies;
/*
- * If the user supplies a parameter on the command line, use it as the
- * conninfo string; otherwise default to setting dbname=postgres and using
- * environment variables or defaults for all other connection parameters.
+ * 如果用户在命令行上提供了一个参数,就将其用作 conninfo 字符串;
+ * 否则默认设置 dbname=postgres,并对所有其他连接参数使用环境变量或默认值。
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
- /* Make a connection to the database */
+ /* 连接数据库 */
conn = PQconnectdb(conninfo);
- /* Check to see that the backend connection was successfully made */
+ /* 检查是否已成功建立到后端的连接 */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
@@ -5649,7 +5655,7 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* Set always-secure search path, so malicious users can't take control. */
+ /* 设置始终安全的搜索路径,防止恶意用户取得控制权。 */
res = PQexec(conn,
"SELECT pg_catalog.set_config('search_path', '', false)");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
@@ -5660,13 +5666,12 @@ main(int argc, char **argv)
}
/*
- * Should PQclear PGresult whenever it is no longer needed to avoid memory
- * leaks
+ * 不再需要 PGresult 时,应调用 PQclear 将其释放,以避免内存泄漏。
*/
PQclear(res);
/*
- * Issue LISTEN command to enable notifications from the rule's NOTIFY.
+ * 发出 LISTEN 命令,以接收规则中的 NOTIFY 发出的通知。
*/
res = PQexec(conn, "LISTEN TBL2");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
@@ -5677,14 +5682,13 @@ main(int argc, char **argv)
}
PQclear(res);
- /* Quit after four notifies are received. */
+ /* 收到四次通知后退出。 */
nnotifies = 0;
while (nnotifies < 4)
{
/*
- * Sleep until something happens on the connection. We use select(2)
- * to wait for input, but you could also use poll() or similar
- * facilities.
+ * 休眠,直到连接上有事件发生。这里使用 select(2) 等待输入,
+ * 也可以使用 poll() 或类似机制。
*/
int sock;
fd_set input_mask;
@@ -5692,7 +5696,7 @@ main(int argc, char **argv)
sock = PQsocket(conn);
if (sock < 0)
- break; /* shouldn't happen */
+ break; /* 不应发生 */
FD_ZERO(&input_mask);
FD_SET(sock, &input_mask);
@@ -5703,7 +5707,7 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* Now check for input */
+ /* 现在检查是否有输入 */
PQconsumeInput(conn);
while ((notify = PQnotifies(conn)) != NULL)
{
@@ -5718,7 +5722,7 @@ main(int argc, char **argv)
fprintf(stderr, "Done.\n");
- /* close the connection to the database and cleanup */
+ /* 关闭数据库连接并清理 */
PQfinish(conn);
return 0;
@@ -5737,10 +5741,10 @@ main(int argc, char **argv)
*
*
* testlibpq3.c
- * Test out-of-line parameters and binary I/O.
+ * 测试在 SQL 命令文本之外独立传递的参数和二进制 I/O。
*
- * Before running this, populate a database with the following commands
- * (provided in src/test/examples/testlibpq3.sql):
+ * 运行前,使用以下命令填充数据库
+ * (这些命令位于 src/test/examples/testlibpq3.sql 中):
*
* CREATE SCHEMA testlibpq3;
* SET search_path = testlibpq3;
@@ -5748,7 +5752,7 @@ main(int argc, char **argv)
* INSERT INTO test1 values (1, 'joe''s place', '\\000\\001\\002\\003\\004');
* INSERT INTO test1 values (2, 'ho there', '\\004\\003\\002\\001\\000');
*
- * The expected output is:
+ * 预期输出为:
*
* tuple 0: got
* i = (4 bytes) 1
@@ -5772,7 +5776,7 @@ main(int argc, char **argv)
#include
#include "libpq-fe.h"
-/* for ntohl/htonl */
+/* 用于 ntohl/htonl */
#include
#include
@@ -5785,9 +5789,8 @@ exit_nicely(PGconn *conn)
}
/*
- * This function prints a query result that is a binary-format fetch from
- * a table defined as in the comment above. We split it out because the
- * main() function uses it twice.
+ * 此函数打印从上面注释所定义的表中以二进制格式获取的查询结果。
+ * 由于 main() 会使用它两次,因此将它单独提取成一个函数。
*/
static void
show_binary_results(PGresult *res)
@@ -5798,7 +5801,7 @@ show_binary_results(PGresult *res)
t_fnum,
b_fnum;
- /* Use PQfnumber to avoid assumptions about field order in result */
+ /* 使用 PQfnumber,以避免对结果中的字段顺序作出假设 */
i_fnum = PQfnumber(res, "i");
t_fnum = PQfnumber(res, "t");
b_fnum = PQfnumber(res, "b");
@@ -5811,24 +5814,22 @@ show_binary_results(PGresult *res)
int blen;
int ival;
- /* Get the field values (we ignore possibility they are null!) */
+ /* 获取字段值(这里忽略它们可能为 null 的情况!) */
iptr = PQgetvalue(res, i, i_fnum);
tptr = PQgetvalue(res, i, t_fnum);
bptr = PQgetvalue(res, i, b_fnum);
/*
- * The binary representation of INT4 is in network byte order, which
- * we'd better coerce to the local byte order.
+ * INT4 的二进制表示采用网络字节序,最好将其转换为本机字节序。
*/
ival = ntohl(*((uint32_t *) iptr));
/*
- * The binary representation of TEXT is, well, text, and since libpq
- * was nice enough to append a zero byte to it, it'll work just fine
- * as a C string.
+ * TEXT 的二进制表示就是文本,而 libpq 会在其后追加一个零字节,
+ * 因此可以直接将其用作 C 字符串。
*
- * The binary representation of BYTEA is a bunch of bytes, which could
- * include embedded nulls so we have to pay attention to field length.
+ * BYTEA 的二进制表示是一组字节,其中可能嵌有零字节,
+ * 因此必须注意字段长度。
*/
blen = PQgetlength(res, i, b_fnum);
@@ -5856,19 +5857,18 @@ main(int argc, char **argv)
uint32_t binaryIntVal;
/*
- * If the user supplies a parameter on the command line, use it as the
- * conninfo string; otherwise default to setting dbname=postgres and using
- * environment variables or defaults for all other connection parameters.
+ * 如果用户在命令行上提供了一个参数,就将其用作 conninfo 字符串;
+ * 否则默认设置 dbname=postgres,并对所有其他连接参数使用环境变量或默认值。
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
- /* Make a connection to the database */
+ /* 连接数据库 */
conn = PQconnectdb(conninfo);
- /* Check to see that the backend connection was successfully made */
+ /* 检查是否已成功建立到后端的连接 */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
@@ -5876,7 +5876,7 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* Set always-secure search path, so malicious users can't take control. */
+ /* 设置始终安全的搜索路径,防止恶意用户取得控制权。 */
res = PQexec(conn, "SET search_path = testlibpq3");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
@@ -5887,27 +5887,25 @@ main(int argc, char **argv)
PQclear(res);
/*
- * The point of this program is to illustrate use of PQexecParams() with
- * out-of-line parameters, as well as binary transmission of data.
+ * 此程序旨在演示如何使用 PQexecParams() 在 SQL 命令文本之外独立传递参数,
+ * 以及如何以二进制方式传输数据。
*
- * This first example transmits the parameters as text, but receives the
- * results in binary format. By using out-of-line parameters we can avoid
- * a lot of tedious mucking about with quoting and escaping, even though
- * the data is text. Notice how we don't have to do anything special with
- * the quote mark in the parameter value.
+ * 第一个示例以文本形式传输参数,但以二进制格式接收结果。
+ * 通过在 SQL 命令文本之外独立传递参数,即使数据是文本,也可以避免
+ * 许多繁琐的引号和转义处理。注意,参数值中的引号无需任何特殊处理。
*/
- /* Here is our out-of-line parameter value */
+ /* 这是在 SQL 命令文本之外独立传递的参数值 */
paramValues[0] = "joe's place";
res = PQexecParams(conn,
"SELECT * FROM test1 WHERE t = $1",
- 1, /* one param */
- NULL, /* let the backend deduce param type */
+ 1, /* 一个参数 */
+ NULL, /* 让后端推断参数类型 */
paramValues,
- NULL, /* don't need param lengths since text */
- NULL, /* default to all text params */
- 1); /* ask for binary results */
+ NULL, /* 文本参数无需指定长度 */
+ NULL, /* 默认所有参数均为文本 */
+ 1); /* 请求二进制结果 */
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
@@ -5921,31 +5919,29 @@ main(int argc, char **argv)
PQclear(res);
/*
- * In this second example we transmit an integer parameter in binary form,
- * and again retrieve the results in binary form.
+ * 第二个示例以二进制形式传输一个整数参数,并同样以二进制形式获取结果。
*
- * Although we tell PQexecParams we are letting the backend deduce
- * parameter type, we really force the decision by casting the parameter
- * symbol in the query text. This is a good safety measure when sending
- * binary parameters.
+ * 虽然我们告诉 PQexecParams 让后端推断参数类型,但实际上,
+ * 查询文本中的参数符号经过强制类型转换,因此其类型已经确定。
+ * 发送二进制参数时,这是一项良好的安全措施。
*/
- /* Convert integer value "2" to network byte order */
+ /* 将整数值 "2" 转换为网络字节序 */
binaryIntVal = htonl((uint32_t) 2);
- /* Set up parameter arrays for PQexecParams */
+ /* 为 PQexecParams 设置参数数组 */
paramValues[0] = (char *) &binaryIntVal;
paramLengths[0] = sizeof(binaryIntVal);
- paramFormats[0] = 1; /* binary */
+ paramFormats[0] = 1; /* 二进制 */
res = PQexecParams(conn,
"SELECT * FROM test1 WHERE i = $1::int4",
- 1, /* one param */
- NULL, /* let the backend deduce param type */
+ 1, /* 一个参数 */
+ NULL, /* 让后端推断参数类型 */
paramValues,
paramLengths,
paramFormats,
- 1); /* ask for binary results */
+ 1); /* 请求二进制结果 */
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
@@ -5958,7 +5954,7 @@ main(int argc, char **argv)
PQclear(res);
- /* close the connection to the database and cleanup */
+ /* 关闭数据库连接并清理 */
PQfinish(conn);
return 0;
diff --git a/zh/10/lobj.sgml b/zh/10/lobj.sgml
index f02b5e8e..3d7fed0a 100644
--- a/zh/10/lobj.sgml
+++ b/zh/10/lobj.sgml
@@ -3,8 +3,8 @@
大对象
- large object
- BLOB large object
+ 大对象
+ BLOB 大对象
PostgreSQL 提供一种大对象 机制,允许以流式方式访问存储在专用大对象结构中的用户数据。在处理大到无法方便地整体操作的数据值时,这种流式访问非常有用。
@@ -19,7 +19,7 @@
TOAST
- versus large objects
+ 与大对象对比
@@ -182,11 +182,11 @@ inv_fd = lo_open(conn, inv_oid, INV_READ|INV_WRITE);
int lo_write(PGconn *conn, int fd, const char *buf, size_t len);
- 将buf 中的len 字节(其大小必须为len )写入大对象描述符fd 。fd 参数必须是先前由lo_open 返回的大对象描述符。返回值是实际写入的字节数(在当前实现中,除非出错,否则它总会等于len )。发生错误时,返回值为 -1。
+ 将buf 中的len 字节(缓冲区大小必须为len )写入大对象描述符fd 。fd 参数必须是先前由lo_open 返回的大对象描述符。返回值是实际写入的字节数(在当前实现中,除非出错,否则它总会等于len )。发生错误时,返回值为 -1。
- 虽然len 参数被声明为size_t ,但该函数会拒绝大于INT_MAX 的长度值。实际上,无论如何最好按每块最多几兆字节来传输数据。
+ 虽然len 参数被声明为size_t ,但该函数会拒绝大于INT_MAX 的长度值。实际上,最好按每块最多几兆字节来传输数据。
@@ -203,7 +203,7 @@ int lo_read(PGconn *conn, int fd, char *buf, size_t len);
- 虽然len 参数被声明为size_t ,但该函数会拒绝大于INT_MAX 的长度值。实际上,无论如何最好按每块最多几兆字节来传输数据。
+ 虽然len 参数被声明为size_t ,但该函数会拒绝大于INT_MAX 的长度值。实际上,最好按每块最多几兆字节来传输数据。
@@ -269,7 +269,7 @@ pg_int64 lo_tell64(PGconn *conn, int fd);
int lo_truncate(PGconn *conn, int fd, size_t len);
- 该函数把大对象描述符fd 截断为长度len 。fd 参数必须是先前由lo_open 返回的大对象描述符。如果len 大于大对象当前的长度,则会用空字节('\0')把该大对象扩展到指定长度。成功时,lo_truncate 返回零;出错时返回值为 -1。
+ 该函数把大对象描述符fd 对应的大对象截断为长度len 。fd 参数必须是先前由lo_open 返回的大对象描述符。如果len 大于大对象当前的长度,则会用零字节('\0')把该大对象扩展到指定长度。成功时,lo_truncate 返回零;出错时返回值为 -1。
@@ -390,16 +390,16 @@ CREATE TABLE image (
raster oid
);
-SELECT lo_creat(-1); -- returns OID of new, empty large object
+SELECT lo_creat(-1); -- 返回新建的空大对象的 OID
-SELECT lo_create(43213); -- attempts to create large object with OID 43213
+SELECT lo_create(43213); -- 尝试创建 OID 为 43213 的大对象
-SELECT lo_unlink(173454); -- deletes large object with OID 173454
+SELECT lo_unlink(173454); -- 删除 OID 为 173454 的大对象
INSERT INTO image (name, raster)
VALUES ('beautiful image', lo_import('/etc/motd'));
-INSERT INTO image (name, raster) -- same as above, but specify OID to use
+INSERT INTO image (name, raster) -- 与上例相同,但指定要使用的 OID
VALUES ('beautiful image', lo_import('/etc/motd', 68583));
SELECT lo_export(image.raster, '/tmp/motd') FROM image
@@ -407,7 +407,7 @@ SELECT lo_export(image.raster, '/tmp/motd') FROM image
- 服务器端 lo_import 和 lo_export 函数的行为与客户端对应函数有很大不同。这两个函数使用数据库拥有者用户的权限,读写服务器文件系统中的文件,因此仅限超级用户使用。相比之下,客户端导入和导出函数使用客户端程序的权限,读写客户端文件系统中的文件。客户端函数不要求超级用户权限。
+ 服务器端 lo_import 和 lo_export 函数的行为与客户端对应函数有很大不同。这两个函数使用运行数据库服务器的操作系统用户的权限,读写服务器文件系统中的文件,因此仅限超级用户使用。相比之下,客户端导入和导出函数使用客户端程序的权限,读写客户端文件系统中的文件。客户端函数不要求超级用户权限。
lo_read 和lo_write 的功能也可以通过服务器端调用获得,但服务器端函数名与客户端接口不同,因为它们不包含下划线。必须将这些函数调用为loread 和lowrite 。
@@ -419,7 +419,7 @@ SELECT lo_export(image.raster, '/tmp/motd') FROM image
示例程序
- 是一个示例程序,它展示了如何使用libpq 中的大对象接口。程序中有些部分已经被注释掉,但仍保留在源代码中供读者参考。该程序也可以在源代码发行版的src/test/examples/testlo.c 中找到。
+ 是一个示例程序,它展示了如何使用libpq 中的大对象接口。程序中有些部分已经被注释掉,但仍保留在源代码中供读者参考。该程序也可以在源代码发行包的src/test/examples/testlo.c 中找到。
@@ -428,13 +428,13 @@ SELECT lo_export(image.raster, '/tmp/motd') FROM image
/*-------------------------------------------------------------------------
*
* testlo.c
- * test using large objects with libpq
+ * 测试使用 libpq 操作大对象
*
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
*
- * IDENTIFICATION
+ * 标识
* src/test/examples/testlo.c
*
*-------------------------------------------------------------------------
@@ -454,7 +454,7 @@ SELECT lo_export(image.raster, '/tmp/motd') FROM image
/*
* importFile -
- * import file "in_filename" into database as large object "lobjOid"
+ * 将文件 "in_filename" 作为大对象 "lobjOid" 导入数据库
*
*/
static Oid
@@ -468,16 +468,16 @@ importFile(PGconn *conn, char *filename)
int fd;
/*
- * open the file to be read in
+ * 打开要读取的文件
*/
fd = open(filename, O_RDONLY, 0666);
if (fd < 0)
- { /* error */
+ { /* 错误 */
fprintf(stderr, "cannot open unix file\"%s\"\n", filename);
}
/*
- * create the large object
+ * 创建大对象
*/
lobjId = lo_creat(conn, INV_READ | INV_WRITE);
if (lobjId == 0)
@@ -486,7 +486,7 @@ importFile(PGconn *conn, char *filename)
lobj_fd = lo_open(conn, lobjId, INV_WRITE);
/*
- * read in from the Unix file and write to the inversion file
+ * 从 Unix 文件读取数据并写入大对象
*/
while ((nbytes = read(fd, buf, BUFSIZE)) > 0)
{
@@ -524,7 +524,7 @@ pickout(PGconn *conn, Oid lobjId, int start, int len)
fprintf(stderr, ">>> %s", buf);
nread += nbytes;
if (nbytes <= 0)
- break; /* no more data? */
+ break; /* 没有更多数据? */
}
free(buf);
fprintf(stderr, "\n");
@@ -570,7 +570,7 @@ overwrite(PGconn *conn, Oid lobjId, int start, int len)
/*
* exportFile -
- * export large object "lobjOid" to file "out_filename"
+ * 将大对象 "lobjOid" 导出到文件 "out_filename"
*
*/
static void
@@ -583,24 +583,24 @@ exportFile(PGconn *conn, Oid lobjId, char *filename)
int fd;
/*
- * open the large object
+ * 打开大对象
*/
lobj_fd = lo_open(conn, lobjId, INV_READ);
if (lobj_fd < 0)
fprintf(stderr, "cannot open large object %u", lobjId);
/*
- * open the file to be written to
+ * 打开要写入的文件
*/
fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666);
if (fd < 0)
- { /* error */
+ { /* 错误 */
fprintf(stderr, "cannot open unix file\"%s\"",
filename);
}
/*
- * read in from the inversion file and write to the Unix file
+ * 从大对象读取数据并写入 Unix 文件
*/
while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) > 0)
{
@@ -647,11 +647,11 @@ main(int argc, char **argv)
out_filename = argv[3];
/*
- * set up the connection
+ * 建立连接
*/
conn = PQsetdb(NULL, NULL, NULL, NULL, database);
- /* check to see that the backend connection was successfully made */
+ /* 检查是否已成功建立到后端的连接 */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
@@ -659,7 +659,7 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* Set always-secure search path, so malicious users can't take control. */
+ /* 设置始终安全的搜索路径,防止恶意用户取得控制权。 */
res = PQexec(conn,
"SELECT pg_catalog.set_config('search_path', '', false)");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
diff --git a/zh/10/pgtrgm.sgml b/zh/10/pgtrgm.sgml
index 05f25e43..57366252 100644
--- a/zh/10/pgtrgm.sgml
+++ b/zh/10/pgtrgm.sgml
@@ -267,11 +267,11 @@ SELECT * FROM test_trgm WHERE t ~ '(foo|bar)';
- 文本搜索集成
+ 文本检索集成
与全文索引结合使用时,三字符组匹配是非常有用的工具。
- 尤其是,它有助于识别那些因拼写错误而无法被全文搜索机制直接匹配的输入词。
+ 尤其是,它有助于识别那些因拼写错误而无法被全文检索机制直接匹配的输入词。
diff --git a/zh/10/protocol.sgml b/zh/10/protocol.sgml
index 0ff3349c..bfc9855f 100644
--- a/zh/10/protocol.sgml
+++ b/zh/10/protocol.sgml
@@ -33,7 +33,7 @@
- 会话通常由前端选择终止,但在某些情况下也可能由后端强制终止。无论哪种情况,后端在关闭连接前都会回滚所有打开的(未完成的)事务。
+ 会话通常由前端选择终止,但在某些情况下也可能由后端强制终止。无论哪种情况,后端关闭连接时,都会在退出前回滚所有打开的(未完成的)事务。
@@ -72,9 +72,7 @@
整个执行周期包括一个解析 步骤,它从文本查询字符串创建预备语句;
一个绑定 步骤,它根据预备语句和所需参数值创建 portal;
- 以及一个执行 步骤,用于执行 portal 中的查询。对于返回行的查询
- (SELECT 、SHOW 等),可以要求执行步骤只取回
- 有限数量的行,因此可能需要多次执行步骤才能完成整个操作。
+ 以及一个执行 步骤,用于执行 portal 中的查询。对于返回行的查询(SELECT 、SHOW 等),可以要求执行步骤只取回有限数量的行,因此可能需要多次执行步骤才能完成整个操作。
@@ -91,8 +89,8 @@
- 文本形式的数值是特定数据类型的输入/输出转换函数生成或接受的任何字符串。在传输形式上,字符串没有末尾空字符;如果前端要想把收到的值当作C字符串处理,那么必须自己加上一个(顺便说一下,文本格式不允许嵌入空字符)。
-
+ 值的文本表示是相应数据类型的输入/输出转换函数生成和接受的字符串。在传输形式中,值的末尾没有空字符;前端若要将收到的值作为 C 字符串处理,必须自行添加一个。(文本格式也不允许内嵌空字符。)
+
整数的二进制表示采用网络字节序(最高有效字节在前)。至于其他数据类型,请查阅文档或源代码了解其二进制表示形式。要注意,复杂数据类型的二进制表示可能会在不同服务器版本之间发生变化;文本格式通常是可移植性更好的选择。
@@ -112,7 +110,7 @@
启动
- 要开始一个会话,前端会打开到服务器的连接并发送一条启动消息。该消息包含用户名以及用户希望连接的数据库名;它还指明要使用的协议版本。(启动消息也可以选择性地包含运行时参数的附加设置。)随后服务器会结合这些信息以及配置文件(例如 pg_hba.conf )的内容,判断该连接在初步上是否可接受,以及是否需要额外的认证。
+ 要开始一个会话,前端会打开到服务器的连接并发送一条启动消息。该消息包含用户名以及用户希望连接的数据库名;它还指明要使用的协议版本。(启动消息也可以选择性地包含运行时参数的附加设置。)随后服务器会结合这些信息以及配置文件(例如 pg_hba.conf )的内容,初步判断是否接受该连接,以及需要何种额外认证(如果需要)。
@@ -355,7 +353,7 @@
表示即将返回行作为对SELECT 、FETCH 等查询的响应。
- 此消息的内容描述了行的列布局。这将跟随每个返回给前端的行的DataRow消息。
+ 此消息的内容描述了行的列布局。该消息之后,每个返回给前端的行都对应一条 DataRow 消息。
@@ -411,7 +409,7 @@
- SELECT 查询(或其他返回行集的查询,如 EXPLAIN 或 SHOW )的响应通常包含 RowDescription、零条或多条 DataRow 消息,以及最后的 CommandComplete。在前端与服务器之间执行 COPY 输入或输出时,会使用 所述的特殊协议。所有其他类型的查询通常只产生一条 CommandComplete 消息。
+ SELECT 查询(或其他返回行集的查询,如 EXPLAIN 或 SHOW )的响应通常包含 RowDescription、零条或多条 DataRow 消息,以及最后的 CommandComplete。在前端与服务器之间执行 COPY 输入或输出时,会使用 所述的特殊协议。所有其他类型的查询通常只产生一条 CommandComplete 消息。
由于查询字符串可能包含若干条查询(以分号分隔),因此在后端完成整个查询字符串的处理之前,可能会出现多个这样的响应序列。只有在整个字符串处理完毕且后端已准备好接受新的查询字符串时,才会发出 ReadyForQuery 消息。
@@ -434,8 +432,8 @@
- 我们建议的方法是把前端代码写成状态机的风格,它可以在任何时刻接受任何有意义的消息类型,而不是假设消息的序列总是准确。
-
+ 建议以状态机的方式编写前端,使其能够在任何合理的时机接收相应类型的消息,而不把消息确切顺序的假设写死在代码中。
+
@@ -488,11 +486,11 @@
- 一旦 portal 存在,就可以使用 Execute 消息执行它。Execute 消息指定 portal 的名称(空字符串表示未命名 portal)以及一个最大的结果行计数(零表示取回全部行
)。结果行计数只对包含返回行集命令的 portal 有意义;在其他情况下,命令总会执行到完成,而行计数会被忽略。Execute 的可能响应与通过简单查询协议发出的查询相同,只是执行不会导致后端发送 ReadyForQuery 或 RowDescription。
+ 一旦 portal 存在,就可以使用 Execute 消息执行它。Execute 消息指定 portal 的名称(空字符串表示未命名 portal)以及一个最大的结果行计数(零表示取回全部行
)。结果行计数只对包含返回行集命令的 portal 有意义;在其他情况下,命令总会执行到完成,而行计数会被忽略。Execute 的可能响应与通过简单查询协议发出的查询相同,只是 Execute 不会导致后端发送 ReadyForQuery 或 RowDescription。
- 如果 Execute 在 portal 执行完成之前终止(因为达到了非零的结果行计数),它会发送一条 PortalSuspended 消息;该消息表明前端应当针对同一个 portal 再发出一条 Execute 消息,以完成此次操作。在 portal 执行完成之前,不会发送表示源 SQL 命令结束的 CommandComplete 消息。因此,一个 Execute 阶段总会以下列消息之一结束:CommandComplete、EmptyQueryResponse(如果 portal 是从空查询字符串创建的)、ErrorResponse 或 PortalSuspended。
+ 如果 Execute 在 portal 执行完成之前终止(因为达到了非零的结果行计数),它会发送一条 PortalSuspended 消息;该消息表明前端应当针对同一个 portal 再发出一条 Execute 消息,以完成此次操作。在 portal 执行完成之前,不会发送表示源 SQL 命令结束的 CommandComplete 消息。因此,一个 Execute 阶段总会以下列消息中的恰好一条结束:CommandComplete、EmptyQueryResponse(如果 portal 是从空查询字符串创建的)、ErrorResponse 或 PortalSuspended。
@@ -507,7 +505,7 @@
- 除了这些基本的、必须的操作之外,在扩展查询协议里还有几种可选的操作可以使用。
+ 除了这些基本的、必需的操作之外,在扩展查询协议里还有几种可选的操作可以使用。
@@ -542,44 +540,38 @@
- 流水线处理
+ 管道化
- 流水线处理
+ 管道化
协议规范
- 使用扩展查询协议允许流水线处理 ,这意味着发送一系列查询而无需等待先前的查询完成。
- 这减少了完成一系列操作所需的网络往返次数。然而,用户必须仔细考虑所需的行为,如果其中一步失败,
- 因为后续查询已经在传输到服务器的过程中。
-
+ 扩展查询协议允许管道化 ,即连续发送一系列查询,而不等待先前查询完成。这减少了完成一组操作所需的网络往返次数。不过,用户必须仔细考虑其中某个步骤失败时所需的行为,因为后续查询已经在发往服务器的途中。
+
- 处理这个问题的一种方法是将整个查询系列作为一个事务处理,即将其包装在BEGIN ...
- COMMIT 中。然而,如果希望其中一些命令独立于其他命令提交,这并没有帮助。
-
+ 处理这个问题的一种方式是让整组查询成为单个事务,即用BEGIN ... COMMIT 包围它们。不过,如果希望其中某些命令独立于其他命令提交,这种方式就无法满足要求。
+
- 扩展查询协议提供了另一种管理这个问题的方式,即在依赖的步骤之间省略发送同步消息。
- 由于在错误后,后端会跳过命令消息直到找到同步消息,这允许在管道中的后续命令在前面的命令失败时自动跳过,而无需客户端明确地使用BEGIN 和COMMIT 来管理。
- 管道中可以通过同步消息分隔独立可提交的段。
-
+ 扩展查询协议提供了另一种处理方式,即省略相互依赖的步骤之间的 Sync 消息。发生错误后,后端会跳过命令消息,直到遇到 Sync,因此当前面的命令失败时,管道中的后续命令便会自动跳过,而不必由客户端用BEGIN 和COMMIT 显式管理。管道中可独立提交的各段可以用 Sync 消息分隔。
+
如果客户端没有发出显式的 BEGIN ,那么每个 Sync 通常会在前序步骤成功时引发隐式的 COMMIT ,失败时引发隐式的 ROLLBACK 。不过,少数 DDL 命令(例如 CREATE DATABASE )不能在事务块中执行。如果这类命令在管道中执行,成功时会强制立即提交,以保持数据库一致性。紧随这类命令之后的 Sync 除了返回 ReadyForQuery 外,不产生其他效果。
- 当使用这种方法时,必须通过计算ReadyForQuery消息的数量并等待达到发送的Syncs数量来确定管道的完成。
- 计算命令完成响应是不可靠的,因为其中一些命令可能会被跳过,因此不会产生完成消息。
-
+ 使用这种方式时,必须统计 ReadyForQuery 消息的数量,并等待该数量达到已发送的 Sync 消息数量,才能确定管道已完成。统计命令完成响应并不可靠,因为某些命令可能未被执行,因而不会产生完成消息。
+
函数调用
- 函数调用子协议允许客户端请求一个对存在于数据库pg_proc 系统表中的任意函数的直接调用。客户端必须在该函数上有执行的权限。
-
+ 函数调用子协议允许客户端请求直接调用数据库pg_proc 系统目录中的任意函数。客户端必须具有该函数的执行权限。
+
@@ -589,8 +581,8 @@
- 一个函数调用周期是由前端向后端发送一条FunctionCall消息初始化的。然后后端根据函数调用的结果发送一条或者更多响应消息,并且最后是一条ReadyForQuery响应消息。ReadyForQuery通知前端它可以安全地发送一个新的查询或者函数调用了。
-
+ 函数调用周期由前端向后端发送一条 FunctionCall 消息来启动。后端随后根据函数调用的结果发送一条或多条响应消息,最后发送一条 ReadyForQuery 响应消息。ReadyForQuery 告知前端,可以安全地发送新的查询或函数调用。
+
来自后端的可能的响应消息是:
@@ -609,7 +601,7 @@
FunctionCallResponse
- 函数调用完成并且在消息中返回一个结果(请注意函数调用协议只能处理单个标量结果,不能处理行类型或者集合类型的结果)。
+ 函数调用完成并且在消息中返回一个结果(请注意函数调用协议只能处理单个标量结果,不能处理行类型或者结果集合)。
@@ -643,7 +635,7 @@
- 拷贝入模式(向服务器传输数据)在后端执行COPY FROM STDIN SQL 语句时启动。后端会向前端发送一条 CopyInResponse 消息。随后前端应发送零条或多条 CopyData 消息,构成一条输入数据流。(消息边界与行边界之间没有任何对应关系要求,尽管让它们对齐通常是合理的选择。)前端可以通过发送 CopyDone 消息来结束拷贝入模式(表示成功结束),也可以发送 CopyFail 消息(这会使COPY 语句以错误失败)。然后后端会恢复到COPY 开始之前的命令处理模式,也就是简单查询协议或扩展查询协议。接下来它会发送 CommandComplete(成功时)或 ErrorResponse(失败时)。
+ 拷贝入模式(向服务器传输数据)在后端执行COPY FROM STDIN SQL 语句时启动。后端会向前端发送一条 CopyInResponse 消息。随后前端应发送零条或多条 CopyData 消息,构成一条输入数据流。(消息边界与行边界之间没有任何对应关系要求,尽管让它们对齐通常是合理的选择。)前端可以通过发送 CopyDone 消息来结束拷贝入模式(允许成功结束),也可以发送 CopyFail 消息(这会使COPY 语句以错误失败)。然后后端会恢复到COPY 开始之前的命令处理模式,也就是简单查询协议或扩展查询协议。接下来它会发送 CommandComplete(成功时)或 ErrorResponse(失败时)。
@@ -651,11 +643,11 @@
- 在拷贝入模式下,后端将忽略所收到的Flush和Sync消息。收到任何其他非拷贝消息类型都会造成一个错误,它将导致上面所描述的拷贝入状态中断(Flush和Sync的例外是为了方便客户端库,它们总是在一个Execute消息之后发送Flush和Sync,而不检查被执行的命令是否为一个COPY FROM STDIN )。
-
+ 后端会忽略在拷贝入模式期间收到的 Flush 和 Sync 消息。收到任何其他非拷贝类型的消息都会构成错误,并按上述方式中止拷贝入状态。(Flush 和 Sync 的例外是为了方便那些总是在 Execute 消息之后发送 Flush 或 Sync、而不检查待执行命令是否为COPY FROM STDIN 的客户端库。)
+
- 拷贝出模式(数据从服务器发出)是在后端执行一个COPY TO STDOUT 语句的时候初始化的。后端发出一个CopyOutResponse消息给前端,后面跟着零或者多个CopyData消息(总是每行一个),然后跟着CopyDone。然后后端回退到它在COPY 开始之前的命令处理模式,然后发送CommandComplete。前端不能退出传输(除非是关闭连接或者发出一个Cancel请求),但是它可以抛弃不需要的CopyData和CopyDone消息。
+ 拷贝出模式(数据从服务器发出)是在后端执行一个COPY TO STDOUT 语句时启动的。后端发出一个CopyOutResponse消息给前端,后面跟着零或者多个CopyData消息(总是每行一个),然后跟着CopyDone。然后后端回退到它在COPY 开始之前的命令处理模式,然后发送CommandComplete。前端不能中止传输(除非是关闭连接或者发出一个Cancel请求),但是它可以抛弃不需要的CopyData和CopyDone消息。
@@ -663,16 +655,16 @@
- 在CopyData消息中间可能会散布有NoticeResponse和ParameterStatus消息。前端必须处理这些情况,并且应该也为异步消息类型(参见)准备好。除此之外,可以将任何除 CopyData 或 CopyDone 以外的消息类型视为拷贝出模式的终止标志。
-
+ NoticeResponse 和 ParameterStatus 消息可能穿插在 CopyData 消息之间;前端必须处理这些情况,并应准备好处理其他异步消息类型(参见 )。除此之外,可以将任何除 CopyData 或 CopyDone 以外的消息类型视为拷贝出模式的终止标志。
+
- 还有另一种与拷贝相关的模式,称为双向拷贝(copy-both),它允许数据以高速批量方式在客户端与服务器之间双向传输。当处于 walsender 模式的后端执行START_REPLICATION 语句时,会启动双向拷贝模式。后端会向前端发送一条 CopyBothResponse 消息。此后,前端和后端都可以发送 CopyData 消息,直到任一方发送 CopyDone 消息。客户端发送 CopyDone 后,连接会从双向拷贝模式切换到拷贝出模式,客户端也不得再发送 CopyData。类似地,当服务器发送 CopyDone 后,连接会进入拷贝入模式,服务器也不得再发送 CopyData。当双方都发送完 CopyDone 后,拷贝模式结束,后端恢复到原先的命令处理模式。如果双向拷贝模式期间发生后端检测到的错误,后端会发出 ErrorResponse,丢弃前端消息直到收到 Sync,然后发出 ReadyForQuery 并返回正常处理。前端应将收到 ErrorResponse 视为双向拷贝终止的信号;在这种情况下不应再发送 CopyDone。关于在双向拷贝模式上传输的子协议,见。
+ 还有另一种与拷贝相关的模式,称为双向拷贝(copy-both),它允许高速批量地向服务器发送数据以及 从服务器接收数据。当处于 walsender 模式的后端执行START_REPLICATION 语句时,会启动双向拷贝模式。后端会向前端发送一条 CopyBothResponse 消息。此后,前端和后端都可以发送 CopyData 消息,直到任一方发送 CopyDone 消息。客户端发送 CopyDone 后,连接会从双向拷贝模式切换到拷贝出模式,客户端也不得再发送 CopyData。类似地,当服务器发送 CopyDone 后,连接会进入拷贝入模式,服务器也不得再发送 CopyData。当双方都发送完 CopyDone 后,拷贝模式结束,后端恢复到原先的命令处理模式。如果双向拷贝模式期间发生后端检测到的错误,后端会发出 ErrorResponse,丢弃前端消息直到收到 Sync,然后发出 ReadyForQuery 并返回正常处理。前端应将收到 ErrorResponse 视为双向拷贝终止的信号;在这种情况下不应再发送 CopyDone。关于在双向拷贝模式上传输的子协议,见。
- CopyInResponse、CopyOutResponse和CopyBothResponse消息包括域和格式代码,域告诉前端每行的列数,而格式代码则用于具体每个列(就目前的实现而言,一个给定COPY 操作中的所有列都将使用同样的格式,但是消息设计并不做这个假设)。
-
+ CopyInResponse、CopyOutResponse 和 CopyBothResponse 消息包含一些字段,用于告知前端每行的列数以及每列所使用的格式代码。(在当前实现中,同一次COPY 操作的所有列都使用相同格式,但消息设计并不作此假设。)
+
@@ -699,8 +691,8 @@
- 如果前端发出一个LISTEN 命令, 那么无论何时在为同一个通道名NOTIFY 时,后端将发送一个NotificationResponse消息(不要和NoticeResponse搞混!)。
-
+ 如果前端发出LISTEN 命令,那么每当针对同一通道名执行NOTIFY 命令时,后端都会发送一条 NotificationResponse 消息(不要与 NoticeResponse 混淆)。
+
@@ -718,11 +710,11 @@
- 要发出一条取消请求,前端打开一个与服务器的新连接并且发送一条CancelRequest消息, 而不是通常在新连接中经常发送的StartupMessage消息。服务器将处理这个请求然后关闭连接。 出于安全原因,对取消请求消息不做直接的响应。
-
+ 要发出取消请求,前端会新建到服务器的连接,并发送 CancelRequest 消息,而不是新连接通常发送的 StartupMessage 消息。服务器处理该请求后便会关闭连接。出于安全原因,服务器不会直接回复取消请求消息。
+
- 除非CancelRequest消息包含在连接启动过程中传递给前端的相同的关键数据(PID和密钥),否则它将被忽略。如果该请求匹配当前运行着的后端的PID和密钥, 则退出当前查询的处理(目前的实现里采用的方法是向正在处理该查询的后端进程发送一个特殊的信号)。
+ 除非CancelRequest消息包含在连接启动过程中传递给前端的相同的密钥数据(PID 和密钥),否则它将被忽略。如果该请求匹配当前运行着的后端的PID和密钥, 则中止当前查询的处理(目前的实现里采用的方法是向正在处理该查询的后端进程发送一个特殊的信号)。
@@ -730,7 +722,7 @@
- 这么做是对安全性和有效性通盘考虑的结果,前端没有直接的方法获知一个取消请求是否成功。它必须继续等待后端对查询响应。发出一个取消仅仅是增加了当前查询快些结束的可能性, 同时也增加了当前查询会伴随着一条错误消息失败而不是成功执行的可能性。
+ 这么做是对安全性和效率通盘考虑的结果,前端没有直接的方法获知一个取消请求是否成功。它必须继续等待后端对查询响应。发出一个取消仅仅是增加了当前查询快些结束的可能性, 同时也增加了当前查询会伴随着一条错误消息失败而不是成功执行的可能性。
@@ -750,11 +742,11 @@
- 其他终止场景来自各种故障,例如任一端发生内核转储、通信链路中断、消息边界同步丢失等。如果前端或后端看到连接意外关闭,就应清理并终止。若前端不想自行终止,也可以重新联系服务器以启动一个新的后端。如果收到无法识别的消息类型,同样建议关闭连接,因为这通常意味着消息边界同步已经丢失。
+ 其他终止场景来自各种故障,例如任一端发生 core dump、通信链路中断、消息边界同步丢失等。如果前端或后端看到连接意外关闭,就应清理并终止。若前端不想自行终止,也可以重新联系服务器以启动一个新的后端。如果收到无法识别的消息类型,同样建议关闭连接,因为这通常意味着消息边界同步已经丢失。
- 不管是正常还是不正常的终止,任何打开的事务都会回滚而不是提交。不过,我们应该注意的是如果一个前端在一个非SELECT 查询正在处理的时候断开, 那么后端很可能在发现断开之前先完成查询的处理。如果查询处于任何事务块之外(BEGIN ... COMMIT 序列),那么其结果很可能在得知断开之前被提交。
+ 不管是正常还是不正常的终止,任何打开的事务都会回滚而不是提交。不过,我们应该注意的是如果一个前端在一个非SELECT 查询正在处理的时候断开, 那么后端很可能在发现断开之前先完成查询的处理。如果查询处于任何事务块之外(BEGIN ... COMMIT 序列),那么其结果可能在发现连接断开之前被提交。
@@ -770,12 +762,16 @@
前端还应准备好处理服务器对 SSLRequest 返回的 ErrorMessage 响应。只有当服务器版本早于 PostgreSQL 引入 SSL 支持时,才会发生这种情况。(这样的服务器已经非常古老,现实中可能已不存在。)此时必须关闭连接,但前端可以选择建立一个新连接,并在不请求 SSL 的情况下继续通信。
- 当可以执行 SSL 加密时,服务器预计仅发送单个 S 字节,然后等待前端启动 SSL 握手。如果此时有其他可读取的字节,则很可能意味着中间人正在尝试执行缓冲区填充攻击(CVE-2021-23222 )。前端应该编写代码,要么从套接字中恰好读取一个字节,然后将套接字交给他们的 SSL 库,要么在发现他们已经读取到额外的字节时将其视为协议违规。
+ 当可以执行 SSL 加密时,服务器应仅发送单个 S 字节,然后等待前端启动 SSL 握手。如果此时有其他可读取的字节,则很可能意味着中间人正在尝试执行缓冲区填充攻击(CVE-2021-23222 )。前端应该编写代码,要么从套接字中恰好读取一个字节,然后将套接字交给所用的 SSL 库,要么在发现已经读取到额外的字节时将其视为协议违规。
- 如果建立连接是为了发送 CancelRequest 消息,也可以先发送 SSLRequest。
+
+ 如果建立连接是为了发送 CancelRequest 消息,也可以先发送 SSLRequest。
+
- 虽然协议本身没有提供让服务器强制使用 SSL 加密的方法,但管理员可以配置服务器,使其在认证检查中拒绝未加密的会话。
+
+ 虽然协议本身没有提供让服务器强制使用SSL 加密的方法,但管理员可以配置服务器,使其在认证检查中拒绝未加密的会话。
+
@@ -797,24 +793,21 @@
- 客户端从列表中选择一个支持的机制,并向服务器发送一个SASLInitialResponse消息。
- 该消息包括所选机制的名称,以及如果所选机制使用的话,还包括一个可选的初始客户端响应。
-
+ 客户端从列表中选择一种受支持的机制,并向服务器发送 SASLInitialResponse 消息。消息包含所选机制的名称;如果该机制使用初始客户端响应,消息还可以包含这一可选响应。
+
- 一个或多个服务器挑战和客户端响应消息将随后而来。每个服务器挑战都是在一个
- AuthenticationSASLContinue 消息中发送的,随后是客户端在一个 SASLResponse
- 消息中的响应。这些消息的具体内容是特定于机制的。
-
+ 随后会进行一轮或多轮服务器挑战和客户端响应。每次服务器挑战都通过 AuthenticationSASLContinue 消息发送,随后客户端通过 SASLResponse 消息响应。消息的具体内容取决于所用机制。
+
- 最后,当认证交换成功完成时,服务器会发送可选的 AuthenticationSASLFinal 消息,随后立即发送 AuthenticationOk。AuthenticationSASLFinal 包含机制特定的附加数据;若该机制不需要完成时附加数据,则不会发送 AuthenticationSASLFinal。
-
+ 最后,认证交换成功完成时,服务器会发送 AuthenticationSASLFinal 消息,紧接着发送 AuthenticationOk 消息。AuthenticationSASLFinal 包含从服务器发给客户端的附加数据,其具体内容取决于所选认证机制。如果该认证机制不使用在完成时发送的附加数据,则不会发送 AuthenticationSASLFinal 消息。
+
@@ -834,13 +827,8 @@
- SCRAM规范规定密码也必须是UTF-8编码,并且使用SASLprep 算法处理。
- 然而,PostgreSQL 不要求密码必须使用UTF-8编码。
- 当用户设置密码时,无论实际使用的编码是什么,都会像使用UTF-8一样使用SASLprep进行处理。
- 但是,如果密码不是合法的UTF-8字节序列,或者包含SASLprep算法禁止的UTF-8字节序列,
- 则会使用原始密码而不进行SASLprep处理,而不是抛出错误。这样可以在密码为UTF-8时对其进行规范化,
- 但仍允许使用非UTF-8密码,并且不需要系统知道密码使用的编码方式。
-
+ SCRAM 规范规定密码也必须采用 UTF-8 编码,并通过SASLprep 算法处理。不过,PostgreSQL 并不要求密码使用 UTF-8。设置用户密码时,无论实际采用何种编码,都会将其视作 UTF-8 并用 SASLprep 处理。但是,如果密码不是合法的 UTF-8 字节序列,或者包含 SASLprep 算法禁止的 UTF-8 字节序列,就会直接使用未经 SASLprep 处理的原始密码,而不抛出错误。这样既能对 UTF-8 密码进行规范化,又允许使用非 UTF-8 密码,而且不要求系统知道密码采用何种编码。
+
尚未实现通道绑定 。
@@ -880,17 +868,23 @@
流复制协议
要发起流式复制,前端在启动消息中发送 replication 参数。布尔值 true 告知后端进入 walsender 模式,在该模式下可以发出一小组复制命令,而不是 SQL 语句。walsender 模式只能使用简单查询协议。启用 后,复制命令会记录到服务器日志中。传入值 database 会指示 walsender 连接到 dbname 参数指定的数据库,从而允许此连接用于从该数据库进行逻辑复制。
-为了测试复制命令,可以通过psql 或其他使用libpq 的工具建立复制连接,连接字符串中应包含replication 选项,例如:
+
+ 为了测试复制命令,可以通过 psql 或其他使用 libpq 的工具建立复制连接,连接字符串中应包含 replication 选项,例如:
+
psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
- 不过,通常更有用的做法是使用(用于物理复制)或(用于逻辑复制)。
+
+不过,通常更有用的做法是使用 (用于物理复制)或 (用于逻辑复制)。
+
walsender 模式接受以下命令:
IDENTIFY_SYSTEM
- 识别系统
+ IDENTIFY_SYSTEM
- 请求服务器标识自身。服务器返回一个只有一行的结果集,包含四个字段:
+
+ 请求服务器标识自身。服务器会返回一个包含四个字段的单行结果集:
+
@@ -899,7 +893,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
systemid (text )
- 标识数据库集簇的唯一系统标识符。可用于检查初始化备库的基础备份是否来自同一个数据库集簇。
+
+ 用于标识该集簇的唯一系统标识符。它可用于检查初始化备库所用的基础备份是否来自同一个集簇。
+
@@ -924,7 +920,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
dbname (text )
- 所连接的数据库,或 null。
+
+ 当前连接到的数据库,或为 null。
+
@@ -983,7 +981,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
content (bytea )
- 时间线历史文件的内容。
+
+ 时间线历史文件的内容。
+
@@ -1013,7 +1013,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
output_plugin>
- 用于逻辑解码的输出插件名称(参见 )。
+
+ 用于逻辑解码的输出插件的名称(参见)。
+
@@ -1088,22 +1090,16 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
START_REPLICATION [ SLOT slot_name ] [ PHYSICAL ] XXX/XXX [ TIMELINE tli ]
- 开始复制
+ START_REPLICATION
- 指示服务器开始流式传输WAL,从WAL位置XXX/XXX 开始。
- 如果指定了TIMELINE 选项,则流式传输将从时间线tli 开始;
- 否则,将选择服务器当前的时间线。如果请求的WAL部分已经被回收,服务器可能会回复错误。
- 成功时,服务器将用CopyBothResponse消息回复,然后开始向前端流式传输WAL。
-
+ 指示服务器从 WAL 位置 XXX/XXX 开始流式传输 WAL。如果指定了 TIMELINE 选项,则从时间线 tli 开始传输;否则选择服务器当前的时间线。服务器可以返回错误,例如请求的 WAL 部分已被回收时。成功时,服务器返回 CopyBothResponse 消息,然后开始向前端流式传输 WAL。
+
- 如果通过slot_name 提供了复制槽名称,
- 那么在复制进行期间会更新该复制槽,以便服务器知道哪些 WAL 段,
- 以及在启用了 hot_standby_feedback 时,哪些事务
- 仍然被备库所需要。
-
+ 如果通过 slot_name 提供了复制槽名称,该复制槽会随着复制的进行而更新,使服务器知道备库仍需要哪些 WAL 段,以及在启用 hot_standby_feedback 时仍需要哪些事务。
+
如果客户端请求的时间线不是最新时间线,但属于服务器的历史,服务器会从请求的起点开始,流式传输该时间线上的所有 WAL,直到服务器切换到另一条时间线的位置。如果客户端请求的流式传输起点恰好位于旧时间线的末尾,服务器会立即返回 CommandComplete,而不进入 COPY 模式。
@@ -1354,7 +1350,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
DROP_REPLICATION_SLOT slot_name WAIT
- 删除复制槽
+ DROP_REPLICATION_SLOT
删除复制槽,释放任何保留的服务器端资源。如果该槽是逻辑槽,且创建它的数据库与 walsender 当前连接的数据库不同,则此命令失败。
@@ -1396,9 +1392,8 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
- 设置备份的标签。如果未指定,则将使用base backup 作为备份标签。
- 标签的引号使用规则与打开的标准SQL字符串相同。
-
+ 设置备份标签。如果未指定,则使用 base backup 作为备份标签。标签的引号规则与启用 时的标准 SQL 字符串相同。
+
@@ -1491,7 +1486,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
size (int8 )
- 如果请求了进度报告,则为表空间的大致大小;否则为空值。
+
+ 如果请求了进度报告,则为表空间的大致大小;否则为 null。
+
@@ -1545,7 +1542,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
- 逻辑复制协议
+ 逻辑流复制协议
本节介绍逻辑复制协议,它是一种以复制命令START_REPLICATION
@@ -1554,7 +1551,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
- 逻辑复制协议构建在物理流复制协议的底层机制之上。
+ 逻辑流复制协议构建在物理流复制协议的基本机制之上。
@@ -1609,7 +1606,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
逻辑复制协议逐个发送事务。这意味着,一对 Begin 和 Commit 消息之间的所有消息都属于同一个事务。
- 每个被发送的事务都包含零条或多条 DML 消息(插入、更新、删除)。在级联场景下,它还会包含 Origin 消息。Origin 消息表示该事务产生于另一个复制节点。由于逻辑复制协议中的复制节点可以是任意实现,因此唯一标识符就是该源头的名称。下游是否以及如何处理这一信息,由其自行决定。Origin 消息总是在事务中的任何 DML 消息之前发送。
+ 每个发送的事务都包含零条或多条 DML 消息(Insert、Update、Delete)。在级联配置中,还可能包含 Origin 消息。Origin 消息表示该事务源自另一个复制节点。由于逻辑复制协议中的复制节点几乎可以是任何实现,因此唯一的标识符就是复制源的名称。下游负责按需处理这一信息(如果需要处理)。Origin 消息总是在事务中的任何 DML 消息之前发送。
@@ -1674,9 +1671,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
- 对后端返回的字符串长度,没有预定义的限制 。
- 前端较好的编码策略是使用可扩展缓冲区,以便接收所有能放进内存的内容。
- 如果做不到这一点,就应读取完整字符串,并丢弃不适合固定大小缓冲区的尾随字符。
+ 后端返回的字符串长度没有预定义的限制 。前端较好的编码策略是使用可扩展缓冲区,以便接收所有能放进内存的内容。如果做不到这一点,就应读取完整字符串,并丢弃固定大小的缓冲区容纳不下的尾随字符。
@@ -1701,8 +1696,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
消息格式
- 本节描述每条消息的详细格式。每条消息都标记了可由前端(F)、后端(B)或双方(F&B)发送。
- 请注意,虽然每条消息开头都带有字节计数,但大多数消息格式都定义为无需参考该计数也能确定消息边界。这一设计最初是出于历史原因(早期已废弃的协议 v2 没有显式长度字段),同时也有助于有效性校验。
+ 本节描述每条消息的详细格式。每条消息都标明它可以由前端(F)、后端(B)或双方(F & B)发送。注意,虽然每条消息开头都有字节计数,但消息格式的定义使得无需参考该计数也能确定消息的结束位置。这有助于检查消息的有效性。(CopyData 消息是例外,因为它构成数据流的一部分,任何单条 CopyData 消息的内容都无法独立解释。)
@@ -1723,7 +1717,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1754,7 +1748,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1784,7 +1778,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1814,7 +1808,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(12)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1851,7 +1845,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1882,7 +1876,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1913,7 +1907,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1944,7 +1938,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1981,7 +1975,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2019,7 +2013,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2056,7 +2050,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2093,7 +2087,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(12)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2130,7 +2124,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2148,13 +2142,13 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int16
-后续参数格式码的数量(下文以 C 表示)。可以为零,表示没有参数,或者所有参数都使用默认格式(文本);也可以为一,此时指定的格式码应用于所有参数;还可以等于实际参数数量。
+后续参数格式代码的数量(下文以 C 表示)。可以为零,表示没有参数,或者所有参数都使用默认格式(文本);也可以为一,此时指定的格式代码应用于所有参数;还可以等于实际参数数量。
Int16[C ]
-参数格式码。目前每个格式码必须为零(文本)或一(二进制)。
+参数格式代码。目前每个格式代码必须为零(文本)或一(二进制)。
@@ -2173,20 +2167,20 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Byten
-参数值,格式由对应的格式码指明。n 为上述长度。
+参数值,格式由对应的格式代码指明。n 为上述长度。
最后一个参数之后是以下字段:
Int16
-后续结果列格式码的数量(下文以 R 表示)。可以为零,表示没有结果列,或者所有结果列都应使用默认格式(文本);也可以为一,此时指定的格式码应用于所有结果列(如果有);还可以等于查询实际的结果列数量。
+后续结果列格式代码的数量(下文以 R 表示)。可以为零,表示没有结果列,或者所有结果列都应使用默认格式(文本);也可以为一,此时指定的格式代码应用于所有结果列(如果有);还可以等于查询实际的结果列数量。
Int16[R ]
-结果列格式码。目前每个格式码必须为零(文本)或一(二进制)。
+结果列格式代码。目前每个格式代码必须为零(文本)或一(二进制)。
@@ -2210,7 +2204,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2234,7 +2228,7 @@ CancelRequest (F)
- 消息内容的长度,以字节为单位,包括此长度字段本身。
+ 消息内容的长度(以字节为单位),包括其自身。
@@ -2290,7 +2284,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2326,7 +2320,7 @@ CancelRequest (F)
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2351,7 +2345,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2415,7 +2409,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2452,7 +2446,7 @@ CancelRequest (F)
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2481,7 +2475,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2510,13 +2504,13 @@ CancelRequest (F)
Byte1('G')
-标识消息为开始复制输入的响应。前端此时必须发送复制输入数据(如果尚未准备好,应发送 CopyFail 消息)。
+将该消息标识为开始 COPY 输入的响应。前端此时必须发送 COPY 输入数据(如果尚未准备好,应发送 CopyFail 消息)。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2565,13 +2559,13 @@ CancelRequest (F)
Byte1('H')
-标识消息为开始复制输出的响应。该消息之后会发送复制输出数据。
+将该消息标识为开始 COPY 输出的响应。此消息之后会发送 COPY 输出数据。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2620,13 +2614,13 @@ CancelRequest (F)
Byte1('W')
-标识消息为开始双向复制的响应。此消息仅用于流复制。
+将该消息标识为开始双向 COPY 的响应。此消息仅用于流复制。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2682,7 +2676,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2697,7 +2691,7 @@ CancelRequest (F)
Int32
-列值的长度,以字节为单位(不包括本长度字段自身)。可以为零。特殊值 -1 表示列值为 NULL,此时后面没有值字节。
+列值的长度,以字节为单位(不包括此长度字段本身)。可以为零。特殊值 -1 表示 NULL 列值。为 NULL 时,后面不再有值的字节。
@@ -2728,14 +2722,14 @@ CancelRequest (F)
- 标识消息为描述命令。
+ 将该消息标识为 Describe 命令。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2778,7 +2772,7 @@ CancelRequest (F)
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2807,7 +2801,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
消息体由一个或多个带标识的字段组成,最后以一个零字节终止。字段可以按任意顺序出现。每个字段包含以下内容:
@@ -2846,14 +2840,14 @@ CancelRequest (F)
- 标识消息为一个执行命令。
+ 将该消息标识为 Execute 命令。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2888,14 +2882,14 @@ CancelRequest (F)
- 将消息标识为Flush命令。
+ 将该消息标识为 Flush 命令。
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2924,7 +2918,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2957,7 +2951,7 @@ CancelRequest (F)
Int32
-参数值的长度,以字节为单位(不包括本长度字段自身)。可以为零。特殊值 -1 表示参数值为 NULL,此时后面没有值字节。
+参数值的长度,以字节为单位(不包括此长度字段本身)。可以为零。特殊值 -1 表示 NULL 参数值。为 NULL 时,后面不再有值的字节。
@@ -3002,13 +2996,13 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
Int32
-函数结果值的长度,以字节为单位(不包括本长度字段自身)。可以为零。特殊值 -1 表示函数结果为 NULL,此时后面没有值字节。
+函数结果值的长度,以字节为单位(不包括此长度字段本身)。可以为零。特殊值 -1 表示 NULL 函数结果。为 NULL 时,后面不再有值的字节。
@@ -3047,7 +3041,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3082,7 +3076,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3130,7 +3124,7 @@ CancelRequest (F)
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3159,7 +3153,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
消息体由一个或多个带标识的字段组成,最后以一个零字节终止。字段可以按任意顺序出现。每个字段包含以下内容:
@@ -3205,7 +3199,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3223,7 +3217,7 @@ CancelRequest (F)
String
-通知进程传来的载荷
字符串。
+通知进程传来的有效载荷
字符串。
@@ -3252,7 +3246,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3295,7 +3289,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3328,14 +3322,14 @@ CancelRequest (F)
- 将消息标识为解析命令。
+ 将该消息标识为 Parse 命令。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3384,14 +3378,14 @@ CancelRequest (F)
- 将消息标识为解析完成指示器。
+ 将该消息标识为 Parse 完成指示。
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3421,7 +3415,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3450,15 +3444,14 @@ CancelRequest (F)
- 标识消息为 portal 挂起指示器。
- 请注意,仅当执行消息的行数限制达到时才会出现此消息。
+ 将该消息标识为 portal 挂起指示。注意,仅当达到 Execute 消息指定的行数限制时,才会出现此消息。
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3487,7 +3480,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3524,7 +3517,7 @@ CancelRequest (F)
Int32(5)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3563,7 +3556,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3622,7 +3615,7 @@ CancelRequest (F)
Int16
-字段所使用的格式代码。目前为零(文本)或一(二进制)。对于 Describe 的语句变体所返回的 RowDescription,格式代码尚未确定,始终为零。
+字段所使用的格式代码。目前为零(文本)或一(二进制)。对于 Describe 针对预备语句的变体所返回的 RowDescription,格式代码尚未确定,始终为零。
@@ -3652,7 +3645,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3703,7 +3696,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3729,7 +3722,7 @@ CancelRequest (F)
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3760,7 +3753,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3844,14 +3837,14 @@ CancelRequest (F)
- 将消息标识为同步命令。
+ 将该消息标识为 Sync 命令。
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3880,7 +3873,7 @@ CancelRequest (F)
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3896,7 +3889,7 @@ CancelRequest (F)
-错误和通知消息域
+错误和通知消息字段
本节描述了ErrorResponse和NoticeResponse消息中可能出现的字段。每个字段类型都有一个单字节的标识符。
@@ -3910,11 +3903,7 @@ CancelRequest (F)
- 严重性: 字段内容为ERROR , FATAL , 或
- PANIC (在错误消息中), 或
- WARNING , NOTICE , DEBUG ,
- INFO , 或 LOG (在通知消息中),
- 或者这些内容的本地化翻译。始终存在。
+ 严重性:字段内容为 ERROR 、FATAL 或 PANIC (在错误消息中),或 WARNING 、NOTICE 、DEBUG 、INFO 或 LOG (在通知消息中),或这些内容的本地化翻译。始终存在。
@@ -3924,11 +3913,7 @@ CancelRequest (F)
- 严重性:字段内容为 ERROR 、FATAL 或
- PANIC (在错误消息中),或 WARNING 、NOTICE 、DEBUG 、
- INFO 或 LOG (在通知消息中)。
- 这与S 字段相同,只是内容不会被本地化。仅在由PostgreSQL 版本9.6
- 及更高版本生成的消息中存在。
+ 严重性:字段内容为 ERROR 、FATAL 或 PANIC (在错误消息中),或 WARNING 、NOTICE 、DEBUG 、INFO 或 LOG (在通知消息中)。它与 S 字段相同,只是内容从不本地化。仅在 PostgreSQL 9.6 及更高版本生成的消息中存在。
@@ -3938,7 +3923,7 @@ CancelRequest (F)
- Code: 错误的SQLSTATE代码(参见)。不可本地化。始终存在。
+ 代码:错误的 SQLSTATE 代码(见 )。不可本地化。始终存在。
@@ -3948,9 +3933,7 @@ CancelRequest (F)
- 消息: 主要的人类可读错误消息。
- 这应该准确但简洁(通常一行)。
- 总是存在。
+ 消息:主要的可读错误消息。应准确而简洁(通常为一行)。始终存在。
@@ -3960,7 +3943,7 @@ CancelRequest (F)
- 详细信息:一个可选的次要错误消息,提供有关问题的更多详细信息。可能会跨多行。
+ 详细信息:可选的次要错误消息,提供有关该问题的更多细节。可能占多行。
@@ -3970,9 +3953,7 @@ CancelRequest (F)
- 提示: 关于问题应该怎么做的一个可选建议。
- 这意在与细节不同,它提供建议(可能不合适)而不是硬性事实。
- 可能会跨越多行。
+ 提示:可选的建议,说明如何处理该问题。它与详细信息的区别在于,它提供建议(可能并不合适),而非确凿事实。可能占多行。
@@ -4014,9 +3995,7 @@ CancelRequest (F)
- Where: 错误发生的上下文指示。
- 目前包括活动的过程语言函数和内部生成查询的调用堆栈回溯。
- 跟踪每行一个条目,最近的在前。
+ 上下文:说明错误发生时的上下文。目前包括活跃的过程语言函数和内部生成的查询的调用栈回溯。回溯每行一个条目,最近的调用在前。
@@ -4026,7 +4005,7 @@ CancelRequest (F)
- Schema name: 如果错误与特定数据库对象相关联,则为包含该对象的模式的名称(如果有)。
+ 模式名:如果错误与某个特定数据库对象有关,则为包含该对象的模式名称(如果有)。
@@ -4036,7 +4015,7 @@ CancelRequest (F)
- 表名: 如果错误与特定表相关联,则为表的名称。(有关表模式名称的名称,请参考模式名称字段。)
+ 表名:如果错误与某个特定表有关,则为该表的名称。(表所在模式的名称见模式名字段。)
@@ -4046,7 +4025,7 @@ CancelRequest (F)
- 列名: 如果错误与特定表列相关联,则为列的名称。(请参考模式和表名字段以识别表。)
+ 列名:如果错误与某个特定表列有关,则为该列的名称。(通过模式名和表名字段确定该表。)
@@ -4056,8 +4035,7 @@ CancelRequest (F)
- 数据类型名称: 如果错误与特定数据类型相关联,则为数据类型的名称。
- (有关数据类型模式的名称,请参阅模式名称字段。)
+ 数据类型名:如果错误与某个特定数据类型有关,则为该数据类型的名称。(数据类型所在模式的名称见模式名字段。)
@@ -4067,8 +4045,7 @@ CancelRequest (F)
- 约束名称: 如果错误与特定约束相关联,则为约束的名称。请参考上面列出的字段,了解相关表或域。
- (为此,即使索引不是使用约束语法创建的,也将其视为约束。)
+ 约束名:如果错误与某个特定约束有关,则为该约束的名称。相关的表或域见上述字段。(这里将索引也视为约束,即使它不是用约束语法创建的。)
@@ -4078,7 +4055,7 @@ CancelRequest (F)
- 文件: 报告错误的源代码位置的文件名。
+ 文件:报告错误的源代码位置所在的文件名。
@@ -4088,7 +4065,7 @@ CancelRequest (F)
- Line: 源代码位置的行号,报告错误的位置。
+ 行号:报告错误的源代码位置所在的行号。
@@ -4098,7 +4075,7 @@ CancelRequest (F)
- Routine: 报告错误的源代码例程的名称。
+ 例程:报告错误的源代码例程的名称。
@@ -4108,15 +4085,12 @@ CancelRequest (F)
- 模式名称、表名称、列名称、数据类型名称和约束名称的字段仅针对有限数量的错误类型提供;
- 请参阅。前端不应假设任何这些字段的存在就保证了另一个字段的存在。
- 核心错误源观察到上述相互关系,但用户定义的函数可能以其他方式使用这些字段。
- 同样地,客户端不应假设这些字段表示当前数据库中的当代对象。
+ 模式名、表名、列名、数据类型名和约束名字段仅针对有限的几类错误提供,见 。前端不应假设其中任何字段的存在就保证了另一个字段的存在。核心错误源遵循上述相互关系,但用户定义的函数可能以其他方式使用这些字段。同样,客户端不应假设这些字段表示当前数据库中现存的对象。
- 客户端负责格式化显示的信息以满足其需求;特别是应根据需要换行。错误消息字段中出现的换行符应被视为段落分隔符,而不是换行符。
+ 客户端负责按自身需要格式化显示的信息;尤其应根据需要将长行断开。错误消息字段中的换行符应视为段落分隔符,而非行分隔符。
@@ -4144,7 +4118,7 @@ CancelRequest (F)
- 将消息标识为开始消息。
+ 将该消息标识为 Begin 消息。
@@ -4188,7 +4162,7 @@ CancelRequest (F)
- 标识消息为提交消息。
+ 将该消息标识为 Commit 消息。
@@ -4237,7 +4211,7 @@ CancelRequest (F)
Byte1('O')
-标识消息为复制源消息。
+将该消息标识为 Origin 消息。
@@ -4259,7 +4233,7 @@ CancelRequest (F)
- 请注意,在单个事务中可能存在多个Origin消息。
+ 注意,单个事务中可能有多条 Origin 消息。
@@ -4274,7 +4248,7 @@ CancelRequest (F)
Byte1('R')
-将该消息标识为关系消息。
+将该消息标识为 Relation 消息。
@@ -4301,7 +4275,7 @@ CancelRequest (F)
- 关系的复制标识设置(与relreplident 在pg_class 中相同)。
+ 关系的复制标识设置(与 pg_class 中的 relreplident 相同)。
@@ -4336,7 +4310,7 @@ CancelRequest (F)
- 列的类型修饰符 (atttypmod )。
+ 列的类型修饰符(atttypmod )。
@@ -4355,7 +4329,7 @@ CancelRequest (F)
Byte1('Y')
-将该消息标识为类型消息。
+将该消息标识为 Type 消息。
@@ -4391,13 +4365,13 @@ CancelRequest (F)
Byte1('I')
-将该消息标识为插入消息。
+将该消息标识为 Insert 消息。
Int32
-关系的 ID,与关系消息中的 ID 对应。
+关系的 ID,与 Relation 消息中的 ID 对应。
@@ -4428,13 +4402,13 @@ CancelRequest (F)
Byte1('U')
-将该消息标识为更新消息。
+将该消息标识为 Update 消息。
Int32
-关系的 ID,与关系消息中的 ID 对应。
+关系的 ID,与 Relation 消息中的 ID 对应。
@@ -4490,13 +4464,13 @@ CancelRequest (F)
Byte1('D')
-将该消息标识为删除消息。
+将该消息标识为 Delete 消息。
Int32
-关系的 ID,与关系消息中的 ID 对应。
+关系的 ID,与 Relation 消息中的 ID 对应。
diff --git a/zh/10/rangetypes.sgml b/zh/10/rangetypes.sgml
index 92eca5d6..d8d10cf5 100644
--- a/zh/10/rangetypes.sgml
+++ b/zh/10/rangetypes.sgml
@@ -4,7 +4,7 @@
范围类型
- range type
+ 范围类型
@@ -18,7 +18,9 @@
内置范围类型
- PostgreSQL 提供以下内置范围类型:
+
+ PostgreSQL 自带下列内置范围类型:
+
int4range — integer 的范围
@@ -37,7 +39,9 @@
daterange — date 的范围
- 此外,还可以定义自己的范围类型;参见了解更多信息。
+
+ 此外,你还可以定义自己的范围类型;详见。
+
@@ -92,15 +96,15 @@ SELECT isempty(numrange(1, 5));
无限(无界)范围
- 范围的下界可以省略,这意味着所有小于上界的值都包含在范围内,例如(,3] 。同样,如果省略范围的上界,则所有大于下界的值都包含在范围内。如果上下界都被省略,则该元素类型的所有值都被认为处于该范围内。把缺失的界限指定为包含,会自动转换为排除,例如[,] 会转换为(,) 。你可以把这些缺失的值看作 +/-infinity,但它们是特殊的范围类型值,并且被认为超出了任何范围元素类型的 +/-infinity 值。
+ 范围的下界可以省略,这意味着所有小于上界的值都包含在范围内,例如(,3] 。同样,如果省略范围的上界,则所有大于下界的值都包含在范围内。如果上下界都被省略,则该元素类型的所有值都被认为处于该范围内。把缺失的界限指定为包含,会自动转换为排除,例如[,] 会转换为(,) 。你可以把这些缺失的值看作正负无穷大,但它们是特殊的范围类型值,并且被认为超出了任何范围元素类型的正负无穷大值。
- 具有infinity
概念的元素类型可以将其用作显式界限值。例如,对于时间戳范围,[today,infinity) 不包括特殊的timestamp 值infinity ,而[today,infinity] 则包括它,[today,) 和[today,] 也一样。
+ 具有无穷大
概念的元素类型可以将其用作显式界限值。例如,对于时间戳范围,[today,infinity) 不包括特殊的timestamp 值infinity ,而[today,infinity] 则包括它,[today,) 和[today,] 也一样。
- 函数lower_inf 和upper_inf 分别测试范围的下界和上界是否为无限。
+ 函数lower_inf 和upper_inf 分别测试范围是否没有下界和上界。
@@ -259,23 +263,23 @@ SELECT '[11:10, 23:00]'::timerange;
索引
- range type
- indexes on
+ 范围类型
+ 索引
可以为范围类型的表列创建 GiST 和 SP-GiST 索引。例如,创建 GiST 索引:
CREATE INDEX reservation_idx ON reservation USING GIST (during);
- GiST 或 SP-GiST 索引可以加速涉及以下范围操作符的查询:= ,
- && ,
- <@ ,
- @> ,
- << ,
- >> ,
- -|- ,
+GiST 或 SP-GiST 索引可以加速涉及以下范围操作符的查询:= 、
+ && 、
+ <@ 、
+ @> 、
+ << 、
+ >> 、
+ -|- 、
&< 和&> (参见了解更多信息)。
- 此外,也可以为范围类型的表列创建 B-树和哈希索引。对于这些索引类型,基本上唯一有用的范围操作就是等值。系统为范围值定义了对应< 和> 操作符的 B-树排序顺序,但这种顺序相当任意,在现实中通常并没有什么用处。范围类型的 B-树和哈希支持主要是为了允许在查询内部进行排序和哈希,而不是用于创建实际的索引。
+ 此外,也可以为范围类型的表列创建 B-树和 hash 索引。对于这些索引类型,基本上唯一有用的范围操作就是等值。系统为范围值定义了对应< 和> 操作符的 B-树排序顺序,但这种顺序相当任意,在现实中通常并没有什么用处。范围类型的 B-树和 hash 支持主要是为了允许在查询内部进行排序和 hash 运算,而不是用于创建实际的索引。
@@ -283,8 +287,8 @@ CREATE INDEX reservation_idx ON reservation USING GIST (during);
范围上的约束
- range type
- exclude
+ 范围类型
+ 排他约束
diff --git a/zh/10/recovery-config.sgml b/zh/10/recovery-config.sgml
index 20c3d614..368c6c6c 100644
--- a/zh/10/recovery-config.sgml
+++ b/zh/10/recovery-config.sgml
@@ -4,9 +4,9 @@
恢复配置
- configuration
- of recovery
- 一个备库
+ 配置
+ 恢复
+ 备库
本章介绍 recovery.conf recovery.conf 文件中可用的设置。它们只在恢复期间生效。如果之后还要进行恢复,必须重新设置这些参数。恢复开始后,就不能再更改它们。
diff --git a/zh/10/ref/alter_extension.sgml b/zh/10/ref/alter_extension.sgml
index 892e9d06..082101cf 100644
--- a/zh/10/ref/alter_extension.sgml
+++ b/zh/10/ref/alter_extension.sgml
@@ -164,7 +164,7 @@ ALTER EXTENSION name DROP function_name
operator_name
- 要添加到扩展或从扩展中移除的对象名称。表、聚合、域、外部表、函数、操作符、操作符类、操作符族、序列、文本搜索对象、类型和视图的名称可以带模式限定。
+ 要添加到扩展或从扩展中移除的对象名称。表、聚合、域、外部表、函数、操作符、操作符类、操作符族、序列、文本检索对象、类型和视图的名称可以带模式限定。
diff --git a/zh/10/ref/alter_tsconfig.sgml b/zh/10/ref/alter_tsconfig.sgml
index c19cfa68..722151a7 100644
--- a/zh/10/ref/alter_tsconfig.sgml
+++ b/zh/10/ref/alter_tsconfig.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
ALTER TEXT SEARCH CONFIGURATION
- 更改一个文本搜索配置的定义
+ 更改一个文本检索配置的定义
@@ -45,7 +45,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
ALTER TEXT SEARCH CONFIGURATION
- 更改一个文本搜索配置的定义。你可以修改其从记号类型到字典的映射,
+ 更改一个文本检索配置的定义。你可以修改其从词元类型到词典的映射,
或者更改该配置的名称或拥有者。
@@ -67,7 +67,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 一个现有文本搜索配置的名称(可以是模式限定的)。
+ 一个现有文本检索配置的名称(可以是模式限定的)。
@@ -78,7 +78,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 由该配置的解析器发出的记号类型的名称。
+ 由该配置的解析器发出的词元类型的名称。
@@ -89,7 +89,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 用于指定记号类型的文本搜索字典名称。如果列出了多个字典,
+ 用于指定词元类型的文本检索词典名称。如果列出了多个词典,
将按指定顺序依次查阅它们。
@@ -101,7 +101,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 在映射中要替换的文本搜索字典的名称。
+ 在映射中要替换的文本检索词典的名称。
@@ -113,7 +113,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
被用来替代old_dictionary
- 的文本搜索字典的名称。
+ 的文本检索词典的名称。
@@ -124,7 +124,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 该文本搜索配置的新名称。
+ 该文本检索配置的新名称。
@@ -135,7 +135,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 该文本搜索配置的新拥有者。
+ 该文本检索配置的新拥有者。
@@ -146,21 +146,21 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 该文本搜索配置的新模式。
+ 该文本检索配置的新模式。
- ADD MAPPING FOR 形式为指定的词元类型安装要查询的字典列表;如果任何词元类型已经存在映射,则会报错。ALTER MAPPING FOR 形式执行相同操作,但会先移除这些词元类型的现有映射。ALTER MAPPING REPLACE 形式在任何出现旧字典的地方用new_dictionary 替换old_dictionary 。当出现FOR 时,只对指定的词元类型执行此操作;不出现时,则对该配置的所有映射执行。DROP MAPPING 形式移除指定词元类型的所有字典,使这些类型的词元被文本搜索配置忽略。如果词元类型没有映射,则会报错,除非出现IF EXISTS 。
+ ADD MAPPING FOR 形式为指定的词元类型安装要查询的词典列表;如果任何词元类型已经存在映射,则会报错。ALTER MAPPING FOR 形式执行相同操作,但会先移除这些词元类型的现有映射。ALTER MAPPING REPLACE 形式在任何出现旧词典的地方用new_dictionary 替换old_dictionary 。当出现FOR 时,只对指定的词元类型执行此操作;不出现时,则对该配置的所有映射执行。DROP MAPPING 形式移除指定词元类型的所有词典,使这些类型的词元被文本检索配置忽略。如果词元类型没有映射,则会报错,除非出现IF EXISTS 。
示例
- 以下示例在my_config 中使用english 的任何地方,都将english 字典替换为swedish 字典。
+ 以下示例在my_config 中使用english 的任何地方,都将english 词典替换为swedish 词典。
ALTER TEXT SEARCH CONFIGURATION my_config
diff --git a/zh/10/ref/alter_tsdictionary.sgml b/zh/10/ref/alter_tsdictionary.sgml
index 1356e2fd..e12fca46 100644
--- a/zh/10/ref/alter_tsdictionary.sgml
+++ b/zh/10/ref/alter_tsdictionary.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
ALTER TEXT SEARCH DICTIONARY
- 更改一个文本搜索字典的定义
+ 更改一个文本检索词典的定义
@@ -37,14 +37,14 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- ALTER TEXT SEARCH DICTIONARY 更改文本搜索字典的
- 定义。你可以更改该字典的模板相关选项,也可以更改该字典的名称或拥有者。
+ ALTER TEXT SEARCH DICTIONARY 更改文本检索词典的
+ 定义。你可以更改该词典的模板相关选项,也可以更改该词典的名称或拥有者。
- 要使用ALTER TEXT SEARCH DICTIONARY ,你必须是该字典
+ 要使用ALTER TEXT SEARCH DICTIONARY ,你必须是该词典
的拥有者。
@@ -59,7 +59,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 一个现有文本搜索字典的名称(可以是模式限定的)。
+ 一个现有文本检索词典的名称(可以是模式限定的)。
@@ -70,7 +70,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 要为此字典设置的模板相关选项的名称。
+ 要为此词典设置的模板相关选项的名称。
@@ -81,7 +81,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 模板相关选项要使用的新值。如果省略等号和值,则会从该字典中移除
+ 模板相关选项要使用的新值。如果省略等号和值,则会从该词典中移除
该选项之前的设置,从而允许使用默认值。
@@ -93,7 +93,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 该文本搜索字典的新名称。
+ 该文本检索词典的新名称。
@@ -104,7 +104,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 该文本搜索字典的新拥有者。
+ 该文本检索词典的新拥有者。
@@ -115,7 +115,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 该文本搜索字典的新模式。
+ 该文本检索词典的新模式。
@@ -134,7 +134,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 下面的示例命令更改了一个基于 Snowball 的字典的停用词列表。其他参数
+ 下面的示例命令更改了一个基于 Snowball 的词典的停用词列表。其他参数
保持不变。
@@ -160,7 +160,7 @@ ALTER TEXT SEARCH DICTIONARY my_dict ( language = dutch, StopWords );
- 下面的示例命令更新
了该字典的定义,但实际上并没有做
+ 下面的示例命令更新
了该词典的定义,但实际上并没有做
任何更改。
@@ -168,7 +168,7 @@ ALTER TEXT SEARCH DICTIONARY my_dict ( dummy );
(之所以可行,是因为选项移除代码在不存在该选项时也不会报错。)
- 这种技巧在修改该字典的配置文件时很有用:ALTER
+ 这种技巧在修改该词典的配置文件时很有用:ALTER
会强制现有数据库会话重新读取配置文件,而如果它们先前已经读取过这
些文件,本来是不会再次读取的。
diff --git a/zh/10/ref/alter_tsparser.sgml b/zh/10/ref/alter_tsparser.sgml
index e1026b50..9700926e 100644
--- a/zh/10/ref/alter_tsparser.sgml
+++ b/zh/10/ref/alter_tsparser.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
ALTER TEXT SEARCH PARSER
- 更改一个全文检索解析器的定义
+ 更改一个文本检索解析器的定义
@@ -30,7 +30,7 @@ ALTER TEXT SEARCH PARSER name SET SCHEMA 描述
- ALTER TEXT SEARCH PARSER 更改全文检索解析器的定义。
+ ALTER TEXT SEARCH PARSER 更改文本检索解析器的定义。
当前唯一支持的功能是更改该解析器的名称。
@@ -47,7 +47,7 @@ ALTER TEXT SEARCH PARSER name SET SCHEMA name
- 一个现有全文检索解析器的名称(可以是模式限定的)。
+ 一个现有文本检索解析器的名称(可以是模式限定的)。
@@ -56,7 +56,7 @@ ALTER TEXT SEARCH PARSER name SET SCHEMA new_name
- 该全文检索解析器的新名称。
+ 该文本检索解析器的新名称。
@@ -65,7 +65,7 @@ ALTER TEXT SEARCH PARSER name SET SCHEMA new_schema
- 该全文检索解析器的新模式。
+ 该文本检索解析器的新模式。
diff --git a/zh/10/ref/alter_tstemplate.sgml b/zh/10/ref/alter_tstemplate.sgml
index e2604fd1..802475da 100644
--- a/zh/10/ref/alter_tstemplate.sgml
+++ b/zh/10/ref/alter_tstemplate.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
ALTER TEXT SEARCH TEMPLATE
- 更改一个文本搜索模板的定义
+ 更改一个文本检索模板的定义
@@ -30,7 +30,7 @@ ALTER TEXT SEARCH TEMPLATE name SET SCHEMA 描述
- ALTER TEXT SEARCH TEMPLATE 更改文本搜索模板的定义。
+ ALTER TEXT SEARCH TEMPLATE 更改文本检索模板的定义。
当前唯一支持的功能是更改该模板的名称。
@@ -47,7 +47,7 @@ ALTER TEXT SEARCH TEMPLATE name SET SCHEMA name
- 一个现有文本搜索模板的名称(可以是模式限定的)。
+ 一个现有文本检索模板的名称(可以是模式限定的)。
@@ -56,7 +56,7 @@ ALTER TEXT SEARCH TEMPLATE name SET SCHEMA new_name
- 该文本搜索模板的新名称。
+ 该文本检索模板的新名称。
@@ -65,7 +65,7 @@ ALTER TEXT SEARCH TEMPLATE name SET SCHEMA new_schema
- 该文本搜索模板的新模式。
+ 该文本检索模板的新模式。
diff --git a/zh/10/ref/comment.sgml b/zh/10/ref/comment.sgml
index 73726ce1..bec60184 100644
--- a/zh/10/ref/comment.sgml
+++ b/zh/10/ref/comment.sgml
@@ -112,7 +112,7 @@ COMMENT ON
rule_name
trigger_name
- 要添加注释的对象名称。表、聚合、排序规则、转换、域、外部表、函数、索引、操作符、操作符类、操作符族、序列、统计信息、文本搜索对象、类型和视图的名称可以带模式限定。为列添加注释时,relation_name 必须引用表、视图、复合类型或外部表。
+ 要添加注释的对象名称。表、聚合、排序规则、转换、域、外部表、函数、索引、操作符、操作符类、操作符族、序列、统计信息、文本检索对象、类型和视图的名称可以带模式限定。为列添加注释时,relation_name 必须引用表、视图、复合类型或外部表。
diff --git a/zh/10/ref/create_tsconfig.sgml b/zh/10/ref/create_tsconfig.sgml
index caf8d05b..480afd8c 100644
--- a/zh/10/ref/create_tsconfig.sgml
+++ b/zh/10/ref/create_tsconfig.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
CREATE TEXT SEARCH CONFIGURATION
- 定义一个新的文本搜索配置
+ 定义一个新的文本检索配置
@@ -33,24 +33,24 @@ CREATE TEXT SEARCH CONFIGURATION name
CREATE TEXT SEARCH CONFIGURATION
- 创建一个新的文本搜索配置。文本搜索配置指定一个能把字符串拆分为记号
- 的文本搜索解析器,以及一些可用于判断哪些记号对搜索有意义的词典。
+ 创建一个新的文本检索配置。文本检索配置指定一个能把字符串拆分为词元
+ 的文本检索解析器,以及一些可用于判断哪些词元对搜索有意义的词典。
- 如果只指定了解析器,那么新文本搜索配置最初没有从记号类型到词典的映射,
+ 如果只指定了解析器,那么新文本检索配置最初没有从词元类型到词典的映射,
因而会忽略所有词。要让该配置真正可用,必须使用后续的ALTER TEXT SEARCH
CONFIGURATION 命令创建映射。
- 另一种方式是复制一个现有的文本搜索配置。
+ 另一种方式是复制一个现有的文本检索配置。
- 如果给出了一个模式名称,则文本搜索配置会被创建在指定的模式中。否则它将会
+ 如果给出了一个模式名称,则文本检索配置会被创建在指定的模式中。否则它将会
被创建在当前模式中。
- 定义该文本搜索配置的用户会成为其拥有者。
+ 定义该文本检索配置的用户会成为其拥有者。
@@ -66,7 +66,7 @@ CREATE TEXT SEARCH CONFIGURATION namename
- 要创建的文本搜索配置的名称。该名称可以是模式限定的。
+ 要创建的文本检索配置的名称。该名称可以是模式限定的。
@@ -75,7 +75,7 @@ CREATE TEXT SEARCH CONFIGURATION nameparser_name
- 此配置要使用的文本搜索解析器的名称。
+ 此配置要使用的文本检索解析器的名称。
@@ -84,7 +84,7 @@ CREATE TEXT SEARCH CONFIGURATION namesource_config
- 要复制的现有文本搜索配置的名称。
+ 要复制的现有文本检索配置的名称。
diff --git a/zh/10/ref/create_tsdictionary.sgml b/zh/10/ref/create_tsdictionary.sgml
index ad77cd39..851347ed 100644
--- a/zh/10/ref/create_tsdictionary.sgml
+++ b/zh/10/ref/create_tsdictionary.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
CREATE TEXT SEARCH DICTIONARY
- 定义一个新的文本搜索字典
+ 定义一个新的文本检索词典
@@ -33,19 +33,19 @@ CREATE TEXT SEARCH DICTIONARY name
CREATE TEXT SEARCH DICTIONARY 创建一个
- 新的文本搜索字典。文本搜索字典指定一种在搜索时识别哪些词值得关注、
- 哪些词不值得关注的方式。字典依赖于文本搜索模板,后者规定了实际执行
- 这项工作的函数。通常,字典会提供一些选项,用来控制模板函数的具体
+ 新的文本检索词典。文本检索词典指定一种在搜索时识别哪些词值得关注、
+ 哪些词不值得关注的方式。词典依赖于文本检索模板,后者规定了实际执行
+ 这项工作的函数。通常,词典会提供一些选项,用来控制模板函数的具体
行为。
- 如果给出了一个模式名称,那么该文本搜索字典会被创建在指定的模式中。
+ 如果给出了一个模式名称,那么该文本检索词典会被创建在指定的模式中。
否则它会被创建在当前模式中。
- 定义文本搜索字典的用户将成为其拥有者。
+ 定义文本检索词典的用户将成为其拥有者。
@@ -61,7 +61,7 @@ CREATE TEXT SEARCH DICTIONARY name
name
- 要创建的文本搜索字典的名称。该名称可以被模式限定。
+ 要创建的文本检索词典的名称。该名称可以被模式限定。
@@ -70,7 +70,7 @@ CREATE TEXT SEARCH DICTIONARY name
template
- 用于定义该字典基本行为的文本搜索模板名称。
+ 用于定义该词典基本行为的文本检索模板名称。
@@ -79,7 +79,7 @@ CREATE TEXT SEARCH DICTIONARY name
option
- 要为此字典设置的模板相关选项的名称。
+ 要为此词典设置的模板相关选项的名称。
@@ -105,7 +105,7 @@ CREATE TEXT SEARCH DICTIONARY name
下面的示例命令创建了一个基于 Snowball 且使用非标准停用词列表的
- 字典。
+ 词典。
diff --git a/zh/10/ref/create_tsparser.sgml b/zh/10/ref/create_tsparser.sgml
index d8ebb16a..ef2e1438 100644
--- a/zh/10/ref/create_tsparser.sgml
+++ b/zh/10/ref/create_tsparser.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
CREATE TEXT SEARCH PARSER
- 定义一个新的全文检索解析器
+ 定义一个新的文本检索解析器
@@ -36,19 +36,19 @@ CREATE TEXT SEARCH PARSER name (
CREATE TEXT SEARCH PARSER 创建一个
- 新的全文检索解析器。全文检索解析器定义了一种方法,用于将文本字符串
- 拆分成记号并为这些记号指定类型(类别)。解析器本身并没有太大用处,
- 必须与一些全文检索字典一起绑定到一个全文检索配置中,才能用于搜索。
+ 新的文本检索解析器。文本检索解析器定义了一种方法,用于将文本字符串
+ 拆分成词元并为这些词元指定类型(类别)。解析器本身并没有太大用处,
+ 必须与一些文本检索词典一起绑定到一个文本检索配置中,才能用于搜索。
- 如果给出了一个模式名称,那么全文检索解析器将被创建在指定的模式中。
+ 如果给出了一个模式名称,那么文本检索解析器将被创建在指定的模式中。
否则它会被创建在当前模式中。
要使用CREATE TEXT SEARCH PARSER ,你必须是超级用户。
- 之所以有此限制,是因为错误的全文检索解析器定义可能会让服务器陷入
+ 之所以有此限制,是因为错误的文本检索解析器定义可能会让服务器陷入
混乱,甚至崩溃。
@@ -65,7 +65,7 @@ CREATE TEXT SEARCH PARSER name (
name
- 要创建的全文检索解析器的名称。该名称可以是模式限定的。
+ 要创建的文本检索解析器的名称。该名称可以是模式限定的。
@@ -83,7 +83,7 @@ CREATE TEXT SEARCH PARSER name (
gettoken_function
- 该解析器的获取下一个记号的函数名称。
+ 该解析器的获取下一个词元的函数名称。
@@ -101,7 +101,7 @@ CREATE TEXT SEARCH PARSER name (
lextypes_function
- 该解析器的 lextypes 函数的名称(该函数返回它所产生的记号类型集合的
+ 该解析器的 lextypes 函数的名称(该函数返回它所产生的词元类型集合的
信息)。
@@ -111,7 +111,7 @@ CREATE TEXT SEARCH PARSER name (
headline_function
- 该解析器的 headline 函数的名称(该函数对一组记号生成摘要)。
+ 该解析器的 headline 函数的名称(该函数对一组词元生成摘要)。
diff --git a/zh/10/ref/create_tstemplate.sgml b/zh/10/ref/create_tstemplate.sgml
index f6d2128f..baf2d57b 100644
--- a/zh/10/ref/create_tstemplate.sgml
+++ b/zh/10/ref/create_tstemplate.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
CREATE TEXT SEARCH TEMPLATE
- 定义一个新的全文检索模板
+ 定义一个新的文本检索模板
@@ -33,22 +33,22 @@ CREATE TEXT SEARCH TEMPLATE name (
CREATE TEXT SEARCH TEMPLATE 创建一个
- 新的全文检索模板。全文检索模板定义实现全文检索字典的函数。模板本身
- 并无直接用途,必须先实例化为字典后才能使用。字典通常会指定要传递给
+ 新的文本检索模板。文本检索模板定义实现文本检索词典的函数。模板本身
+ 并无直接用途,必须先实例化为词典后才能使用。词典通常会指定要传递给
模板函数的参数。
- 如果给出了模式名称,则全文检索模板会被创建在指定模式中。否则它会被
+ 如果给出了模式名称,则文本检索模板会被创建在指定模式中。否则它会被
创建在当前模式中。
要使用CREATE TEXT SEARCH TEMPLATE ,你
- 必须是超级用户。之所以有此限制,是因为错误的全文检索模板定义可能使
- 服务器陷入混乱,甚至崩溃。将模板与字典分离的原因在于,模板封装了定
- 义字典时那些不安全
的方面。而在定义字典时可设置的参数,
- 对非特权用户来说是安全的,因此创建字典不必是特权操作。
+ 必须是超级用户。之所以有此限制,是因为错误的文本检索模板定义可能使
+ 服务器陷入混乱,甚至崩溃。将模板与词典分离的原因在于,模板封装了定
+ 义词典时那些不安全
的方面。而在定义词典时可设置的参数,
+ 由普通用户设置也是安全的,因此创建词典不必是特权操作。
@@ -64,7 +64,7 @@ CREATE TEXT SEARCH TEMPLATE name (
name
- 要创建的全文检索模板名称。该名称可以是模式限定的。
+ 要创建的文本检索模板名称。该名称可以是模式限定的。
diff --git a/zh/10/ref/drop_opclass.sgml b/zh/10/ref/drop_opclass.sgml
index 53d1b5a7..0542a274 100644
--- a/zh/10/ref/drop_opclass.sgml
+++ b/zh/10/ref/drop_opclass.sgml
@@ -110,7 +110,7 @@ DROP OPERATOR CLASS [ IF EXISTS ] name 示例
- 移除 B-tree 操作符类widget_ops :
+ 移除 B-树操作符类widget_ops :
DROP OPERATOR CLASS widget_ops USING btree;
diff --git a/zh/10/ref/drop_tsconfig.sgml b/zh/10/ref/drop_tsconfig.sgml
index 0881769f..1a985a29 100644
--- a/zh/10/ref/drop_tsconfig.sgml
+++ b/zh/10/ref/drop_tsconfig.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
DROP TEXT SEARCH CONFIGURATION
- 移除一个文本搜索配置
+ 移除一个文本检索配置
@@ -29,7 +29,7 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
描述
- DROP TEXT SEARCH CONFIGURATION 删除一个现有文本搜索配置。
+ DROP TEXT SEARCH CONFIGURATION 删除一个现有文本检索配置。
要执行此命令,你必须是该配置的拥有者。
@@ -43,7 +43,7 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
IF EXISTS
- 如果该文本搜索配置不存在,则不要抛出错误。这种情况下会发出一个提示。
+ 如果该文本检索配置不存在,则不要抛出错误。这种情况下会发出一个提示。
@@ -52,7 +52,7 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
name
- 现有文本搜索配置的名称(可以被模式限定)。
+ 现有文本检索配置的名称(可以被模式限定)。
@@ -61,7 +61,7 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
CASCADE
- 自动删除依赖于该文本搜索配置的对象,以及所有进一步依赖于这些对象的对象
+ 自动删除依赖于该文本检索配置的对象,以及所有进一步依赖于这些对象的对象
(参见)。
@@ -71,7 +71,7 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
RESTRICT
- 如果有任何对象依赖于该文本搜索配置,则拒绝删除该配置。这是默认值。
+ 如果有任何对象依赖于该文本检索配置,则拒绝删除该配置。这是默认值。
@@ -82,14 +82,14 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
示例
- 移除文本搜索配置my_english :
+ 移除文本检索配置my_english :
DROP TEXT SEARCH CONFIGURATION my_english;
如果已有索引在to_tsvector 调用中引用了该配置,
- 此命令将不会成功。加上CASCADE 可以在删除该文本搜索配置的同时删除这类索引。
+ 此命令将不会成功。加上CASCADE 可以在删除该文本检索配置的同时删除这类索引。
diff --git a/zh/10/ref/drop_tsdictionary.sgml b/zh/10/ref/drop_tsdictionary.sgml
index ba5c3de3..25463d98 100644
--- a/zh/10/ref/drop_tsdictionary.sgml
+++ b/zh/10/ref/drop_tsdictionary.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
DROP TEXT SEARCH DICTIONARY
- 移除一个文本搜索字典
+ 移除一个文本检索词典
@@ -29,8 +29,8 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] name描述
- DROP TEXT SEARCH DICTIONARY 删除一个现有文本搜索字典。
- 要执行此命令,你必须是该字典的拥有者。
+ DROP TEXT SEARCH DICTIONARY 删除一个现有文本检索词典。
+ 要执行此命令,你必须是该词典的拥有者。
@@ -43,7 +43,7 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] nameIF EXISTS
- 如果该文本搜索字典不存在,则不要抛出错误。这种情况下会发出一个提示。
+ 如果该文本检索词典不存在,则不要抛出错误。这种情况下会发出一个提示。
@@ -52,7 +52,7 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] namename
- 一个现有文本搜索字典的名称(可以被模式限定)。
+ 一个现有文本检索词典的名称(可以被模式限定)。
@@ -61,7 +61,7 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] nameCASCADE
- 自动删除依赖于该文本搜索字典的对象,以及进一步依赖于这些对象的所有对象
+ 自动删除依赖于该文本检索词典的对象,以及进一步依赖于这些对象的所有对象
(参见)。
@@ -71,7 +71,7 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] nameRESTRICT
- 如果有任何对象依赖于该文本搜索字典,则拒绝删除它。这是默认值。
+ 如果有任何对象依赖于该文本检索词典,则拒绝删除它。这是默认值。
@@ -82,14 +82,14 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] name示例
- 移除文本搜索字典english :
+ 移除文本检索词典english :
DROP TEXT SEARCH DICTIONARY english;
- 如果已有文本搜索配置使用该字典,此命令将不会成功。
- 加上CASCADE 可以在删除字典的同时删除这类配置。
+ 如果已有文本检索配置使用该词典,此命令将不会成功。
+ 加上CASCADE 可以在删除词典的同时删除这类配置。
diff --git a/zh/10/ref/drop_tsparser.sgml b/zh/10/ref/drop_tsparser.sgml
index a3ea49d7..d6c56efb 100644
--- a/zh/10/ref/drop_tsparser.sgml
+++ b/zh/10/ref/drop_tsparser.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
DROP TEXT SEARCH PARSER
- 移除一个文本搜索解析器
+ 移除一个文本检索解析器
@@ -29,7 +29,7 @@ DROP TEXT SEARCH PARSER [ IF EXISTS ] name描述
- DROP TEXT SEARCH PARSER 删除一个现有文本搜索解析器。
+ DROP TEXT SEARCH PARSER 删除一个现有文本检索解析器。
要使用此命令,你必须是超级用户。
@@ -43,7 +43,7 @@ DROP TEXT SEARCH PARSER [ IF EXISTS ] nameIF EXISTS
- 如果该文本搜索解析器不存在,则不要抛出错误。这种情况下会发出一个提示。
+ 如果该文本检索解析器不存在,则不要抛出错误。这种情况下会发出一个提示。
@@ -52,7 +52,7 @@ DROP TEXT SEARCH PARSER [ IF EXISTS ] namename
- 一个现有文本搜索解析器的名称(可以被模式限定)。
+ 一个现有文本检索解析器的名称(可以被模式限定)。
@@ -61,7 +61,7 @@ DROP TEXT SEARCH PARSER [ IF EXISTS ] nameCASCADE
- 自动删除依赖于该文本搜索解析器的对象,以及进一步依赖于这些对象的所有对象
+ 自动删除依赖于该文本检索解析器的对象,以及进一步依赖于这些对象的所有对象
(参见)。
@@ -71,7 +71,7 @@ DROP TEXT SEARCH PARSER [ IF EXISTS ] nameRESTRICT
- 如果有任何对象依赖于该文本搜索解析器,则拒绝删除它。这是默认值。
+ 如果有任何对象依赖于该文本检索解析器,则拒绝删除它。这是默认值。
@@ -82,13 +82,13 @@ DROP TEXT SEARCH PARSER [ IF EXISTS ] name示例
- 移除文本搜索解析器my_parser :
+ 移除文本检索解析器my_parser :
DROP TEXT SEARCH PARSER my_parser;
- 如果已有文本搜索配置使用该解析器,此命令将不会成功。
+ 如果已有文本检索配置使用该解析器,此命令将不会成功。
加上CASCADE 可以在删除解析器的同时删除这类配置。
diff --git a/zh/10/ref/drop_tstemplate.sgml b/zh/10/ref/drop_tstemplate.sgml
index 2a0fda88..ea4a9dff 100644
--- a/zh/10/ref/drop_tstemplate.sgml
+++ b/zh/10/ref/drop_tstemplate.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
DROP TEXT SEARCH TEMPLATE
- 移除一个文本搜索模板
+ 移除一个文本检索模板
@@ -29,7 +29,7 @@ DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] name描述
- DROP TEXT SEARCH TEMPLATE 删除一个现有文本搜索模板。
+ DROP TEXT SEARCH TEMPLATE 删除一个现有文本检索模板。
要使用此命令,你必须是超级用户。
@@ -43,7 +43,7 @@ DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] nameIF EXISTS
- 如果该文本搜索模板不存在,则不要抛出错误。这种情况下会发出一个提示。
+ 如果该文本检索模板不存在,则不要抛出错误。这种情况下会发出一个提示。
@@ -52,7 +52,7 @@ DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] namename
- 现有文本搜索模板的名称(可以被模式限定)。
+ 现有文本检索模板的名称(可以被模式限定)。
@@ -61,7 +61,7 @@ DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] nameCASCADE
- 自动删除依赖于该文本搜索模板的对象,以及所有进一步依赖于这些对象的对象
+ 自动删除依赖于该文本检索模板的对象,以及所有进一步依赖于这些对象的对象
(参见)。
@@ -71,7 +71,7 @@ DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] nameRESTRICT
- 如果有任何对象依赖于该文本搜索模板,则拒绝删除该模板。这是默认值。
+ 如果有任何对象依赖于该文本检索模板,则拒绝删除该模板。这是默认值。
@@ -82,14 +82,14 @@ DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] name示例
- 移除文本搜索模板thesaurus :
+ 移除文本检索模板thesaurus :
DROP TEXT SEARCH TEMPLATE thesaurus;
- 如果已有文本搜索字典使用该模板,此命令将不会成功。加上CASCADE
- 可以在删除该模板的同时删除这类字典。
+ 如果已有文本检索词典使用该模板,此命令将不会成功。加上CASCADE
+ 可以在删除该模板的同时删除这类词典。
diff --git a/zh/10/ref/initdb.sgml b/zh/10/ref/initdb.sgml
index 923ac1c1..deff9d63 100644
--- a/zh/10/ref/initdb.sgml
+++ b/zh/10/ref/initdb.sgml
@@ -136,7 +136,7 @@ PostgreSQL documentation
-
+
-k
--data-checksums
@@ -195,7 +195,7 @@ PostgreSQL documentation
--pwfile=filename
- 使initdb 从文件中读取引导超级用户的密码。文件的第一行会被当作密码。
+ 使initdb 从文件中读取数据库超级用户的密码。文件的第一行会被当作密码。
@@ -215,7 +215,7 @@ PostgreSQL documentation
--text-search-config=config
- 设置默认文本搜索配置。更多信息见
+ 设置默认文本检索配置。更多信息见
。
@@ -226,10 +226,9 @@ PostgreSQL documentation
--username=username
- 选择数据库超级用户的用户名。默认值是运行
- initdb 的实际用户名称。超级用户的名称本身
- 并不重要,不过即使操作系统用户名称不同,人们也可能选择沿用惯常
- 的名称postgres 。
+ 选择数据库超级用户的用户名。默认值是运行initdb 的有效用户的名称。
+ 超级用户的名称本身并不重要,不过即使操作系统用户名称不同,也可以选择沿用惯常的名称
+ postgres 。
@@ -239,7 +238,7 @@ PostgreSQL documentation
--pwprompt
- 使initdb 提示输入要赋给引导超级用户的密码。如果不打算使用密码认证,
+ 使initdb 提示输入要赋给数据库超级用户的密码。如果不打算使用密码认证,
这一点并不重要。否则,在设置密码之前将无法使用密码认证。
diff --git a/zh/10/ref/pgbench.sgml b/zh/10/ref/pgbench.sgml
index 441fd105..f2b79e9c 100644
--- a/zh/10/ref/pgbench.sgml
+++ b/zh/10/ref/pgbench.sgml
@@ -36,7 +36,7 @@ PostgreSQL documentation
描述
- pgbench 是一个用于对PostgreSQL 执行基准测试的简单程序。它会反复执行同一组 SQL 命令,必要时可在多个并发数据库会话中运行,然后计算平均事务速率(每秒事务数)。默认情况下,pgbench 测试的是一个大体上基于 TPC-B 的场景,每个事务包含五条SELECT 、UPDATE 和INSERT 命令。不过,通过编写自己的事务脚本文件,也很容易测试其他场景。
+ pgbench 是一个用于对PostgreSQL 执行基准测试的简单程序。它会反复执行同一组 SQL 命令,也可在多个并发数据库会话中运行,然后计算平均事务速率(每秒事务数)。默认情况下,pgbench 测试的是一个大体上基于 TPC-B 的场景,每个事务包含五条SELECT 、UPDATE 和INSERT 命令。不过,通过编写自己的事务脚本文件,也很容易测试其他场景。
@@ -57,13 +57,15 @@ tps = 85.296346 (excluding connections establishing)
前六行报告了一些最重要的参数设置。下一行报告已完成的事务数和预期的事务数(后者就是客户端数与每个客户端的事务数的乘积);除非运行在完成前失败,否则这两个数应该相等。(在 -T 模式下,只打印实际的事务数。)最后两行报告每秒事务数,分别计入和不计入启动数据库会话的时间。
- 默认的类 TPC-B 事务测试要求预先建立特定的表。pgbench 应使用-i (初始化)选项调用,以创建并填充这些表。(测试自定义脚本时不需要这一步,但需要自行完成测试所需的准备工作。)初始化命令如下:
+
+ 默认的类 TPC-B 事务测试要求预先建立特定的表。应使用-i (初始化)选项调用pgbench 来创建并填充这些表。(测试自定义脚本时不需要这一步,但需要自行完成测试所需的准备工作。)初始化命令如下:
+
+
pgbench -i other-options dbname
- 其中,
- dbname 是已创建好的、用于执行测试的数据库名称。(可能还需要使用-h ,
- -p 和/或-U 选项来指定如何连接到数据库服务器。)
+ 其中dbname 是已创建好的、用于执行测试的数据库名称。(可能还需要使用-h 、-p 和/或-U 选项来指定如何连接到数据库服务器。)
+
@@ -76,14 +78,14 @@ pgbench -i other-options
在默认的比例因子
1 下,这些表最初包含如下行数:
-table # of rows
+表 行数
---------------------------------
pgbench_branches 1
pgbench_tellers 10
pgbench_accounts 100000
pgbench_history 0
- 可以使用-s (比例因子)选项来增加行数,而且在大多数场景下也确实应该这样做。此时还可以配合使用-F (fillfactor)选项。
+ 可以使用-s (比例因子)选项来增加行数,而且在大多数场景下通常也应该这样做。此时还可以配合使用-F (fillfactor)选项。
@@ -109,7 +111,7 @@ pgbench options d
初始化选项
- pgbench 接受以下用于初始化的命令行参数:
+ pgbench 接受以下命令行初始化参数:
@@ -222,7 +224,7 @@ pgbench options d
基准测试选项
- pgbench 接受以下用于基准测试的命令行参数:
+ pgbench 接受以下命令行基准测试参数:
@@ -359,13 +361,13 @@ pgbench options d
用于向服务器提交查询的协议:
- simple : 使用简单查询协议。
+ simple :使用简单查询协议。
- extended : 使用扩展查询协议。
+ extended :使用扩展查询协议。
- prepared : 使用带有预备语句的扩展查询协议。
+ prepared :使用带有预备语句的扩展查询协议。
默认为简单查询协议。(详见 。)
@@ -449,7 +451,7 @@ pgbench options d
较高的计划滞后时间表明,在所选客户端数和线程数下,系统无法以指定速率处理事务。
当平均事务执行时间长于事务之间的计划间隔时,后续事务会不断进一步落后,
- 而计划滞后时间也会随着测试持续时间增加。在这种情况下,只能降低指定的事务速率。
+ 而计划滞后时间也会随着测试持续时间增加。在这种情况下,需要降低指定的事务速率。
@@ -461,7 +463,7 @@ pgbench options d
在pgbench 输出中报告指定的比例因子。
- 对于内置测试,这通常没有必要;系统会通过统计pgbench_branches 表中的行数来检测正确的比例因子。
+ 对于内置测试,这没有必要;系统会通过统计pgbench_branches 表中的行数来检测正确的比例因子。
但在只测试自定义基准(-f 选项)时,
除非使用此选项,否则比例因子会被报告为 1。
@@ -635,7 +637,7 @@ pgbench options d
注解
- 实际执行的事务
在pgbench 中是什么?
+ 在pgbench 中实际执行的事务
是什么?
pgbench 会从指定列表中随机选取测试脚本来执行。
@@ -682,7 +684,7 @@ pgbench options d
- 在PostgreSQL 9.6 之前,脚本文件中的 SQL 命令以换行符结束,因此不能跨行续写。现在,连续的 SQL 命令之间必须 用分号分隔(不过,如果 SQL 命令后面跟着元命令,则不需要分号)。如果需要创建适用于新旧版本pgbench 的脚本文件,请务必将每条 SQL 命令写在单独一行,并以分号结尾。
+ 在PostgreSQL 9.6 之前,脚本文件中的 SQL 命令以换行结束,因此不能跨行。现在连续 SQL 命令之间必须 用分号分隔(如果 SQL 命令后面跟着一个元命令,则不需要分号)。如果需要创建一个既能在旧版也能在新版pgbench 下工作的脚本文件,务必将每个 SQL 命令写在单独一行,并以分号结束。
@@ -716,7 +718,7 @@ pgbench options d
- 脚本文件中的元命令以反斜线(\ )开头,通常延伸到行尾,不过也可以通过写反斜线换行继续到后续行。元命令及其参数之间以空白分隔。支持的元命令如下:
+ 脚本文件中的元命令以反斜线(\ )开头,通常延伸到行尾,不过也可以通过写反斜线换行继续到后续行。元命令的参数以空白分隔。支持的元命令如下:
@@ -727,7 +729,7 @@ pgbench options d
- 将变量varname>设置为根据expression>计算出的值。表达式可以包含整数常量(例如5432>)、double 常量(例如3.14159>)、变量引用:>variablename>、具有通常优先级和结合性的一元操作符(+>、->)和二元操作符(+>、->、*>、/>、%>)、 函数调用>以及括号。
+ 将变量varname>设置为根据expression>计算出的值。表达式可以包含整数常量(例如5432>)、双精度常量(例如3.14159>)、变量引用:>variablename>、具有通常优先级和结合性的一元操作符(+>、->)和二元操作符(+>、->、*>、/>、%>)、 函数调用>以及括号。
@@ -771,7 +773,7 @@ pgbench options d
- command 和每个argument 都可以是文本常量,也可以是引用某个变量的: variablename 。如果要使用以冒号开头的argument ,请在其开头再写一个冒号。
+ command 和每个argument 都可以是文本常量,也可以是引用某个变量的: variablename 。如果要使用以冒号开头的argument ,请在argument 开头再写一个冒号。
@@ -911,29 +913,28 @@ pgbench options d
- 对于指数分布,parameter 通过在以下位置截断一个快速衰减的指数分布来控制分布:parameter ,然后将其投影到边界之间的整数上。准确地说,令
+
+ 对于指数分布,parameter 通过在parameter 处截断一个快速衰减的指数分布,再将其投影到边界之间的整数上,从而控制分布。准确地说,令
+
f(x) = exp(-parameter * (x - min) / (max - min + 1)) / (1 - exp(-parameter))
- 则值i> 位于 min> 和
- max> 之间(包括端点),被抽到的概率为:
- f(i) - f(i + 1) 。
+
+ 则min 和max 之间(含边界)的值i 会以f(i) - f(i + 1) 的概率被抽中。
- 直观地说,parameter 越大,接近min>的值被访问得越频繁,而接近max>的值被访问得越少。parameter 越接近 0,访问分布就越平坦(越均匀)。对该分布的一个粗略近似是:范围内最常出现的 1% 的值,即接近min>的那些值,会在parameter % 的时间里被抽中。parameter 的值必须严格为正。
+
+ 直观地说,parameter 越大,越靠近min 的值越容易被抽到,而越靠近max 的值越不容易被抽到。parameter 越接近 0,分布就越平坦(也就越均匀)。对这种分布的一个粗略近似是:范围内出现频率最高的 1% 的值,即最靠近min 的那些值,大约会占到parameter % 的抽样次数。parameter 必须严格大于 0。
+
- 对于高斯分布,该区间映射到标准正态分布(经典的钟形高斯曲线),左侧截断于 -parameter ,右侧截断于 +parameter 。区间中部的值更容易被抽到。准确地说,如果 PHI(x) 为标准正态分布的累积分布函数,均值 mu 定义为 (max + min) / 2.0 ,并且
-
+ 对于高斯分布,该区间会映射到一个标准正态分布(经典钟形高斯曲线),并在左侧-parameter 和右侧+parameter 处截断。区间中部的值更容易被抽到。准确地说,如果PHI(x) 是标准正态分布的累积分布函数,均值mu 定义为(max + min) / 2.0 ,则有
+
f(x) = PHI(2.0 * parameter * (x - mu) / (max - min + 1)) /
(2.0 * PHI(parameter) - 1)
- 那么,值 i> 位于 min> 和
- max> 之间(包括端点),被抽到的概率为:
- f(i + 0.5) - f(i - 0.5) 。直观地说,parameter 越大,越靠近区间中部的值被抽到的频率就越高,而越靠近 min> 和
- max> 边界的值被抽到的频率就越低。约 67% 的值抽自区间中间的 1.0 / parameter ,即均值周围相对 0.5 / parameter 的范围;95% 的值抽自区间中间的 2.0 / parameter ,即均值周围相对 1.0 / parameter 的范围。例如,如果 parameter 为 4.0,则 67% 的值抽自区间中间四分之一(1.0 / 4.0)的范围(即从
- 3.0 / 8.0 到 5.0 / 8.0 ),95% 的值抽自区间中间一半(2.0 / 4.0 )的范围(第二和第三四分位)。考虑到 Box-Muller 变换的性能,parameter 的最小值为 2.0。
-
+ 则min 和max (包含边界)之间的值i 被抽中的概率为:f(i + 0.5) - f(i - 0.5) 。直观地说,parameter 越大,越靠近区间中间的值被抽到的频率越高,而越靠近min 和max 边界的值被抽到的频率越低。大约 67% 的值会落在区间中部1.0 / parameter 这一段内,也就是均值两侧各占区间长度0.5 / parameter 的范围内;约 95% 的值会落在区间中部2.0 / parameter 这一段内,也就是均值两侧各占区间长度1.0 / parameter 的范围内。例如,如果parameter 为 4.0,则 67% 的值会落在区间中间四分之一(1.0 / 4.0)内,也就是从3.0 / 8.0 到5.0 / 8.0 ;95% 的值会落在区间中间一半(2.0 / 4.0 )内,也就是第二和第三四分位。考虑到 Box-Muller 变换的性能,parameter 的最小值为 2.0。
+
@@ -983,8 +984,7 @@ END;
- 下面是单个客户端运行时生成的日志文件片段:
-
+ 这里是在单个客户端运行中生成的一个日志文件的片段:
0 199 2241 0 1175850568 995598
0 200 2465 0 1175850568 998079
@@ -992,9 +992,8 @@ END;
0 202 2038 0 1175850569 2663
- 下面是另一个使用 --rate=100> 和 --latency-limit=5> 的示例(请注意额外的
- schedule_lag> 列):
-
+ 另一个示例使用的是--rate=100 以及--latency-limit=5 (注意额外的
+ schedule_lag 列):
0 81 4621 0 1412881037 912698 3005
0 82 6173 0 1412881037 914578 4304
@@ -1004,7 +1003,8 @@ END;
0 84 4142 0 1412881037 918023 2333
0 85 2465 0 1412881037 919759 740
- 在这个示例中,事务 82 超时了,因为其延迟(6.173 ms)超过了 5 ms 的限制。接下来的两个事务被跳过,因为它们在开始前就已经超时。
+ 在这个示例中,事务 82 迟到了,因为它的延迟(6.173 ms)超过了
+ 5 ms 限制。接下来的两个事务被跳过,因为它们在开始之前就已经迟到了。
@@ -1023,13 +1023,13 @@ END;
其中,
- interval_start> 是时间区间的开始时间(以 Unix 纪元时间戳表示),
- num_transactions> 是区间内的事务数,
+ interval_start 是时间区间的开始时间(以 Unix 纪元时间戳表示),
+ num_transactions 是区间内的事务数,
sum_latency 是区间内事务延迟的总和,
sum_latency_2 是区间内事务延迟的平方和,
- min_latency> 是区间内的最小延迟,而
- max_latency> 是区间内的最大延迟。接下来的字段
- sum_lag>, sum_lag_2>, min_lag> 和 max_lag> 仅在使用 --rate> 选项时出现。它们提供各事务等待前一事务完成的时间统计,即各事务计划开始时间与实际开始时间之间的差值。最后一个字段 skipped> 仅在还使用 --latency-limit> 选项时出现。它记录因开始时间过晚而被跳过的事务数。每个事务都计入其提交时所在的时间区间。
+ min_latency 是区间内的最小延迟,而
+ max_latency 是区间内的最大延迟。接下来的字段
+ sum_lag 、 sum_lag_2 、 min_lag 和 max_lag 仅在使用 --rate 选项时出现。它们提供各事务等待前一事务完成的时间统计,即各事务计划开始时间与实际开始时间之间的差值。最后一个字段 skipped 仅在还使用 --latency-limit 选项时出现。它记录因开始时间过晚而被跳过的事务数。每个事务都计入其提交时所在的时间区间。
@@ -1049,7 +1049,7 @@ END;
- 逐语句报告
+ 逐语句延迟
使用-r 选项时,pgbench 会收集每个客户端执行的每条语句所经过的事务时间。基准测试完成后,它会报告这些值的平均值,称为每条语句的延迟。
@@ -1087,11 +1087,11 @@ script statistics:
- 所有数值都是针对每个客户端执行的每条语句计算的,并在基准测试完成后报告。
+ 如果指定了多个脚本文件,则会分别为每个脚本文件报告平均值。
- 请注意,收集计算每条语句延迟所需的额外计时信息会增加一些开销。这会降低平均执行速度,使计算出的 TPS 下降。减速程度因平台和硬件而异,差别可能很大。比较启用和未启用延迟报告时的平均 TPS 值,是衡量计时开销是否显著的好方法。
+ 注意,为逐语句延迟计算收集额外的计时信息会带来一定开销。这会拖慢平均执行速度,并降低计算出的 TPS。减速幅度在很大程度上取决于平台和硬件。比较启用和未启用延迟报告时的平均 TPS 值,是判断这一计时开销是否显著的好方法。
@@ -1112,7 +1112,7 @@ script statistics:
- 默认测试场景还会对表初始化后的时间长短非常敏感:表中死元组和空闲空间的累积会改变结果。要理解这些结果,必须跟踪更新总数以及何时发生清理。如果启用了自动清理,它可能会给测得的性能带来不可预测的变化。
+ 默认测试场景还会对表初始化后的时间长短非常敏感:表中死元组和无效空间的累积会改变结果。要理解这些结果,必须跟踪更新总数以及何时发生清理。如果启用了自动清理,它可能会给测得的性能带来不可预测的变化。
diff --git a/zh/10/ref/psql-ref.sgml b/zh/10/ref/psql-ref.sgml
index 4bc80215..355c4a41 100644
--- a/zh/10/ref/psql-ref.sgml
+++ b/zh/10/ref/psql-ref.sgml
@@ -47,7 +47,7 @@ PostgreSQL documentation
--echo-all
- 把所有非空输入行按照它们被读入的形式打印到标准输出(不适用于交互式行读取)。这等效于把变量ECHO 设置为
+ 在读入时将所有非空输入行打印到标准输出(不适用于交互式行读取)。这等效于把变量ECHO 设置为
all 。
@@ -78,10 +78,10 @@ PostgreSQL documentation
--command=command
- 指定psql 执行一个给定的命令字符串command 。这个选项可以重复多次并且以任何顺序与-f 选项组合在一起。当-c 或者-f 被指定时,psql 不会从标准输入读取命令,直到它处理完序列中所有的-c 和-f 选项之后终止。
+ 指定psql 执行一个给定的命令字符串command 。这个选项可以重复多次并且以任何顺序与-f 选项组合在一起。当-c 或者-f 被指定时,psql 不会从标准输入读取命令,而是在按顺序处理完所有-c 和-f 选项后终止。
- command 必须是一个服务器完全可解析的命令字符串(即不包含psql 相关的特性)或者单个反斜线命令。因此不能在一个-c 选项中混合SQL 和psql 元命令。要那样做,可以使用多个-c 选项或者把字符串用管道输送到psql 中,例如:
+ command 必须是一个服务器完全可解析的命令字符串(即不包含psql 专有的特性)或者单个反斜线命令。因此不能在一个-c 选项中混合SQL 和psql 元命令。要那样做,可以使用多个-c 选项或者把字符串用管道输送到psql 中,例如:
psql -c '\x' -c 'SELECT * FROM foo;'
@@ -94,8 +94,8 @@ echo '\x \\ SELECT * FROM foo;' | psql
每个SQL 命令字符串传递给-c 都作为一个单独的查询发送到服务器。
因此,即使字符串包含多个SQL 命令,服务器也会将其作为单个事务执行,
- 除非字符串中包含明确的BEGIN /COMMIT 命令将其分成多个事务。
-
+ 除非字符串中包含显式的BEGIN /COMMIT 命令将其分成多个事务。
+
此外,psql 只打印字符串中最后一条SQL 命令的结果。这与从文件读取同一字符串或将其送入psql 标准输入时的行为不同,因为在这些情况下,psql 会分别发送每条SQL 命令。
@@ -149,7 +149,7 @@ EOF
- 如果filename 是- (连字符),则会读取标准输入,直到遇到 EOF 指示或\q 元命令。这可用于将交互式输入与文件输入交错使用。不过请注意,这种情况下不会使用 Readline(很像指定了-n 时的情况)。
+ 如果filename 是- (连字符),则会读取标准输入,直到遇到 EOF 指示或\q 元命令。这可用于将交互式输入与文件输入交错使用。不过请注意,这种情况下不会使用 Readline (很像指定了-n 时的情况)。
@@ -163,7 +163,7 @@ EOF
--field-separator=separator
- 使用separator 作为非对齐输出的域分隔符。这等效于\pset fieldsep 或者\f 。
+ 使用separator 作为非对齐输出的字段分隔符。这等效于\pset fieldsep 或者\f 。
@@ -183,7 +183,7 @@ EOF
--html
- 切换到HTML 输出模式。这等效于\pset format html 或者\H 命令。
+ 切换到HTML 表格输出模式。这等效于\pset format html 或者\H 命令。
@@ -217,7 +217,7 @@ EOF
--no-readline
- 不要使用Readline 进行行编辑,也不要使用命令历史记录。这有助于在剪切和粘贴时关闭制表符展开。
+ 不要使用Readline 进行行编辑,也不要使用命令历史记录。这有助于在剪切和粘贴时关闭TAB 补全。
@@ -237,7 +237,7 @@ EOF
--port=port
- 指定服务器用于监听连接的 TCP 端口或者本地 Unix 域套接字文件扩展。默认是PGPORT 环境变量的值,如果没有设置,则默认为编译时指定的端口号(通常是5432)。
+ 指定服务器用于监听连接的 TCP 端口或者本地 Unix 域套接字文件扩展名。默认是PGPORT 环境变量的值,如果没有设置,则默认为编译时指定的端口号(通常是5432)。
@@ -257,7 +257,7 @@ EOF
--quiet
- 指定psql 应该安静地工作。默认情况下,它会打印出欢迎消息以及多种输出。如果使用了这个选项,以上那些就都不会输出。在使用-c 选项时,配合这个选项很有用。这等效于设置变量QUIET 为on 。
+ 指定psql 应该安静地工作。默认情况下,它会打印出欢迎消息和各种提示信息。如果使用了这个选项,以上那些就都不会输出。在使用-c 选项时,配合这个选项很有用。这等效于设置变量QUIET 为on 。
@@ -277,7 +277,7 @@ EOF
--single-step
- 运行在单步模式中。这意味着在每个命令被发送给服务器之前都会提示用户一个可以取消执行的选项。使用这个选项可以调试脚本。
+ 运行在单步模式中。这意味着在每个命令被发送给服务器之前都会提示用户,并允许取消执行。使用这个选项可以调试脚本。
@@ -287,7 +287,7 @@ EOF
--single-line
- 运行在单行模式中,其中新行会终止一个 SQL 命令,就像分号的作用一样。
+ 运行在单行模式中,其中换行符会终止一个 SQL 命令,就像分号的作用一样。
@@ -313,7 +313,7 @@ EOF
--table-attr=table_options
- 指定要替换HTML table 标签的选项。详见\pset tableattr 。
+ 指定要放在HTML table 标签内的选项。详见\pset tableattr 。
@@ -334,7 +334,7 @@ EOF
--variable=assignment
- 执行一次变量赋值,和\set 元命令相似。注意你必须在命令行上用等号分隔名字和值(如果有)。要重置一个变量,去掉等号就行。要把一个变量置为空值,使用等号但是去掉值。这些赋值在命令行处理期间被完成,因此反映连接状态的变量将在稍后被覆盖。
+ 执行一次变量赋值,和\set 元命令相似。注意你必须在命令行上用等号分隔名字和值(如果有)。要取消变量的设置,去掉等号就行。要把一个变量设为空字符串,使用等号但是去掉值。这些赋值在命令行处理期间被完成,因此反映连接状态的变量将在稍后被覆盖。
@@ -396,7 +396,7 @@ EOF
--no-psqlrc
- 不读取启动文件(要么是系统范围的psqlrc 文件,要么是用户的~/.psqlrc 文件)。
+ 不读取启动文件(既不读取系统范围的psqlrc 文件,也不读取用户的~/.psqlrc 文件)。
@@ -406,7 +406,7 @@ EOF
--field-separator-zero
- 设置非对齐输出的域分隔符为零字节。这等效于\pset fieldsep_zero 。
+ 设置非对齐输出的字段分隔符为零字节。这等效于\pset fieldsep_zero 。
@@ -416,7 +416,7 @@ EOF
--record-separator-zero
- 设置非对齐输出的记录分隔符为零字节。例如,这对与xargs -0 配合有关。这等效于\pset recordsep_zero 。
+ 设置非对齐输出的记录分隔符为零字节。例如,这有助于与xargs -0 配合使用。这等效于\pset recordsep_zero 。
@@ -476,10 +476,9 @@ EOF
-U 分别指定这些参数。如果遇到一个不属于任何选项的参数,
它将被解释为数据库名(如果数据库名已经给出,则解释为数据库用户名)。
并非所有这些选项都是必需的;它们都有有用的默认值。如果省略主机名,
- psql 在 Unix 上将通过 Unix 域套接字连接到本地主机上的服务器,
- 在 Windows 上则通过 TCP/IP 连接到 localhost 。默认端口号在编译时确定。
+ psql 将通过 Unix 域套接字连接到本地主机上的服务器,而在没有 Unix 域套接字的机器上则通过 TCP/IP 连接到 localhost 。默认端口号在编译时确定。
由于数据库服务器使用相同的默认值,因此在大多数情况下不必指定端口。
- 默认数据库用户名是你的操作系统用户名。数据库用户名确定后,它也会被用作默认数据库名。
+ 默认用户名是你的操作系统用户名,默认数据库名也是如此。
请注意,你不能随意以任意数据库用户名连接到任意数据库。数据库管理员应当已经告知你拥有的访问权限。
@@ -538,7 +537,7 @@ testdb=>
元命令
- 你输入到psql 中的任何以未加引用的反斜线开始的东西都是一个psql 元命令,它们由psql 自行处理。这些命令让psql 对管理和编写脚本更有用。元命令常常被称作斜线或者反斜线命令。
+ 你输入到psql 中的任何以未加引号的反斜线开始的东西都是一个psql 元命令,它们由psql 自行处理。这些命令让psql 对管理和编写脚本更有用。元命令常常被称作斜线或者反斜线命令。
@@ -554,7 +553,7 @@ testdb=>
如下面所述。其中介绍的:'variable_name ' 和:"variable_name " 形式也同样适用。
- 在参数中,用反引号(` )包围的文本会被视为传给 shell 的命令行。该命令的输出(去掉尾随换行)会替换反引号中的文本。在反引号包围的文本内部,不会发生特殊引用或其他处理,只有一种例外:如果出现:variable_name ,且variable_name 是psql 变量名,就会被替换为该变量的值。此外,:'variable_name ' 也会被替换为该变量的值,并会被适当地引用成单个 shell 命令参数。(后一种形式几乎总是更可取,除非你非常确定变量中包含什么。)由于回车和换行字符在所有平台上都无法安全引用,当变量值中出现这类字符时,:'variable_name ' 这种形式会打印错误消息,并且不会替换变量值。
+ 在参数中,用反引号(` )包围的文本会被视为传给 shell 的命令行。该命令的输出(去掉末尾的换行符)会替换反引号中的文本。在反引号包围的文本内部,不会进行特殊的引号处理或其他处理,但出现:variable_name 时,如果variable_name 是psql 变量名,就会被替换为该变量的值。此外,:'variable_name ' 也会被替换为该变量的值,并会适当地加上引号,使其成为单个 shell 命令参数。(后一种形式几乎总是更可取,除非你非常确定变量中包含什么。)由于无法保证在所有平台上都能对回车和换行字符安全地加引号,当变量值中出现这类字符时,:'variable_name ' 形式会打印错误消息,并且不会替换变量值。
@@ -577,7 +576,7 @@ testdb=>
\a
- 如果当前表格输出格式是不对齐,则切换为对齐;否则切换为不对齐。保留此命令是为了向后兼容。更通用的解决方案请参见\pset 。
+ 如果当前表格输出格式是非对齐,则切换为对齐;否则切换为非对齐。保留此命令是为了向后兼容。更通用的解决方案请参见\pset 。
@@ -598,7 +597,7 @@ testdb=>
默认情况下,参数在位置语法中被重用,但在给定conninfo 字符串时不会被重用。
传递-reuse-previous=on 或-reuse-previous=off 作为第一个参数将覆盖该默认设置。
如果参数被重用,则任何未明确指定为位置参数或在conninfo 字符串中的参数将从现有连接的参数中获取。
- 一个例外是,如果使用位置语法将host 设置更改为其先前值,则现有连接参数中存在的任何hostaddr 设置将被删除。
+ 一个例外是,如果使用位置语法更改host 设置,使其不同于先前的值,则现有连接参数中存在的任何hostaddr 设置将被删除。
此外,仅当用户、主机和端口设置未更改时,才会重用现有连接使用的任何密码。
当命令既不指定也不重用特定参数时,将使用libpq 的默认值。
@@ -614,7 +613,7 @@ testdb=>
=> \c mydb myuser host.dom 6432
=> \c service=foo
=> \c "host=localhost port=5432 dbname=mydb connect_timeout=10 sslmode=disable"
-=> \c -reuse-previous=on sslmode=require -- changes only sslmode
+=> \c -reuse-previous=on sslmode=require -- 仅更改 sslmode
=> \c postgresql://tom@localhost/mydb?application_name=myapp
@@ -760,7 +759,7 @@ testdb=>
\dA[+] [ pattern ]
- 列出访问方法。如果指定了pattern ,则只显示名称匹配该模式的访问方法。如果在命令名后附加+ ,还会列出每个访问方法关联的处理函数和描述。
+ 列出访问方法。如果指定了pattern ,则只显示名称匹配该模式的访问方法。如果在命令名后附加+ ,还会列出每个访问方法关联的处理器函数和描述。
@@ -885,28 +884,28 @@ testdb=>
\dF[+] [ pattern ]
- 列出文本搜索配置。如果指定了pattern ,则只显示名称匹配该模式的配置。如果使用\dF+ 形式,则显示每个配置的完整说明,包括底层文本搜索解析器和每种解析器词元类型的词典列表。
+ 列出全文检索配置。如果指定了pattern ,则只显示名称匹配该模式的配置。如果使用\dF+ 形式,则显示每个配置的完整说明,包括底层全文检索解析器和每种解析器词元类型的词典列表。
\dFd[+] [ pattern ]
- 列出文本搜索词典。如果指定了pattern ,则只显示名称匹配该模式的词典。如果使用\dFd+ 形式,还会显示每个选中词典的附加信息,包括底层文本搜索模板和选项值。
+ 列出全文检索词典。如果指定了pattern ,则只显示名称匹配该模式的词典。如果使用\dFd+ 形式,还会显示每个选中词典的附加信息,包括底层全文检索模板和选项值。
\dFp[+] [ pattern ]
- 列出文本搜索解析器。如果指定了pattern ,则只显示名称匹配该模式的解析器。如果使用\dFp+ 形式,则显示每个解析器的完整说明,包括底层函数和可识别的词元类型列表。
+ 列出全文检索解析器。如果指定了pattern ,则只显示名称匹配该模式的解析器。如果使用\dFp+ 形式,则显示每个解析器的完整说明,包括底层函数和可识别的词元类型列表。
\dFt[+] [ pattern ]
- 列出文本搜索模板。如果指定了pattern ,则只显示名称匹配该模式的模板。如果使用\dFt+ 形式,还会显示每个模板的附加信息,包括底层函数名。
+ 列出全文检索模板。如果指定了pattern ,则只显示名称匹配该模式的模板。如果使用\dFt+ 形式,还会显示每个模板的附加信息,包括底层函数名。
@@ -929,7 +928,7 @@ testdb=>
\dL[S+] [ pattern ]
- 列出过程语言。如果指定了pattern ,则只列出名称匹配该模式的语言。默认只显示用户创建的语言;提供S 修饰符可包含系统对象。如果在命令名后附加+ ,还会列出每种语言的调用处理程序、验证器、访问权限,以及它是否为系统对象。
+ 列出过程语言。如果指定了pattern ,则只列出名称匹配该模式的语言。默认只显示用户创建的语言;提供S 修饰符可包含系统对象。如果在命令名后附加+ ,还会列出每种语言的调用处理器、验证器、访问权限,以及它是否为系统对象。
@@ -971,7 +970,7 @@ testdb=>
\drds [ role-pattern [ database-pattern ] ]
- 列出已定义的配置设置。这些设置可以专属于角色、专属于数据库,或同时专属于两者。role-pattern 和database-pattern 分别用于选择要列出的特定角色和数据库。如果省略,或指定了* ,则列出所有设置,分别包括非角色专属或非数据库专属的设置。
+ 列出已定义的配置设置。这些设置可以特定于角色、特定于数据库,或同时特定于两者。role-pattern 和database-pattern 分别用于选择要列出的角色和数据库。省略某个模式参数或将其指定为* 时,不会按该参数筛选,还会分别包含不特定于角色或不特定于数据库的设置。
和命令用于定义角色专属和数据库专属的配置设置。
@@ -1087,7 +1086,9 @@ Tue Oct 26 21:40:57 CEST 1999
\encoding [ encoding ]
- 设置客户端字符集编码。如果没有参数,则显示当前编码。
+
+ 设置客户端字符集编码。没有参数时,此命令显示当前编码。
+
@@ -1133,7 +1134,7 @@ Tue Oct 26 21:40:57 CEST 1999
- 设置未对齐查询输出的字段分隔符。默认值是竖线(| )。
+ 设置非对齐查询输出的字段分隔符。默认值是竖线(| )。
它等同于\pset fieldsep 。
@@ -1149,7 +1150,7 @@ Tue Oct 26 21:40:57 CEST 1999
如果当前查询缓冲区为空,则最近发送的查询将被重新执行。除此之外,没有任何参数的\g 基本上等同于一个分号。
带有参数的\g 提供了一个一次性
替代\o 命令的选择。
- 如果参数以| 开头,则该行剩余的全部内容会被视为要执行的command ,其中不会进行变量插值或反引号展开。该行剩余的内容只会原样传递给 shell。
+ 如果参数以| 开头,则该行剩余的全部内容会被视为要执行的command ,其中不会进行变量插值或反引号扩展。该行剩余的内容只会原样传递给 shell。
@@ -1192,7 +1193,7 @@ CREATE INDEX
hello 10
- 如果指定了前缀 ,则会将该字符串加到查询的列名前面,以构成要使用的变量名:
+ 如果指定了prefix ,则会将该字符串加到查询的列名前面,以构成要使用的变量名:
=> SELECT 'hello' AS var1, 10 AS var2
-> \gset result_
=> \echo :result_var1 :result_var2
@@ -1221,7 +1222,7 @@ hello 10
给出指定SQL 命令的语法帮助。如果未指定command ,
则psql 将列出所有可用语法帮助的命令。如果command 是星号
- (* ),则显示所有SQL 命令的语法帮助。
+ (* ),则显示所有SQL 命令的语法帮助。
@@ -1242,9 +1243,7 @@ hello 10
\H 或 \html
- 打开HTML 查询输出格式。如果HTML 格式已经打开,
- 则切换回默认的对齐文本格式。此命令用于兼容性和便利性,但请参阅\pset
- 有关设置其他输出选项。
+ 打开HTML 查询输出格式。如果HTML 格式已经打开,则切换回默认的对齐文本格式。此命令是为兼容性和便利性而保留的;设置其他输出选项的方法见\pset 。
@@ -1254,13 +1253,10 @@ hello 10
\i 或 \include filename
- 从文件filename 中读取输入,并将其执行为
- 好像它是在键盘上键入的一样。
+ 从文件filename 中读取输入,并像在键盘上输入一样执行它。
- 如果filename 是-
- (连字符),那么标准输入将被读取,直到EOF指示或\q 元命令。
- 这可用于将交互式输入与文件输入交错使用。请注意,仅当在最外层级别处于活动状态时,Readline行为才会被使用。
+ 如果filename 是- (连字符),则从标准输入读取,直到遇到 EOF 指示或\q 元命令。这可用于将交互式输入与文件输入交错使用。请注意,只有在最外层启用了 Readline,此处才会使用 Readline 功能。
@@ -1279,36 +1275,20 @@ hello 10
这组命令实现了可嵌套的条件块。条件块必须以\if 开始,以\endif 结束。中间可以包含任意数量的\elif 子句,后面还可以选择跟随一个\else 子句。普通查询和其他类型的反斜线命令可以(通常也会)出现在构成条件块的命令之间。
- \if 和\elif 命令读取它们的参数,并将其作为布尔表达式进行评估。
- 如果表达式为true ,则处理将继续进行;否则,直到达到匹配的\elif 、
- \else 或\endif 为止,将跳过行。一旦\if 或
- \elif 测试成功,同一块中后续\elif 命令的参数不会被评估,而是被视为false。
- 在\else 之后的行只有在没有早期匹配的\if 或\elif 成功时才会被处理。
+ \if 和\elif 命令读取其参数,并将其作为布尔表达式求值。如果表达式的值为true ,则正常继续处理;否则,跳过后续行,直到遇到匹配的\elif 、\else 或\endif 。一旦\if 或\elif 测试成功,同一块中后续\elif 命令的参数就不再求值,而是被视为假。只有前面所有匹配的\if 和\elif 测试都未成功时,才会处理\else 后面的行。
- expression 参数
- 是\if 或\elif 命令的参数,
- 受变量插值和反引号扩展的影响,就像任何其他反斜杠命令参数一样。
- 之后,它被评估为一个开/关选项变量的值。因此,有效值是以下任何一个不
- 含糊的不区分大小写匹配之一:
- true , false , 1 ,
- 0 , on , off ,
- yes , no 。例如,
- t , T 和tR
- 都将被视为true 。
+ 与其他反斜线命令的参数一样,\if 或\elif 命令的expression 参数会经过变量插值和反引号扩展。随后,按开/关选项变量值的规则对结果求值。因此,有效值是以下值的不区分大小写且无歧义的匹配:true 、false 、1 、0 、on 、off 、yes 、no 。例如,t 、T 和tR 都会被视为true 。
不能正确求值为真或假的表达式会产生警告,并被视为假。
- 被跳过的行仍会正常解析,以识别查询和反斜线命令,但查询不会发送给服务器,条件命令(\if 、\elif 、\else 、\endif )以外的反斜线命令会被忽略。对于条件命令,只检查嵌套是否合法。被跳过的行中的变量引用不会展开,也不会执行反引号展开。
+ 被跳过的行仍会正常解析,以识别查询和反斜线命令,但查询不会发送给服务器,条件命令(\if 、\elif 、\else 、\endif )以外的反斜线命令会被忽略。对于条件命令,只检查嵌套是否合法。被跳过的行中的变量引用不会展开,也不会执行反引号扩展。
- 所有给定条件块的反斜杠命令必须出现在同一个源文件中。如果在主输入文件或一个
- \include 的文件上达到文件结束之前,所有本地
- \if 块都没有关闭,
- 那么psql 将会引发错误。
+ 同一个条件块的所有反斜线命令必须出现在同一个源文件中。如果主输入文件或通过\include 引入的文件到达 EOF 时,仍有本地\if 块未关闭,psql 就会报错。
下面是一个示例:
--- check for the existence of two separate records in the database and store
--- the results in separate psql variables
+-- 检查数据库中是否存在两条不同的记录,并将
+-- 结果分别存入不同的 psql 变量
SELECT
EXISTS(SELECT 1 FROM customer WHERE customer_id = 123) as is_customer,
EXISTS(SELECT 1 FROM employee WHERE employee_id = 456) as is_employee
@@ -1354,7 +1334,7 @@ SELECT
从数据库中读取具有OID loid 的大对象,并将其写入filename 。请注意,这与服务器函数
- lo_export 略有不同,后者使用数据库服务器运行的用户权限,
+ lo_export 略有不同,后者使用运行数据库服务器的用户的权限,
并在服务器的文件系统上操作。
@@ -1393,7 +1373,7 @@ lo_import 152801
- 从数据库中删除具有OID 是 loid 的大对象。
+ 从数据库中删除OID 为 loid 的大对象。
@@ -1411,10 +1391,10 @@ lo_import 152801
将后续查询结果保存到文件filename ,或通过管道传给 shell 命令command 。如果没有指定参数,查询输出将恢复为标准输出。
- 如果参数以| 开头,则该行剩余的全部内容会被视为要执行的command ,其中不会进行变量插值或反引号展开。该行剩余的内容只会原样传递给 shell。
+ 如果参数以| 开头,则该行剩余的全部内容会被视为要执行的command ,其中不会进行变量插值或反引号扩展。该行剩余的内容只会原样传递给 shell。
- 查询结果
包括从数据库服务器获取的所有表、命令响应和通知,以及查询数据库的各种反斜杠命令的输出(例如\d );但不包括错误消息。
+ 查询结果
包括从数据库服务器获取的所有表格、命令响应和通知,以及查询数据库的各种反斜杠命令的输出(例如\d );但不包括错误消息。
@@ -1429,7 +1409,10 @@ lo_import 152801
\p 或 \print
- 将当前查询缓冲区打印到标准输出。如果当前查询缓冲区为空,则改为打印最近执行的查询。
+
+ 将当前查询缓冲区打印到标准输出。
+ 如果当前查询缓冲区为空,则打印最近执行的查询。
+
@@ -1485,7 +1468,7 @@ lo_import 152801
零(默认值)会导致目标宽度由环境变量COLUMNS 控制,或者如果未设置
COLUMNS 则由检测到的屏幕宽度控制。
另外,如果columns 为零,则wrapped 格式仅影响屏幕输出。
- 如果columns 为非零,则文件和管道输出也会被包装到该宽度。
+ 如果columns 为非零,则文件和管道输出也会按该宽度折行。
@@ -1530,11 +1513,11 @@ lo_import 152801
wrapped 格式与aligned 相似,但会将较宽的数据值折成多行,使输出适应目标列宽。目标宽度的确定方式见columns 选项的说明。请注意,psql 不会尝试对列标题折行;因此,如果列标题所需的总宽度超过目标宽度,wrapped 格式的行为就与aligned 相同。
- asciidoc ,html ,
- latex ,latex-longtable ,和
+ asciidoc 、html 、
+ latex 、latex-longtable 和
troff-ms 格式生成的表格旨在包含在使用相应标记语言的文档中。
它们不是完整的文档!这在HTML 中可能不是必需的,但在
- LaTeX 中,则必须有一个完整的文档包装器。
+ LaTeX 中,则必须有一个完整文档的外层结构。
latex-longtable 格式需要LaTeX
的longtable 和booktabs 包。
@@ -1552,25 +1535,19 @@ lo_import 152801
- ascii 样式使用普通的ASCII 字符。数据中的换行使用右边边缘的+ 符号显示。
- 当wrapped 格式将数据从一行换到下一行而没有换行符时,在第一行的右边缘显示一个点(. ),并在下一行的左边缘再次显示。
+ ascii 样式使用普通的ASCII 字符。数据中的换行符以右边缘的+ 符号表示。当wrapped 格式在没有换行符的位置把数据折到下一行时,会在第一行的右边缘显示一个点(. ),并在下一行的左边缘再次显示。
- old-ascii 样式使用普通的ASCII 字符,使用在PostgreSQL 8.4及更早版本中使用的格式样式。
- 数据中的换行符使用: 符号代替左侧列分隔符显示。
- 当数据从一行换行到下一行而没有换行符时,使用; 符号代替左侧列分隔符。
+ old-ascii 样式使用普通的ASCII 字符,采用PostgreSQL 8.4 及更早版本的格式样式。数据中的换行符以替代左侧列分隔符的: 符号表示。当数据在没有换行符的位置折到下一行时,则用; 符号替代左侧列分隔符。
- unicode 样式使用Unicode绘图字符。数据中的换行使用右边距中的回车符号显示。
- 当数据从一行换行到下一行而没有换行符时,第一行的右边距显示省略号符号,
- 接着在下一行的左边距再次显示省略号符号。
+ unicode 样式使用 Unicode 框线绘制字符。数据中的换行符以右边缘的回车符号表示。当数据在没有换行符的位置折到下一行时,会在第一行的右边缘显示省略号符号,并在下一行的左边缘再次显示。
- 当border 设置大于零时,linestyle 选项还确定了用哪些字符绘制边框线。
- 普通的ASCII 字符在任何地方都有效,但在识别Unicode字符的显示器上看起来更好。
+ 当border 设置大于零时,linestyle 选项还决定用哪些字符绘制边框线。普通的ASCII 字符在任何环境中都可用,但在支持 Unicode 的显示设备上,Unicode 字符更美观。
@@ -1690,7 +1667,7 @@ lo_import 152801
\qecho text [ ... ]
- 这个命令与\echo 命令相同,只是输出将被写入查询输出通道,由\o 设置。
+ 这个命令与\echo 相同,只是输出会写入由\o 设置的查询输出通道。
@@ -1720,8 +1697,7 @@ lo_import 152801
\set [ name [ value [ ... ] ] ]
- 将psql 变量name 设置为值 ,如果给出多个值,则设置为所有值的串接。如果只给出一个参数,则将变量设置为空字符串值。要取消变量设置,请使用\unset 命令。
+ 将psql 变量name 设置为value ,如果给出多个值,则设置为所有值的串接。如果只给出一个参数,则将变量设置为空字符串值。要取消变量设置,请使用\unset 命令。
\set 没有任何参数时,显示当前设置的所有psql 变量的名称和值。
@@ -1742,8 +1718,10 @@ lo_import 152801
\setenv name [ value ]
- 将环境变量name 设置为值 ;如果没有提供值 ,则取消设置该环境变量。例如:
+
+ 设置环境变量name 为value ,
+ 或者如果未提供value ,则取消设置环境变量。示例:
+
testdb=> \setenv PAGER less
testdb=> \setenv LESS -imx4F
@@ -1776,8 +1754,7 @@ testdb=> \setenv LESS -imx4F
- 这个命令获取并显示指定视图的定义,以CREATE OR REPLACE VIEW 命令的形式。
- 定义将打印到当前查询输出通道,由\o 设置。
+ 这个命令获取指定视图的定义,并以CREATE OR REPLACE VIEW 命令的形式显示。定义会打印到由\o 设置的当前查询输出通道。
@@ -1833,7 +1810,7 @@ testdb=> \setenv LESS -imx4F
将当前查询缓冲区写入文件filename ,或通过管道传递给 shell 命令command 。如果当前查询缓冲区为空,则改为写入最近执行的查询。
- 如果参数以| 开头,则该行剩余的全部内容会被视为要执行的command ,其中不会进行变量插值或反引号展开。该行剩余的内容只会原样传递给 shell。
+ 如果参数以| 开头,则该行剩余的全部内容会被视为要执行的command ,其中不会进行变量插值或反引号扩展。该行剩余的内容只会原样传递给 shell。
@@ -1841,8 +1818,13 @@ testdb=> \setenv LESS -imx4F
\watch [ seconds ]
- 重复执行当前查询缓冲区(如同\g ),直到被中断或查询失败。每次执行之间等待指定的秒数(默认为 2)。每个查询结果都会显示一个标题,其中包含\pset title 字符串(如果有)、查询开始时间和延迟间隔。
- 如果当前查询缓冲区为空,则改为重新执行最近发送的查询。
+
+ 重复执行当前查询缓冲区(如同 \g 一样),直到被中断或查询失败。两次执行之间等待指定的秒数(默认 2 秒)。每次查询结果都会带有一个头部,其中包含 \pset title
+ 字符串(如果有)、查询开始时的时间以及延迟间隔。
+
+
+ 如果当前查询缓冲区为空,则重新执行最近发送的查询。
+
@@ -1871,13 +1853,11 @@ testdb=> \setenv LESS -imx4F
\! [ command ]
- 不带参数时,转义到一个子shell;psql 在子shell退出时恢复。
- 带参数时,执行shell命令command 。
+ 不带参数时,进入一个子 shell;子 shell 退出后,psql 恢复运行。带参数时,执行 shell 命令command 。
- 与大多数其他元命令不同,整个行的剩余部分始终被视为\! 的参数,
- 在参数中不执行变量插值或反引号扩展。行的其余部分被直接传递给shell。
+ 与大多数其他元命令不同,该行剩余的全部内容始终被视为\! 的参数,其中不会进行变量插值或反引号扩展。该行剩余内容会原样传给 shell。
@@ -1889,7 +1869,7 @@ testdb=> \setenv LESS -imx4F
显示帮助信息。可选的topic 参数
(默认为commands )选择要解释的psql 的哪个部分:
- commands 描述psql 的反斜杠命令;
+ commands 描述psql 的反斜线命令;
options 描述可以传递给psql 的命令行选项;
而variables 显示关于psql 配置变量的帮助。
@@ -1903,12 +1883,12 @@ testdb=> \setenv LESS -imx4F
模式
- patterns
+ 模式
在 psql 和 pg_dump 中
- 很多\d 命令都可以用一个pattern 参数来指定要被显示的对象名称。在最简单的情况下,模式正好就是该对象的准确名称。在模式中的字符通常会被变成小写形式(就像在 SQL 名称中那样),例如\dt FOO 将会显示名为foo 的表。就像在 SQL 名称中那样,把模式放在双引号中可以阻止它被转换成小写形式。如果需要在一个模式中包括一个真正的双引号字符,则需要把它写成两个相邻的双引号,这同样是符合 SQL 引用标识符的规则。例如,\dt "FOO""BAR" 将显示名为FOO"BAR (不是foo"bar )的表。和普通的 SQL 名称规则不同,你不能只在模式的一部分周围放上双引号,例如\dt FOO"FOO"BAR 将会显示名为fooFOObar 的表。
+ 很多\d 命令都可以用一个pattern 参数来指定要被显示的对象名称。在最简单的情况下,模式正好就是该对象的准确名称。在模式中的字符通常会被变成小写形式(就像在 SQL 名称中那样),例如\dt FOO 将会显示名为foo 的表。就像在 SQL 名称中那样,把模式放在双引号中可以阻止它被转换成小写形式。如果需要在一个模式中包括一个真正的双引号字符,则需要在双引号包围的文本内把它写成两个相邻的双引号,这同样是符合 SQL 加引号标识符的规则。例如,\dt "FOO""BAR" 将显示名为FOO"BAR (不是foo"bar )的表。和普通的 SQL 名称规则不同,你可以只在模式的一部分周围放上双引号,例如\dt FOO"FOO"BAR 将会显示名为fooFOObar 的表。
@@ -1952,7 +1932,7 @@ bar
- 如果调用\set 时没有第二个参数,该变量会被设置为一个空字符串值。要重置(即删除)一个变量,可以使用命令\unset 。要显示所有变量的值,在调用\set 时不带任何参数即可。
+ 如果调用\set 时没有第二个参数,该变量会被设置为一个空字符串值。要取消设置(即删除)一个变量,可以使用命令\unset 。要显示所有变量的值,在调用\set 时不带任何参数即可。
@@ -1966,7 +1946,7 @@ bar
- 控制psql 行为的变量通常不能被重置或者设置为无效值。允许\unset 命令,但它会被解释为将变量设置为它的默认值。没有第二参数的\set 命令会被解释为将变量设置为on (对于接受该值的控制变量),对不接受该值的变量则会拒绝这个命令。此外,接受值on 和off 的控制变量也能接受其他常见的布尔值拼写方式,例如true 和false 。
+ 控制psql 行为的变量通常不能被取消设置或者设置为无效值。允许\unset 命令,但它会被解释为将变量设置为它的默认值。没有第二参数的\set 命令会被解释为将变量设置为on (对于接受该值的控制变量),对不接受该值的变量则会拒绝这个命令。此外,接受值on 和off 的控制变量也能接受其他常见的布尔值拼写方式,例如true 和false 。
@@ -1984,7 +1964,7 @@ bar
- 在被设置为on (默认)时,每一个 SQL 命令在成功完成时会被自动提交。在这种模式中要推迟提交,必须输入一个BEGIN 或者START TRANSACTION SQL 命令。当被设置为off 或者被重置时,在显式发出COMMIT 或者END 之前,SQL 命令不会被提交。自动提交打开模式会为你发出一个隐式的BEGIN ,这会发生在任何不在一个事务块中且本身即不是BEGIN 及其他事务控制命令且不是无法在事务块中执行的命令(例如VACUUM )之前。
+ 在被设置为on (默认)时,每一个 SQL 命令在成功完成时会被自动提交。在这种模式中要推迟提交,必须输入一个BEGIN 或者START TRANSACTION SQL 命令。当被设置为off 或者被取消设置时,在显式发出COMMIT 或者END 之前,SQL 命令不会被提交。自动提交关闭模式会为你发出一个隐式的BEGIN ,这会发生在任何不在一个事务块中且本身既不是BEGIN 及其他事务控制命令且不是无法在事务块中执行的命令(例如VACUUM )之前。
@@ -2014,7 +1994,7 @@ bar
DBNAME
- 当前已连接的数据库名称。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或者重置。
+ 当前已连接的数据库名称。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或者取消设置。
@@ -2023,7 +2003,7 @@ bar
ECHO
- 如果被设置为all ,所有非空输入行会被按照读入它们的样子打印到标准输出(不适用于交互式读取的行)。要在程序开始时选择这种行为,可以使用开关-a 。如果被设置为queries ,psql 会在发送每个查询给服务器时将它们打印到标准输出。选择这种行为的开关是-e 。如果被设置为errors ,那么只有失败的查询会被显示在标准错误输出上。这种行为的开关是-b 。如果被重置或者设置为none (默认值)则不会显示任何查询。
+ 如果被设置为all ,所有非空输入行会在读入时打印到标准输出(不适用于交互式读取的行)。要在程序开始时选择这种行为,可以使用开关-a 。如果被设置为queries ,psql 会在发送每个查询给服务器时将它们打印到标准输出。选择这种行为的开关是-e 。如果被设置为errors ,那么只有失败的查询会被显示在标准错误输出上。这种行为的开关是-b 。如果被设置为none (默认值)则不会显示任何查询。
@@ -2041,7 +2021,7 @@ bar
ENCODING
- 当前的客户端字符集编码。每一次你连接到一个数据库(包括程序启动)时以及当你用\encoding 更改编码时,这个变量都会被设置,但它可以被更改或者重置。
+ 当前的客户端字符集编码。每一次你连接到一个数据库(包括程序启动)时以及当你用\encoding 更改编码时,这个变量都会被设置,但它可以被更改或者取消设置。
@@ -2050,12 +2030,12 @@ bar
FETCH_COUNT
- 如果这个变量被设置为一个大于零的整数值,SELECT 查询的结果会以一组一组的方式取出并且显示(而不是像默认的那样把整个结果集拿到以后再显示),每一组就会包括这么多个行。因此,这种方式只会使用有限的内存量,而不管整个结果集的大小。在启用这个特性时,通常会使用 100 到 1000 的设置。记住在使用这种特性时,一个查询可能会在已经显示了一些行之后失败。
+ 如果这个变量被设置为一个大于零的整数值,SELECT 查询的结果会以一组一组的方式取出并且显示(而不是像默认的那样把整个结果集拿到以后再显示),每组包含的行数等于该整数值。因此,这种方式只会使用有限的内存量,而不管整个结果集的大小。在启用这个特性时,通常会使用 100 到 1000 的设置。记住在使用这种特性时,一个查询可能会在已经显示了一些行之后失败。
- 尽管可以把这种特性用于任何的输出格式,但是默认的aligned 格式看起来会比较糟糕,因为每一组的FETCH_COUNT 个行将被单独格式化,这就会导致不同的行组的列宽不同。其他的输出格式会更好。
+ 尽管可以把这种特性用于任何的输出格式,但是默认的aligned 格式看起来会比较糟糕,因为每一组的FETCH_COUNT 行将被单独格式化,这就会导致不同的行组的列宽不同。其他的输出格式会更好。
@@ -2065,7 +2045,7 @@ bar
HISTCONTROL
- 如果这个变量被设置为ignorespace ,则以一个空格开始的行不会被放入到历史列表中。如果被设置为值ignoredups ,则匹配之前的历史行的行不会被放入。值ignoreboth 组合了上述两种值。如果被重置或者被设置为none (默认值),所有在交互模式中被读入的行都会保存在历史列表中。
+ 如果这个变量被设置为ignorespace ,则以一个空格开始的行不会被放入到历史列表中。如果被设置为值ignoredups ,则与上一条历史记录相同的行不会被放入。值ignoreboth 组合了上述两种值。如果被设置为none (默认值),所有在交互模式中被读入的行都会保存在历史列表中。
@@ -2107,7 +2087,7 @@ bar
HOST
- 当前连接到的数据库服务器主机。每次连接到数据库时都会设置该变量(包括程序启动时),但也可以被更改或重置。
+ 当前连接到的数据库服务器主机。每次连接到数据库时都会设置该变量(包括程序启动时),但也可以被更改或取消设置。
@@ -2116,7 +2096,7 @@ bar
IGNOREEOF
- 如果被设置为1或者更小,向一个psql 的交互式会话发送一个EOF 字符(通常是Control D )将会终止应用。如果设置为一个较大的数字值,则必须键入多个连续的EOF 字符才能让交互式会话终止。如果该变量被设置为一个非数字值,则它会被解释为10。默认值为0。
+ 如果被设置为1或者更小,向一个psql 的交互式会话发送一个EOF 字符(通常是Control D )将会终止应用。如果设置为一个较大的数字值,则必须连续键入与该数值相等数量的EOF 字符才能让交互式会话终止。如果该变量被设置为一个非数字值,则它会被解释为10。默认值为0。
@@ -2144,7 +2124,7 @@ bar
- 当被设置为on 时,如果事务块中的一个语句产生一个错误,该错误会被忽略并且该事务会继续。当被设置为interactive 时,只在交互式会话中忽略这类错误,而读取脚本文件时则不会忽略错误。当被重置或者设置为off (默认值)时,事务块中产生错误的一个语句会中止整个事务。错误回滚模式的工作原理是在事务块的每个命令之前都为你发出一个隐式的SAVEPOINT ,然后在该命令失败时回滚到该保存点。
+ 当被设置为on 时,如果事务块中的一个语句产生一个错误,该错误会被忽略并且该事务会继续。当被设置为interactive 时,只在交互式会话中忽略这类错误,而读取脚本文件时则不会忽略错误。当被设置为off (默认值)时,事务块中产生错误的一个语句会中止整个事务。错误回滚模式的工作原理是在事务块的每个命令之前都为你发出一个隐式的SAVEPOINT ,然后在该命令失败时回滚到该保存点。
@@ -2162,7 +2142,7 @@ bar
PORT
- 当前连接到的数据库服务器端口。每次连接到数据库时都会设置该变量(包括程序启动时),但也可以被更改或重置。
+ 当前连接到的数据库服务器端口。每次连接到数据库时都会设置该变量(包括程序启动时),但也可以被更改或取消设置。
@@ -2194,7 +2174,7 @@ bar
SERVER_VERSION_NUM
- 字符串形式的服务器版本号,例如9.6.2 、10.1 或者11beta1 ,以及数字形式的服务器版本号,例如90602 或者100001 。每次你连接到一个数据库(包括程序启动)时,这些都会被设置,但可以被改变或者重设。
+ 字符串形式的服务器版本号,例如9.6.2 、10.1 或者11beta1 ,以及数字形式的服务器版本号,例如90602 或者100001 。每次你连接到一个数据库(包括程序启动)时,这些都会被设置,但可以被改变或者取消设置。
@@ -2203,7 +2183,7 @@ bar
SHOW_CONTEXT
- 这个变量可以被设置为值never 、errors 或者always 来控制是否在来自服务器的消息中显示CONTEXT 域。默认是errors (表示在错误消息中显示上下文,但在通知和警告消息中不显示)。
+ 这个变量可以被设置为值never 、errors 或者always 来控制是否在来自服务器的消息中显示CONTEXT 字段。默认是errors (表示在错误消息中显示上下文,但在通知和警告消息中不显示)。
当VERBOSITY 被设置为terse 时,这个设置无效(另见\errverbose ,它可以用来得到刚遇到的错误的详细信息)。
@@ -2222,7 +2202,7 @@ bar
SINGLESTEP
- 设置这个变量为on 等效于命令选项-s 。
+ 设置这个变量为on 等效于命令行选项-s 。
@@ -2231,7 +2211,7 @@ bar
USER
- 当前连接的数据库用户。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或者重置。
+ 当前连接的数据库用户。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或者取消设置。
@@ -2240,7 +2220,7 @@ bar
VERBOSITY
- 这个变量可以被设置为值default 、verbose 或者terse 来控制错误报告的详细程度(另见\errverbose ,在想得到之前的错误的详细版本时使用)。
+ 这个变量可以被设置为值default 、verbose 或者terse 来控制错误报告的详细程度(另见\errverbose ,在想得到刚遇到的错误的详细信息时使用)。
@@ -2251,7 +2231,7 @@ bar
VERSION_NUM
- 这些变量在程序启动时被设置以反映psql 的版本,分别是一个详细的字符串、一个短字符串(例如9.6.2 、10.1 或者11beta1 )以及一个数字(例如90602 或者100001 )。它们可以被更改或重设。
+ 这些变量在程序启动时被设置以反映psql 的版本,分别是一个详细的字符串、一个短字符串(例如9.6.2 、10.1 或者11beta1 )以及一个数字(例如90602 或者100001 )。它们可以被更改或取消设置。
@@ -2261,10 +2241,10 @@ bar
- SQL 中插入变量
+ SQL 插值
- psql 变量的一个关键特性是可以把它们替换(插入
)到常规SQL 语句中,也可以把它们作为元命令的参数。此外,psql 还提供了功能来确保被用作 SQL 字面量和标识符的变量值会被正确地加引号。插入一个值而不加引号的语法是在变量名前面加上一个冒号(: )。例如,
+ psql 变量的一个关键特性是可以把它们替换(插值
)到常规SQL 语句中,也可以把它们替换到元命令的参数中。此外,psql 还提供了功能来确保被用作 SQL 字面量和标识符的变量值会被正确地加引号。不加引号地插值一个值的语法是在变量名前面加上一个冒号(: )。例如,
testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :foo;
@@ -2273,7 +2253,7 @@ testdb=> SELECT * FROM :foo;
- 当一个值被用作 SQL 文本或者标识符时,最安全的是把它加上引用。要引用一个变量的值作为 SQL 文本,可以把变量名称放在单引号中并且在引号前面写一个冒号。要引用作为 SQL 标识符,则可以把变量名称放在双引号中并且在引号前面写一个冒号。这种结构可以正确地处理变量值中嵌入的引号和其他特殊字符。之前的示例用这种方法写会更安全:
+ 当一个值要用作 SQL 字面量或标识符时,最安全的做法是为它加上引号。要将变量值作为 SQL 字面量加引号,应写一个冒号,后面跟用单引号括起来的变量名。要将变量值作为 SQL 标识符加引号,则在冒号后面用双引号括起变量名。这些写法能正确处理变量值中嵌入的引号和其他特殊字符。前面的示例可用以下更安全的写法:
testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :"foo";
@@ -2281,11 +2261,11 @@ testdb=> SELECT * FROM :"foo";
- 在被引用的SQL 文本和标识符中将不会执行变量插入。因此,一个诸如':foo' 的结构不会从一个变量的值产生一个被引用的文本(即便能够也会不安全,因为无法正确地处理嵌入在值中的引号)。
+ 在加引号的SQL 字面量和标识符内部,不会执行变量插值。因此,':foo' 这样的写法不能根据变量值生成加引号的字面量(即使能够生效,也不安全,因为它无法正确处理变量值中嵌入的引号)。
- 使用这种机制的一个示例是把一个文件的内容拷贝到一个表列中。首先把该文件载入到一个变量,然后把该变量的值作为一个被引用的字符串插入:
+ 使用这种机制的一个示例是把一个文件的内容拷贝到一个表列中。首先把该文件载入到一个变量,然后把该变量的值作为一个加引号的字符串进行插值:
testdb=> \set content `cat my_file.txt`
testdb=> INSERT INTO my_table VALUES (:'content');
@@ -2294,11 +2274,11 @@ testdb=> INSERT INTO my_table VALUES (:'content');
- 因为冒号可以合法地出现在 SQL 命令中,一次明显的插入尝试(即:name 、:'name' 或者:"name" )不会被替换,除非所提及的变量就是当前被设置的。在任何情况下,可以用一个反斜线对冒号进行转义以避免它被替换。
+ 因为冒号可以合法地出现在 SQL 命令中,一次明显的插值尝试(即:name 、:'name' 或者:"name" )不会被替换,除非所指的变量当前已设置。在任何情况下,可以用一个反斜线对冒号进行转义以避免它被替换。
- 变量的冒号语法对嵌入式查询语言(例如ECPG )来说是标准的SQL 。用于数组切片和类型转换的冒号语法是PostgreSQL 扩展,它有时可能会与标准用法冲突。把一个变量值转义成 SQL 文本或者标识符的冒号引用语法是一种psql 扩展。
+ 变量的冒号语法对嵌入式查询语言(例如ECPG )来说是标准的SQL 。用于数组切片和类型转换的冒号语法是PostgreSQL 扩展,它有时可能会与标准用法冲突。把一个变量值转义成 SQL 字面量或者标识符的冒号加引号语法是一种psql 扩展。
@@ -2333,7 +2313,7 @@ testdb=> INSERT INTO my_table VALUES (:'content');
%n
- 数据库会话用户名。(在数据库会话期间,SET SESSION AUTHORIZATION 命令可能改变该值的展开结果。)
+ 数据库会话用户名。(在数据库会话期间,SET SESSION AUTHORIZATION 命令可能改变该值的扩展结果。)
@@ -2344,20 +2324,21 @@ testdb=> INSERT INTO my_table VALUES (:'content');
%~
- 与%/ 相同,但如果该数据库是你的默认数据库,则输出~ (波浪号)。
+ 类似 %/ ,但如果该数据库是你的默认数据库,则输出 ~
+ (波浪号)。
%#
- 如果会话用户是数据库超级用户,则为# ,否则为> 。(在数据库会话期间,SET SESSION AUTHORIZATION 命令可能改变该值的展开结果。)
+ 如果会话用户是数据库超级用户,则为# ,否则为> 。(在数据库会话期间,SET SESSION AUTHORIZATION 命令可能改变该值的扩展结果。)
%p
- 当前连接的后端的进程 ID。
+ 当前所连接后端的进程 ID。
@@ -2365,7 +2346,7 @@ testdb=> INSERT INTO my_table VALUES (:'content');
%R
- 在提示符 1 中,通常为 = ;但如果会话处于条件块的非活动分支中,则为 @ ;如果处于单行模式,则为 ^ ;如果会话已与数据库断开连接(这可能发生在 \connect 失败时),则为 ! 。在提示符 2 中,%R 会被替换为一个字符,该字符取决于 psql 为什么还期待更多输入:如果命令只是尚未终止,则为 - ;如果存在未结束的 /* ... */ 注释,则为 * ;如果存在未结束的带引号字符串,则为单引号;如果存在未结束的带引号标识符,则为双引号;如果存在未结束的 dollar-quoted 字符串,则为美元符号;如果存在未匹配的左括号,则为 ( 。在提示符 3 中,%R 不会产生任何输出。
+ 在提示符 1 中,通常为 = ;但如果会话处于条件块的非活动分支中,则为 @ ;如果处于单行模式,则为 ^ ;如果会话已与数据库断开连接(这可能发生在 \connect 失败时),则为 ! 。在提示符 2 中,%R 会被替换为一个字符,该字符取决于 psql 为什么还期待更多输入:如果命令只是尚未终止,则为 - ;如果存在未结束的 /* ... */ 注释,则为 * ;如果存在未结束的带引号字符串,则为单引号;如果存在未结束的带引号标识符,则为双引号;如果存在未结束的 美元引用字符串,则为美元符号;如果存在未匹配的左括号,则为 ( 。在提示符 3 中,%R 不会产生任何输出。
@@ -2392,7 +2373,7 @@ testdb=> INSERT INTO my_table VALUES (:'content');
% digits
- 带有所示八进制码的字符被替换。
+ 替换为指定八进制代码对应的字符。
@@ -2449,7 +2430,7 @@ testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '
psql 支持 Readline 库,便于编辑和检索输入行。命令历史记录会在 psql 退出时自动保存,并在 psql 启动时重新载入。也支持 Tab 补全,不过其补全逻辑并不声称自己是 SQL 解析器。Tab 补全生成的查询还可能干扰其他 SQL 命令,例如 SET
- TRANSACTION ISOLATION LEVEL>。如果出于某种原因你不喜欢 Tab 补全,可以将以下内容放入主目录下名为 .inputrc 的文件中,将其关闭:
+ TRANSACTION ISOLATION LEVEL 。如果出于某种原因你不喜欢 Tab 补全,可以将以下内容放入主目录下名为 .inputrc 的文件中,将其关闭:
$if psql
set disable-completion on
$endif
@@ -2591,11 +2572,11 @@ PSQL_EDITOR_LINENUMBER_ARG='--line '
用户的个人启动文件名为.psqlrc ,并且在调用用户的主目录中寻找。
- 在Windows上,个人启动文件的名称改为%APPDATA%\postgresql\psqlrc.conf 。
+ Windows 没有主目录这一概念,在 Windows 上,个人启动文件的名称为%APPDATA%\postgresql\psqlrc.conf 。
在任何情况下,可以通过设置PSQLRC 环境变量来覆盖此默认文件路径。
- 系统范围的启动文件和用户个人的启动文件都可以通过在文件名后附加连字符和PostgreSQL 的主版本或次版本号来使其与psql 版本相关,
+ 系统范围的启动文件和用户个人的启动文件都可以通过在文件名后附加连字符和PostgreSQL 的大版本或小版本号来使其与psql 版本相关,
例如~/.psqlrc-9.2 或~/.psqlrc-9.2.5 。
最具体版本匹配的文件将优先读取,而不是非特定版本的文件。
@@ -2622,14 +2603,14 @@ PSQL_EDITOR_LINENUMBER_ARG='--line '
- psql 最适合与相同或较旧主要版本的服务器配合使用。
- 如果服务器的版本比psql 本身更新,反斜杠命令特别容易失败。
- 然而,\d 系列的反斜杠命令应该可以在版本回溯到9.2的服务器上运行,
+ psql 最适合与相同或较旧大版本的服务器配合使用。
+ 如果服务器的版本比psql 本身更新,反斜线命令特别容易失败。
+ 然而,\d 系列的反斜线命令应该可以在最低至 7.4 版本的服务器上运行,
但不一定适用于比psql 本身更新的服务器。运行SQL命令和显示查询结果的一般功能
- 也应该可以在更新主要版本的服务器上运行,但不能保证在所有情况下都能实现。
+ 也应该可以在更新大版本的服务器上运行,但不能保证在所有情况下都能实现。
- 如果你想用psql 连接到多个具有不同主版本的服务器,推荐使用最新版本的psql 。或者,你可以为每一个主版本保留一份psql 拷贝,并且针对相应的服务器使用匹配的版本。但实际上,这种额外的麻烦是不必要的。
+ 如果你想用psql 连接到多个具有不同大版本的服务器,推荐使用最新版本的psql 。或者,你可以为每一个大版本保留一份psql 拷贝,并且针对相应的服务器使用匹配的版本。但实际上,这种额外的麻烦是不必要的。
@@ -2643,7 +2624,7 @@ PSQL_EDITOR_LINENUMBER_ARG='--line '
- 在PostgreSQL 8.4 之前,psql 允许一个单字母反斜线命令的第一个参数直接写在该命令后面,中间不需要空格。现在则要求一些空格。
+ 在PostgreSQL 8.4 之前,psql 允许一个单字母反斜线命令的第一个参数直接写在该命令后面,中间不需要空白。现在则要求用空白分隔。
@@ -2701,6 +2682,7 @@ peter@localhost testdb=> SELECT * FROM my_table;
3 | three
4 | four
(4 rows)
+
要以不同方式显示表格,可以使用\pset 命令:
peter@localhost testdb=> \pset border 2
Border style is 2.
@@ -2779,10 +2761,10 @@ testdb=> \crosstabview first second
(4 rows)
第二个示例显示一个乘法表,行按数值降序排列,列则独立地按数值升序排列。
testdb=> SELECT t1.first as "A", t2.first+100 AS "B", t1.first*(t2.first+100) as "AxB",
-testdb(> row_number() over(order by t2.first) AS ord
-testdb(> FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC
-testdb(> \crosstabview "A" "B" "AxB" ord
- A | 101 | 102 | 103 | 104
+testdb-> row_number() over(order by t2.first) AS ord
+testdb-> FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC
+testdb-> \crosstabview "A" "B" "AxB" ord
+ A | 101 | 102 | 103 | 104
---+-----+-----+-----+-----
4 | 404 | 408 | 412 | 416
3 | 303 | 306 | 309 | 312
diff --git a/zh/10/release-10.sgml b/zh/10/release-10.sgml
index daa65b92..f336ebaf 100644
--- a/zh/10/release-10.sgml
+++ b/zh/10/release-10.sgml
@@ -7519,7 +7519,7 @@ Branch: REL_11_STABLE [98a4d6950] 2020-04-27 12:21:04 -0400
Branch: REL_10_STABLE [072a86327] 2020-04-27 12:21:04 -0400
Branch: REL9_6_STABLE [22dcb6c20] 2020-04-27 12:21:04 -0400
-->
- 修复全文搜索,使其正确处理短语搜索之上的 NOT(Tom Lane)
+ 修复全文检索,使其正确处理短语搜索之上的 NOT(Tom Lane)
!(foo<->bar) 等查询在通过 GiST 或 GIN 索引搜索执行时,无法找到匹配行。
@@ -7533,7 +7533,7 @@ Branch: REL_11_STABLE [5db48808c] 2020-05-07 15:59:52 -0400
Branch: REL_10_STABLE [26cf16a93] 2020-05-07 15:59:52 -0400
Branch: REL9_6_STABLE [7c9d9aa5c] 2020-05-07 15:59:52 -0400
-->
- 修复短语搜索包含同时具有前缀匹配和权重限制的项时的全文搜索(Tom Lane)
+ 修复短语搜索包含同时具有前缀匹配和权重限制的项时的全文检索(Tom Lane)
@@ -9347,7 +9347,7 @@ Branch: REL_11_STABLE [88d03d73c] 2019-11-03 16:10:45 -0500
Branch: REL_10_STABLE [4077e9ae1] 2019-11-03 16:10:56 -0500
Branch: REL9_6_STABLE [d43bd9dce] 2019-11-03 16:11:05 -0500
-->
- 避免 ispell 文本搜索词典包含错误的词缀数据时发生崩溃(Arthur Zakirov)
+ 避免 ispell 文本检索词典包含错误的词缀数据时发生崩溃(Arthur Zakirov)
@@ -11869,7 +11869,7 @@ Branch: REL9_3_STABLE [591d0ac88] 2018-09-15 13:42:34 -0400
修复字符类检查,使其在 Windows 上不会因高于 U+FFFF 的 Unicode 字符而失败(Tom Lane,Kenji Uno)
- 此缺陷影响全文搜索操作,以及 contrib/ltree 和 contrib/pg_trgm 。
+ 此缺陷影响全文检索操作,以及 contrib/ltree 和 contrib/pg_trgm 。
@@ -12467,7 +12467,7 @@ Branch: REL9_5_STABLE [c79b39fb1] 2018-09-06 10:49:45 -0400
Branch: REL9_4_STABLE [d4ab39626] 2018-09-06 10:49:45 -0400
Branch: REL9_3_STABLE [25ff97ba7] 2018-09-06 10:49:45 -0400
-->
- 修复 contrib/unaccent 的 unaccent() 函数,使其使用与函数位于同一模式中的 unaccent 文本搜索词典(Tom Lane)
+ 修复 contrib/unaccent 的 unaccent() 函数,使其使用与函数位于同一模式中的 unaccent 文本检索词典(Tom Lane)
以前,它尝试通过搜索路径查找词典;如果搜索路径设置受限,就可能失败。
@@ -13028,7 +13028,7 @@ Branch: REL9_3_STABLE [cbb37b2e1] 2018-05-24 12:07:42 -0400
-->
修复 getObjectDescription 和 getObjectIdentity 输出中某些对象名未加模式限定的问题(Kyotaro Horiguchi,Tom Lane)
- 排序规则、转换、文本搜索对象、发布关系和扩展统计对象的名称,未在应当使用模式限定时加上限定。
+ 排序规则、转换、文本检索对象、发布关系和扩展统计对象的名称,未在应当使用模式限定时加上限定。
@@ -15945,7 +15945,7 @@ Branch: REL_10_STABLE [5159626af] 2017-11-03 14:14:16 -0400
-->
移除 contrib/tsearch2 模块(Robert Haas)
- 此模块用于兼容 PostgreSQL 8.3 之前的发行版所附带的全文搜索版本。
+ 此模块用于兼容 PostgreSQL 8.3 之前的发行版所附带的全文检索版本。
@@ -16770,7 +16770,7 @@ This was disabled in the PG 9.6 branch so there is no commit here.
- 为 JSON 和 JSONB 增加全文搜索支持(Dmitry Dolgov)
+ 为 JSON 和 JSONB 增加全文检索支持(Dmitry Dolgov)
现在可以将函数 ts_headline() 和 to_tsvector() 用于这些数据类型。
diff --git a/zh/10/rowtypes.sgml b/zh/10/rowtypes.sgml
index 00293d60..7f508227 100644
--- a/zh/10/rowtypes.sgml
+++ b/zh/10/rowtypes.sgml
@@ -68,7 +68,7 @@ CREATE TABLE inventory_item (
- 构造组合值
+ 构造复合值
复合类型
@@ -76,7 +76,7 @@ CREATE TABLE inventory_item (
- 要把组合值写成字面常量,请将各字段值放在圆括号内,并用逗号分隔。你可以给任意字段值加双引号;如果它包含逗号或圆括号,则必须这样做。(更多细节见 下文。)因此,组合常量的一般格式如下:
+ 要把复合值写成字面常量,请将各字段值放在圆括号内,并用逗号分隔。你可以给任意字段值加双引号;如果它包含逗号或圆括号,则必须这样做。(更多细节见 下文。)因此,复合常量的一般格式如下:
'( val1 , val2 , ... )'
@@ -96,16 +96,21 @@ CREATE TABLE inventory_item (
- (这些常量实际上只是中讨论的通用类型常量的一种特例。该常量最初会被当作字符串处理,然后传递给复合类型输入转换例程。必要时可能需要显式指定类型。)
+ (这些常量实际上只是中讨论的通用类型常量的一种特例。该常量最初会被当作字符串处理,然后传递给复合类型输入转换例程。可能需要显式指定类型,以指明应将该常量转换为哪种类型。)
- 这种ROW 表达式语法也可以用于构造复合值。在大多数情况下,它比字符串字面量语法简单得多,因为你不必担心多层引号。我们在上文已经用过这种方法:
+
+ ROW 表达式语法也可以用于构造复合值。在大多数情况下,它比字符串字面量语法简单得多,因为你不必担心多层引号。我们在上文已经用过这种方法:
+
ROW('fuzzy dice', 42, 1.99)
ROW('', 42, NULL)
- 只要表达式中有多个字段,ROW 关键字实际上是可选的,因此这些可以简写为:
+
+ 只要表达式中有多个字段,ROW 关键字实际上是可选的,因此这些可以简写为:
+
('fuzzy dice', 42, 1.99)
('', 42, NULL)
- 这种ROW 表达式语法的更多细节见。
+
+ 关于ROW 表达式语法的更多细节,见。
@@ -114,7 +119,7 @@ ROW('', 42, NULL)
访问复合类型
- 要访问组合列中的某个字段,可以写一个点号再加字段名,这很像通过表名选取字段。实际上,它与通过表名选取字段太像了,以至于你通常必须使用圆括号,以免让解析器混淆。例如,你可能尝试从示例表on_hand 中选取一些子字段:
+ 要访问复合列中的某个字段,可以写一个点号再加字段名,这很像通过表名选取字段。实际上,它与通过表名选取字段太像了,以至于你通常必须使用圆括号,以免让解析器混淆。例如,你可能尝试从示例表on_hand 中选取一些子字段:
SELECT item.name FROM on_hand WHERE item.price > 9.99;
@@ -136,7 +141,7 @@ SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
- 无论何时从组合值中选择字段,都会遇到类似的语法问题。例如,要从一个返回组合值的函数结果中只选取一个字段,你需要这样写:
+ 无论何时从复合值中选择字段,都会遇到类似的语法问题。例如,要从一个返回复合值的函数结果中只选取一个字段,你需要这样写:
SELECT (my_func(...)).field FROM ...
@@ -151,10 +156,10 @@ SELECT (my_func(...)).field FROM ...
- 修改组合值
+ 修改复合类型
- 下面是一些插入和更新组合列时正确语法的示例。先看插入或更新整个列值的情况:
+ 下面是一些插入和更新复合列时正确语法的示例。先看插入或更新整个列值的情况:
INSERT INTO mytab (complex_col) VALUES((1.1,2.2));
@@ -166,7 +171,7 @@ UPDATE mytab SET complex_col = ROW(1.1,2.2) WHERE ...;
- 我们也可以更新组合列中的单个子字段:
+ 我们也可以更新复合列中的单个子字段:
UPDATE mytab SET complex_col.r = (complex_col).r + 1 WHERE ...;
@@ -194,11 +199,11 @@ INSERT INTO mytab (complex_col.r, complex_col.i) VALUES(1.1, 2.2);
- 在PostgreSQL 中,查询中对表名(或别名)的引用,实际上就是对该表当前行的组合值的引用。例如,如果我们有一个如 上文所示的表inventory_item ,就可以写:
+ 在PostgreSQL 中,查询中对表名(或别名)的引用,实际上就是对该表当前行的复合值的引用。例如,如果我们有一个如 上文所示的表inventory_item ,就可以写:
SELECT c FROM inventory_item c;
- 这个查询会产生一个单独的组合值列,因此我们可能得到如下输出:
+ 这个查询会产生一个单独的复合值列,因此我们可能得到如下输出:
c
------------------------
@@ -209,7 +214,7 @@ SELECT c FROM inventory_item c;
- 普通的限定列名语法table_name . column_name 可以理解为对该表当前行的组合值进行 字段选择。(出于效率原因,实际上并不是这样实现的。)
+ 普通的限定列名语法table_name . column_name 可以理解为对该表当前行的复合值进行 字段选择。(出于效率原因,实际上并不是这样实现的。)
@@ -243,10 +248,15 @@ SELECT (m).* FROM (SELECT myfunc(x) AS m FROM some_table OFFSET 0) ss;
- 这里的composite_value .* 语法在以下结构的顶层出现时会产生这类列展开:(SELECT 输出列表)、RETURNING>列表(位于INSERT /UPDATE /DELETE )、VALUES>子句,或 行构造器。在所有其他上下文中(包括嵌套在上述结构之内时),将.* 附加到复合值上不会改变该值,因为它表示所有列
,因此结果仍然是同一个复合值。例如,如果somefunc() 接受一个复合值参数,这些查询就是等价的:
+
+ 当composite_value .* 出现在SELECT 输出列表、INSERT /UPDATE /DELETE 中的RETURNING 列表、VALUES 子句或 行构造器的顶层时,就会产生这种列展开行为。在所有其他上下文中(包括嵌套在上述结构之内时),给复合值附加.* 不会改变其值,因为它表示所有列
,因此结果仍然是同一个复合值。例如,如果somefunc() 接受一个复合值参数,这些查询就是等价的:
+
+
SELECT somefunc(c.*) FROM inventory_item c;
SELECT somefunc(c) FROM inventory_item c;
- 在这两种情况下,inventory_item 的当前行都会作为单个复合值参数传递给该函数。即使.* 在这种情况下不起作用,使用它仍是良好的风格,因为它明确表示这里需要的是复合值。特别是,解析器会将c>(位于c.*>)解释为表名或别名,而不是列名,因此不存在歧义;但如果没有.* ,就不能明确判断c 表示表名还是列名,而且会优先采用列名解释,只要存在一列名为c 。
+
+
+ 在这两种情况下,inventory_item 的当前行都会作为单个复合值参数传递给该函数。尽管.* 在这种场合并不起作用,使用它仍是一种良好风格,因为它能明确表明这里想要的是复合值。特别是,解析器会把c.* 中的c 视为表名或别名,而不是列名,因此不会产生歧义;而没有.* 时,就不清楚c 究竟表示表名还是列名,而且如果存在名为c 的列,实际上会优先按列名解释。
@@ -256,7 +266,7 @@ SELECT * FROM inventory_item c ORDER BY c;
SELECT * FROM inventory_item c ORDER BY c.*;
SELECT * FROM inventory_item c ORDER BY ROW(c.*);
- 所有这些ORDER BY 子句都指定了该行的组合值,因此会按照中描述的规则对行进行排序。不过,如果inventory_item 包含一个名为c 的列,第一种情况就会不同于其他情况,因为它表示只按那一列排序。按照前面展示的列名,下面这些查询也与上述查询等效:
+ 所有这些ORDER BY 子句都指定了该行的复合值,因此会按照中描述的规则对行进行排序。不过,如果inventory_item 包含一个名为c 的列,第一种情况就会不同于其他情况,因为它表示只按那一列排序。按照前面展示的列名,下面这些查询也与上述查询等效:
SELECT * FROM inventory_item c ORDER BY ROW(c.name, c.supplier_id, c.price);
SELECT * FROM inventory_item c ORDER BY (c.name, c.supplier_id, c.price);
@@ -265,7 +275,7 @@ SELECT * FROM inventory_item c ORDER BY (c.name, c.supplier_id, c.price);
- 另一种与组合值有关的特殊语法行为是,我们可以使用函数记法 来提取组合值中的字段。简单来说,记法field (table ) 和table .field 可以互换。例如,这些查询是等价的:
+ 另一种与复合值有关的特殊语法行为是,我们可以使用函数记法 来提取复合值中的字段。简单来说,记法field (table ) 和table .field 可以互换。例如,这些查询是等价的:
SELECT c.name FROM inventory_item c WHERE c.price > 1000;
@@ -284,11 +294,11 @@ SELECT c.somefunc FROM inventory_item c;
函数记法与字段记法之间的这种等价性,使得我们可以通过在复合类型上使用函数来实现计算字段
。
- computed field
+ 计算字段
- field
- computed
+ 字段
+ 计算
使用上面最后一种查询形式的应用程序,无需直接知道somefunc 并不是该表中的真实列。
@@ -303,7 +313,7 @@ SELECT c.somefunc FROM inventory_item c;
复合类型的输入和输出语法
- 组合值的外部文本表示由两部分组成:一部分是按照各字段类型的 I/O 转换规则解释的项,另一部分是表明组合结构的附加符号。这些附加符号包括包围整个值的圆括号(( 和) ),以及相邻项之间的逗号(, )。圆括号外部的空白会被忽略;但在圆括号内部,空白会被视为字段值的一部分,其是否有意义取决于该字段数据类型的输入转换规则。例如,在
+ 复合值的外部文本表示由两部分组成:一部分是按照各字段类型的 I/O 转换规则解释的项,另一部分是表明复合结构的附加符号。这些附加符号包括包围整个值的圆括号(( 和) ),以及相邻项之间的逗号(, )。圆括号外部的空白会被忽略;但在圆括号内部,空白会被视为字段值的一部分,其是否有意义取决于该字段数据类型的输入转换规则。例如,在
'( 42)'
@@ -311,7 +321,7 @@ SELECT c.somefunc FROM inventory_item c;
- 如前所示,在写组合值时,你可以给任意单个字段值加双引号。如果字段值本身可能让组合值解析器混淆,则必须 这样做。特别是,包含圆括号、逗号、双引号或反斜杠的字段必须用双引号括起来。要在带引号的组合字段值中写入双引号或反斜杠,需要在其前面加一个反斜杠。(另外,带双引号的字段值内部成对出现的双引号会被视为一个双引号字符,这与 SQL 字面字符串中单引号的规则类似。)或者,你也可以完全不使用引号,而改用反斜杠转义,保护所有原本会被当作组合语法的数据字符。
+ 如前所示,在写复合值时,你可以给任意单个字段值加双引号。如果字段值本身可能让复合值解析器混淆,则必须 这样做。特别是,包含圆括号、逗号、双引号或反斜杠的字段必须用双引号括起来。要在带引号的复合字段值中写入双引号或反斜杠,需要在其前面加一个反斜杠。(另外,带双引号的字段值内部成对出现的双引号会被视为一个双引号字符,这与 SQL 字面字符串中单引号的规则类似。)或者,你也可以完全不使用引号,而改用反斜杠转义,保护所有原本会被当作复合语法的数据字符。
@@ -325,18 +335,18 @@ SELECT c.somefunc FROM inventory_item c;
- 记住,你在 SQL 命令中写的内容会先被解释为字符串字面量,然后才会被解释为组合值。这会使所需的反斜杠数量翻倍(假定使用的是转义字符串语法)。例如,要在组合值中插入一个包含双引号和反斜杠的text 字段,需要写成:
+ 记住,你在 SQL 命令中写的内容会先被解释为字符串字面量,然后才会被解释为复合值。这会使所需的反斜杠数量翻倍(假定使用的是转义字符串语法)。例如,要在复合值中插入一个包含双引号和反斜杠的text 字段,需要写成:
INSERT ... VALUES ('("\"\\")');
- 字符串字面量处理器会去掉一层反斜杠,因此传到组合值解析器时看起来是("\"\\") 。随后,送入text 数据类型输入例程的字符串就变成了"\ 。(如果我们使用的数据类型的输入例程也会把反斜杠当作特殊字符处理,例如bytea ,那么为了在存储的组合字段中得到一个反斜杠,命令里可能需要多达八个反斜杠。)美元引用(见)可用于避免反斜杠加倍的需要。
+ 字符串字面量处理器会去掉一层反斜杠,因此传到复合值解析器时看起来是("\"\\") 。随后,送入text 数据类型输入例程的字符串就变成了"\ 。(如果我们使用的数据类型的输入例程也会把反斜杠当作特殊字符处理,例如bytea ,那么为了在存储的复合字段中得到一个反斜杠,命令里可能需要多达八个反斜杠。)美元引用(见)可用于避免反斜杠加倍的需要。
- 在 SQL 命令中编写组合值时,ROW 构造器语法通常比组合字面量语法更容易使用。在ROW 中,各个字段值的写法与它们不是组合成员时完全相同。
+ 在 SQL 命令中编写复合值时,ROW 构造器语法通常比复合字面量语法更容易使用。在ROW 中,各个字段值的写法与它们不是复合成员时完全相同。
diff --git a/zh/10/textsearch.sgml b/zh/10/textsearch.sgml
index c96e4756..c5afa867 100644
--- a/zh/10/textsearch.sgml
+++ b/zh/10/textsearch.sgml
@@ -1,21 +1,21 @@
- 全文搜索
+ 全文检索
- 全文搜索
+ 全文检索
- 文本搜索
+ 文本检索
介绍
- 全文检索(或简称文本搜索 )提供了识别满足
+ 全文检索(或简称文本检索 )提供了识别满足
查询 条件的自然语言文档 的能力,
并且可按它们与查询的相关度进行排序。最常见的搜索类型,是找出所有包含给定
查询词 的文档,并按它们与查询的相似性
@@ -25,7 +25,7 @@
- 文本搜索操作符在数据库中已经存在很多年了。
+ 文本检索操作符在数据库中已经存在很多年了。
PostgreSQL 为文本数据类型提供了
~ 、~* 、LIKE 和
ILIKE 操作符,但它们缺少现代信息系统所要求的许多关键特性:
@@ -138,7 +138,7 @@
()。围绕这两种数据类型还有许多函数和
操作符(),其中最重要的是匹配操作符
@@ ,我们将在中介绍。
- 全文搜索还可以借助索引加速()。
+ 全文检索还可以借助索引加速()。
@@ -147,11 +147,11 @@
文档
- 全文搜索
+ 文本检索
- 文档 是全文搜索系统中的搜索单位,例如一篇杂志文章或一封电子邮件。文本搜索引擎必须能够解析文档,并保存词位(关键字)与其所属文档之间的关联。随后,就可以利用这些关联来搜索包含查询词的文档。
+ 文档 是全文检索系统中的搜索单位,例如一篇杂志文章或一封电子邮件。文本检索引擎必须能够解析文档,并保存词位(关键字)与其所属文档之间的关联。随后,就可以利用这些关联来搜索包含查询词的文档。
@@ -179,7 +179,7 @@ WHERE m.mid = d.did AND m.mid = 12;
- 为了进行文本搜索,每个文档都必须被化简为预处理后的 tsvector 格式。搜索和排名完全基于文档的 tsvector 表示来执行 — 只有当文档被选中并准备展示给用户时,才需要取回原始文本。因此,我们常常把 tsvector 直接称作文档,但它当然只是完整文档的一种紧凑表示。
+ 为了进行文本检索,每个文档都必须被化简为预处理后的 tsvector 格式。搜索和排名完全基于文档的 tsvector 表示来执行 — 只有当文档被选中并准备展示给用户时,才需要取回原始文本。因此,我们常常把 tsvector 直接称作文档,但它当然只是完整文档的一种紧凑表示。
@@ -187,7 +187,7 @@ WHERE m.mid = d.did AND m.mid = 12;
基本文本匹配
- 在PostgreSQL 中,全文搜索基于匹配操作符@@ 。如果一个tsvector (文档)匹配一个tsquery (查询),它就返回true 。哪一种数据类型写在前面并不重要:
+ 在PostgreSQL 中,全文检索基于匹配操作符@@ 。如果一个tsvector (文档)匹配一个tsquery (查询),它就返回true 。哪一种数据类型写在前面并不重要:
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery;
@@ -203,7 +203,7 @@ SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::t
- 正如上例所示,tsquery 并不只是原始文本,tsvector 也不是。tsquery 包含搜索术语,这些术语必须已经是正规化后的词位,并且可以用 AND、OR、NOT 和 FOLLOWED BY 操作符把多个术语组合起来。(语法细节见。)to_tsquery 、plainto_tsquery 和 phraseto_tsquery 有助于把用户输入的文本转换为合适的 tsquery ,其主要工作就是对文本中的词做正规化。类似地,to_tsvector 用于解析并正规化文档字符串。因此在实践中,文本搜索匹配更像是这样:
+ 正如上例所示,tsquery 并不只是原始文本,tsvector 也不是。tsquery 包含搜索词,这些搜索词必须已经是正规化后的词位,并且可以用 AND、OR、NOT 和 FOLLOWED BY 操作符把多个搜索词组合起来。(语法细节见。)to_tsquery 、plainto_tsquery 和 phraseto_tsquery 有助于把用户输入的文本转换为合适的 tsquery ,其主要工作就是对文本中的词做正规化。类似地,to_tsvector 用于解析并正规化文档字符串。因此在实践中,文本检索匹配更像是这样:
SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');
@@ -221,7 +221,7 @@ SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat');
f
- 就不会匹配成功,因为这里不会对单词 rats 做正规化。tsvector 的元素是词位,默认假定已经正规化,因此 rats 不会匹配 rat 。
+ 就不会匹配成功,因为这里不会对单词 rats 做正规化。tsvector 的元素是词位,被假定为已经正规化,因此 rats 不会匹配 rat 。
@@ -290,49 +290,49 @@ SELECT phraseto_tsquery('the cats ate the rats');
配置
- 前述的都是简单的文本搜索示例。正如前面所提到的,全文搜索功能包括做更多事情的能力:跳过索引特定词(停用词)、处理同义词并使用更高级的解析,例如基于空白之外的解析。这个功能由文本搜索配置 控制。PostgreSQL 中有多种语言的预定义配置,并且你可以很容易地创建你自己的配置(psql 的\dF 命令显示所有可用的配置)。
+ 前述的都是简单的文本检索示例。正如前面所提到的,全文检索功能包括做更多事情的能力:跳过索引特定词(停用词)、处理同义词并使用更高级的解析,例如不局限于按空白划分的解析。这个功能由文本检索配置 控制。PostgreSQL 中有多种语言的预定义配置,并且你可以很容易地创建你自己的配置(psql 的\dF 命令显示所有可用的配置)。
- 在安装期间会选择一个合适的配置,并据此在postgresql.conf 中设置。如果整个集簇都使用同一种文本搜索配置,你可以直接使用postgresql.conf 中的这个值。若要在整个集簇中使用不同配置,但保证每个数据库内部使用同一种配置,可以使用ALTER DATABASE ... SET 。否则,你也可以在每个会话中设置default_text_search_config 。
+ 在安装期间会选择一个合适的配置,并据此在postgresql.conf 中设置。如果整个集簇都使用同一种文本检索配置,你可以直接使用postgresql.conf 中的这个值。若要在整个集簇中使用不同配置,但保证每个数据库内部使用同一种配置,可以使用ALTER DATABASE ... SET 。否则,你也可以在每个会话中设置default_text_search_config 。
- 依赖一个配置的每一个文本搜索函数都有一个可选的regconfig 参数,因此要使用的配置可以被显式指定。只有当这个参数被忽略时,default_text_search_config 才被使用。
+ 依赖一个配置的每一个文本检索函数都有一个可选的regconfig 参数,因此要使用的配置可以被显式指定。只有当省略这个参数时,default_text_search_config 才被使用。
- 为了让建立自定义文本搜索配置更容易,一个配置可以从更简单的数据库对象来建立。PostgreSQL 的文本搜索功能提供了四类配置相关的数据库对象:
+ 为了便于构建自定义文本检索配置,配置由更简单的数据库对象组合而成。PostgreSQL 的文本检索功能提供了四类与配置相关的数据库对象:
- 文本搜索解析器 将文档拆分成词元并分类每个词元(例如,作为词或者数字)。
+ 文本检索解析器 将文档拆分成词元并对每个词元分类(例如,作为词或者数字)。
- 文本搜索词典 将词元转变成正规化的形式并拒绝停用词。
+ 文本检索词典 将词元转变成正规化的形式并拒绝停用词。
- 文本搜索模板 提供位于词典底层的函数(一个词典简单地指定一个模板和一组用于模板的参数)。
+ 文本检索模板 提供位于词典底层的函数(词典只需指定一个模板及其一组参数)。
- 文本搜索配置 选择一个解析器和一组用于将解析器产生的词元正规化的词典。
+ 文本检索配置 选择一个解析器和一组用于将解析器产生的词元正规化的词典。
- 文本搜索解析器和模板是从低层 C 函数构建而来,因此它要求 C 编程能力来开发新的解析器和模板,并且还需要超级用户权限来把它们安装到一个数据库中(在PostgreSQL 发布的contrib/ 区域中有一些附加的解析器和模板的示例)。由于词典和配置只是对底层解析器和模板的参数化和连接,不需要特殊的权限来创建一个新词典或配置。创建定制词典和配置的示例将在本章稍后的部分给出。
+ 文本检索解析器和模板由底层 C 函数构成,因此开发新的解析器和模板需要 C 编程能力,将它们安装到数据库中则需要超级用户权限。(PostgreSQL 发行版的 contrib/ 目录中有附加解析器和模板的示例。)词典和配置只是为底层解析器和模板设置参数并将它们连接起来,因此创建新词典或配置不需要特殊权限。本章后面会给出创建自定义词典和配置的示例。
@@ -343,14 +343,14 @@ SELECT phraseto_tsquery('the cats ate the rats');
表和索引
- 在前一节中的示例演示了使用简单常数字符串进行全文匹配。本节展示如何搜索表数据,以及可选择地使用索引。
+ 在前一节中的示例演示了使用简单常量字符串进行全文匹配。本节展示如何搜索表数据,以及可选择地使用索引。
搜索表
- 即使没有索引,也可以执行全文搜索。下面这个简单查询会输出每一行的title ,其中对应的body 字段包含单词friend :
+ 即使没有索引,也可以执行全文检索。下面这个简单查询会输出每一行的title ,其中对应的body 字段包含单词friend :
SELECT title
@@ -374,7 +374,7 @@ WHERE to_tsvector(body) @@ to_tsquery('friend');
- 更复杂一点的例子,是选出最近的 10 个文档,它们的 title 或 body 中同时包含 create 和 table :
+ 更复杂一点的例子,是选出最近的 10 个文档,它们的 title 和 body 合在一起包含 create 和 table :
SELECT title
@@ -388,7 +388,7 @@ LIMIT 10;
- 虽然这些查询在没有索引的情况下也能工作,但除偶尔的临时搜索外,大多数应用都会觉得这种方式太慢。文本搜索在实际使用中通常都需要建立索引。
+ 虽然这些查询在没有索引的情况下也能工作,但除偶尔的临时搜索外,大多数应用都会觉得这种方式太慢。文本检索在实际使用中通常都需要建立索引。
@@ -396,9 +396,15 @@ LIMIT 10;
创建索引
- 我们可以创建一个GIN 索引()来加速文本搜索:
+
+ 我们可以创建一个GIN 索引()来加速文本检索:
+
+
CREATE INDEX pgweb_idx ON pgweb USING GIN (to_tsvector('english', body));
- 注意这里使用的是to_tsvector 的双参数版本。只有显式指定配置名称的文本搜索函数,才能用于表达式索引()。这是因为索引内容必须不受的影响。否则,索引内容就可能不一致,因为不同的索引项可能包含tsvector ,它们使用不同的文本搜索配置创建,而且无法判断各自使用了哪一种配置。这样的索引也不可能被正确地转储和恢复。
+
+
+ 注意这里使用的是to_tsvector 的双参数版本。只有显式指定配置名称的文本检索函数,才能用于表达式索引()。这是因为索引内容必须不受的影响。否则,索引内容就可能不一致,因为不同的索引项可能包含使用不同文本检索配置创建的tsvector ,而且无法判断各自使用了哪一种配置。这样的索引也不可能被正确地转储和恢复。
+
由于上面的索引使用了 to_tsvector 的双参数版本,因此只有同样使用相同配置名的双参数版 to_tsvector 查询,才能使用该索引。也就是说,WHERE to_tsvector('english', body) @@ 'a & b' 可以使用该索引,而 WHERE to_tsvector(body) @@ 'a & b' 则不能。这样可以保证索引只会和创建索引项时所用的同一配置配合使用。
@@ -434,7 +440,7 @@ LIMIT 10;
当使用一个单独的列来存储 tsvector 表示时,需要创建一个触发器来使 tsvector 列保持最新,以应对 title 或 body 的任何更改。 说明了如何做到这一点。
- 与表达式索引相比,单独列方法的一个优点是,为了利用索引,查询中不必显式指定文本搜索配置。正如上面的例子所示,查询可以依赖default_text_search_config 。另一个优点是搜索会更快,因为它不必重新执行to_tsvector 调用来验证索引匹配(使用 GiST 索引时这一点比使用 GIN 索引时更重要;见)。不过,表达式索引方法更容易设置,而且占用更少磁盘空间,因为tsvector 表示并没有被显式存储。
+ 与表达式索引相比,单独列方法的一个优点是,为了利用索引,查询中不必显式指定文本检索配置。正如上面的例子所示,查询可以依赖default_text_search_config 。另一个优点是搜索会更快,因为它不必重新执行to_tsvector 调用来验证索引匹配(使用 GiST 索引时这一点比使用 GIN 索引时更重要;见)。不过,表达式索引方法更容易设置,而且占用更少磁盘空间,因为tsvector 表示并没有被显式存储。
@@ -442,10 +448,10 @@ LIMIT 10;
- 控制文本搜索
+ 控制文本检索
- 要实现全文搜索,必须有函数能够从文档创建 tsvector ,并从用户查询创建 tsquery 。此外,我们还希望结果能按有意义的顺序返回,因此还需要函数根据文档与查询的相关性进行比较。同样重要的,是把结果良好地展示出来。PostgreSQL 为这些能力都提供了支持。
+ 要实现全文检索,必须有函数能够从文档创建 tsvector ,并从用户查询创建 tsquery 。此外,我们还希望结果能按有意义的顺序返回,因此还需要函数根据文档与查询的相关性进行比较。同样重要的,是把结果良好地展示出来。PostgreSQL 为这些能力都提供了支持。
@@ -464,7 +470,7 @@ to_tsvector( config
- to_tsvector 会把文本文档解析为词元,将词元归约为词位,并返回一个 tsvector ,其中列出各词位及其在文档中的位置。文档会按指定的或默认的文本搜索配置进行处理。下面是一个简单示例:
+ to_tsvector 会把文本文档解析为词元,将词元归约为词位,并返回一个 tsvector ,其中列出各词位及其在文档中的位置。文档会按指定的或默认的文本检索配置进行处理。下面是一个简单示例:
SELECT to_tsvector('english', 'a fat cat sat on a mat - it ate a fat rats');
@@ -479,7 +485,7 @@ SELECT to_tsvector('english', 'a fat cat sat on a mat - it ate a fat rats');
- to_tsvector 在内部会调用解析器,把文档文本拆分成词元并为每类词元分配类型。对于每个词元,系统都会查询一个词典列表(),而这个列表会随词元类型而变化。第一个能够识别 该词元的词典,会输出一个或多个正规化后的词位 来表示它。例如,rats 之所以变成 rat ,是因为某个词典识别出 rats 是 rat 的复数形式。某些词会被识别为停用词 (),于是被忽略,因为它们出现得过于频繁,对搜索没有帮助。在这个示例中,a 、on 和 it 就是停用词。如果列表中的词典都无法识别某个词元,它也会被忽略。示例里的标点符号 - 就属于这种情况,因为其词元类型(Space symbols )实际上没有分配任何词典,也就是说,空白类词元永远不会被索引。解析器、词典以及需要索引哪些词元类型,都由所选的文本搜索配置()决定。一个数据库里可以同时存在多种不同配置,并且系统已经为多种语言提供了预定义配置。在本例中,我们使用的是英语的默认配置 english 。
+ to_tsvector 在内部会调用解析器,把文档文本拆分成词元并为每个词元分配类型。对于每个词元,系统都会查询一个词典列表(),而这个列表会随词元类型而变化。第一个能够识别 该词元的词典,会输出一个或多个正规化后的词位 来表示它。例如,rats 之所以变成 rat ,是因为某个词典识别出 rats 是 rat 的复数形式。某些词会被识别为停用词 (),于是被忽略,因为它们出现得过于频繁,对搜索没有帮助。在这个示例中,a 、on 和 it 就是停用词。如果列表中的词典都无法识别某个词元,它也会被忽略。示例里的标点符号 - 就属于这种情况,因为其词元类型(Space symbols )实际上没有分配任何词典,也就是说,空白类词元永远不会被索引。解析器、词典以及需要索引哪些词元类型,都由所选的文本检索配置()决定。一个数据库里可以同时存在多种不同配置,并且系统已经为多种语言提供了预定义配置。在本例中,我们使用的是英语的默认配置 english 。
@@ -487,7 +493,7 @@ SELECT to_tsvector('english', 'a fat cat sat on a mat - it ate a fat rats');
- 由于 to_tsvector (NULL ) 会返回 NULL ,因此只要字段可能为空,就建议使用 coalesce 。下面是从结构化文档创建 tsvector 的推荐方法:
+ 由于 to_tsvector (NULL ) 会返回 NULL ,因此只要字段可能为 NULL,就建议使用 coalesce 。下面是从结构化文档创建 tsvector 的推荐方法:
UPDATE tt SET ti =
@@ -518,22 +524,35 @@ to_tsquery( config
- to_tsquery 创建一个tsquery 值,其来源为querytext ,其中必须是由以下 tsquery 操作符分隔的单个词元:& (AND)、| (OR)、! (NOT)以及 <-> (FOLLOWED BY),也可以使用括号分组。换句话说,to_tsquery 的输入必须已经遵循 tsquery 输入的一般规则,如 所述。区别在于,基本的 tsquery 输入会直接使用词元,而 to_tsquery 会使用指定或默认的配置将每个词元正规化为词位,并丢弃根据该配置判定为停用词的词元。例如:
+ to_tsquery 根据 querytext 创建一个 tsquery 值。输入必须由单个词元组成,这些词元之间使用 tsquery 操作符 & (AND)、| (OR)、! (NOT)和 <-> (FOLLOWED BY)分隔,并可使用圆括号分组。换句话说,传给 to_tsquery 的输入,必须已经遵循 中描述的 tsquery 一般输入规则。不同之处在于,基础 tsquery 输入是按字面接受词元,而 to_tsquery 会使用指定或默认配置,把每个词元正规化为词位,并丢弃那些按该配置被判定为停用词的词元。例如:
+
+
SELECT to_tsquery('english', 'The & Fat & Rats');
to_tsquery
---------------
'fat' & 'rat'
- 与基本的 tsquery 输入一样,可以给每个词位附加权重,以限制它只匹配 tsvector> 中具有这些权重的词位。例如:
+
+
+ 与基础tsquery 输入一样,可以为每个词位附加权重,以限制它只匹配具有这些权重的tsvector 词位。例如:
+
+
SELECT to_tsquery('english', 'Fat | Rats:AB');
to_tsquery
------------------
'fat' | 'rat':AB
- 此外,可以把 *> 附加到词位上来指定前缀匹配:
+
+
+ 此外,还可以在词位后附加* 来指定前缀匹配:
+
+
SELECT to_tsquery('supern:*A & star:A*B');
to_tsquery
--------------------------
'supern':*A & 'star':*AB
- 这样的词位将匹配 tsvector> 中以给定字符串开头的任何单词。
+
+
+ 这样的词位将匹配tsvector 中任何以给定字符串开头的单词。
+
to_tsquery 也可以接受单引号括起来的短语。当配置中包含可能在这类短语上触发的分类词典时,这一点尤其有用。在下面的例子中,一个分类词典包含规则 supernovae
@@ -585,12 +604,19 @@ phraseto_tsquery( config
phraseto_tsquery 的行为很像plainto_tsquery ,不过它会在保留下来的词之间插入<-> (FOLLOWED BY)操作符,而不是& (AND)操作符。此外,停用词也不是简单地丢弃,而是通过插入<N > 操作符(而不是<-> 操作符)来体现。在搜索精确词位序列时,这个函数很有用,因为 FOLLOWED BY 操作符不仅检查所有词位是否存在,还检查词位的顺序。
- 示例:
+
+ 示例:
+
+
SELECT phraseto_tsquery('english', 'The Fat Rats');
phraseto_tsquery
------------------
'fat' <-> 'rat'
- 与 plainto_tsquery 一样,phraseto_tsquery 函数也不会识别其输入中的tsquery 操作符、权重标签或前缀匹配标签:
+
+
+ 与plainto_tsquery 一样,phraseto_tsquery 函数也不会识别输入中的tsquery 操作符、权重标签或前缀匹配标签:
+
+
SELECT phraseto_tsquery('english', 'The Fat & Rats:C');
phraseto_tsquery
-----------------------------
@@ -604,7 +630,7 @@ SELECT phraseto_tsquery('english', 'The Fat & Rats:C');
搜索结果排名
- 排名旨在衡量文档与特定查询的相关程度,以便在匹配很多时优先显示最相关的结果。PostgreSQL 提供了两种预定义的排名函数,它们会综合考虑词法信息、邻近关系和结构信息;也就是说,会考虑查询词在文档中出现的频率、这些词彼此之间的距离,以及它们出现于文档中哪个部分。不过,相关性这一概念本身就比较模糊,而且高度依赖具体应用。不同应用可能还需要额外信息参与排名,例如文档修改时间。内置排名函数仅仅是示例。你可以编写自己的排名函数,或者把它们的结果与其他因素结合起来,以满足特定需求。
+ 排名旨在衡量文档与特定查询的相关程度,以便在匹配很多时优先显示最相关的结果。PostgreSQL 提供了两种预定义的排名函数,它们会综合考虑词法信息、邻近关系和结构信息;也就是说,会考虑查询词在文档中出现的频率、这些词彼此之间的距离,以及这些词所处文档部分的重要程度。不过,相关性这一概念本身就比较模糊,而且高度依赖具体应用。不同应用可能还需要额外信息参与排名,例如文档修改时间。内置排名函数仅仅是示例。你可以编写自己的排名函数,或者把它们的结果与其他因素结合起来,以满足特定需求。
目前可用的两种排名函数是:
@@ -651,11 +677,21 @@ SELECT phraseto_tsquery('english', 'The Fat & Rats:C');
- 对这两个函数来说,可选的weights 参数允许根据词实例的标注情况赋予它们不同权重。权重数组按如下顺序指定各类词的权重:
-{D-weight, C-weight, B-weight, A-weight}
- 如果没有提供weights ,则使用如下默认值:
+
+ 对这两个函数来说,可选的 weights 参数允许根据词实例的标注情况赋予它们不同权重。权重数组按如下顺序指定各类词的权重:
+
+
+{D-权重, C-权重, B-权重, A-权重}
+
+
+ 如果没有提供 weights ,则使用如下默认值:
+
+
{0.1, 0.2, 0.4, 1.0}
- 通常,权重用于标注文档中特殊部分的词,例如标题或开头的摘要,从而使它们相对于正文中的词具有更高或更低的重要性。
+
+
+ 通常,权重用于标记来自文档特定区域的词,例如标题或开头摘要中的词,从而使它们相较于正文中的词被赋予更高或更低的重要性。
+
由于较长的文档更有机会包含查询词,因此把文档大小纳入考量是合理的。例如,一个一百词的文档里某个搜索词出现五次,通常会比一个一千词的文档里同一搜索词也只出现五次更相关。两种排名函数都接受一个整数 normalization 选项,用于指定文档长度是否影响排名,以及具体如何影响。该整数选项控制多种行为,因此它是一个位掩码:你可以使用 | 指定一种或多种行为(例如 2|4 )。
@@ -683,12 +719,12 @@ SELECT phraseto_tsquery('english', 'The Fat & Rats:C');
- 8 用文档中唯一词的数量除排名
+ 8 用文档中不同词的数量除排名
- 16 用 1 + 文档中唯一词数量的对数除排名
+ 16 用 1 + 文档中不同词数量的对数除排名
@@ -702,7 +738,7 @@ SELECT phraseto_tsquery('english', 'The Fat & Rats:C');
- 需要注意的是,排名函数不会使用任何全局信息,因此不可能像有时人们希望的那样,给出一种能够公平归一化到 1% 或 100% 的结果。正规化选项 32(rank/(rank+1) )可以把所有排名缩放到 0 到 1 的范围内,但这当然只是表面上的变化,不会影响搜索结果的顺序。
+ 需要注意的是,排名函数不会使用任何全局信息,因此不可能像有时人们希望的那样,给出一种能够公平归一化到 1% 或 100% 的结果。归一化选项 32(rank/(rank+1) )可以把所有排名缩放到 0 到 1 的范围内,但这当然只是表面上的变化,不会影响搜索结果的顺序。
@@ -774,9 +810,7 @@ ts_headline( config
ts_headline 接收文档和查询,并返回文档中一段
- 高亮查询词条的摘录。具体而言,该函数会先用查询选择相关文本片段,然后
- 高亮查询中出现的所有词,即使这些词的位置并不满足查询本身的位置限制。
- 用于解析文档的配置可通过 config 指定;
+ 高亮查询词的摘录。用于解析文档的配置可通过 config 指定;
若省略 config ,则使用
default_text_search_config 配置。
@@ -863,7 +897,7 @@ occurrences to display in the result.',
附加特性
- 本节介绍一些在文本搜索中很有用的附加函数和操作符。
+ 本节介绍一些在文本检索中很有用的附加函数和操作符。
@@ -976,7 +1010,7 @@ occurrences to display in the result.',
- 返回用 AND 结合的两个给定查询。
+ 返回两个给定查询的 AND 组合。
@@ -990,7 +1024,7 @@ occurrences to display in the result.',
- 返回用 OR 结合的两个给定查询。
+ 返回两个给定查询的 OR 组合。
@@ -1043,7 +1077,7 @@ SELECT to_tsquery('fat') <-> to_tsquery('cat | rat');
- 返回一个查询,它使用 <N > tsquery 操作符,搜索第一个给定查询的匹配,并在距离正好为 distance 个词位处搜索第二个给定查询的匹配。例如:
+ 返回一个查询,它使用 <N > tsquery 操作符,搜索第一个给定查询的匹配,并在其后距离正好为 distance 个词位处搜索第二个给定查询的匹配。例如:
SELECT tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'), 10);
@@ -1129,8 +1163,10 @@ SELECT querytree(to_tsquery('!defined'));
- 这种形式的ts_rewrite 只应用一条重写规则:target 会被替换成 substitute ,替换范围是整个 query 。例如:
+
+ 这种形式的 ts_rewrite 只应用一条重写规则:无论 target 在 query 中的何处出现,都用 substitute 替换它。例如:
+
+
SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'c'::tsquery);
ts_rewrite
------------
@@ -1147,7 +1183,10 @@ SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'c'::tsquery);
- 这种形式的ts_rewrite 接受一个起始query>和一个 SQLselect 命令,该命令以文本字符串给出。该select 必须产生两列tsquery 类型的值。对于select 结果中的每一行,第一列值(目标)的各次出现都会被第二列值(替换)取代,替换范围为当前query>值。例如:
+
+ 这种形式的 ts_rewrite 接受一个起始 query 和一个以文本字符串给出的 SQL select 命令。该 select 必须产生两列 tsquery 类型的值。对于 select 结果中的每一行,第一列值(目标)在当前 query 值中的所有出现都会被第二列值(替换)取代。例如:
+
+
CREATE TABLE aliases (t tsquery PRIMARY KEY, s tsquery);
INSERT INTO aliases VALUES('a', 'c');
@@ -1226,7 +1265,10 @@ tsvector_update_trigger(tsvector_column_nametsvector_column_name , config_column_name , text_column_name , ... )
- 这些触发器函数会自动计算一个tsvector 列,其值来自一个或多个文本列,并受以下命令中所指定参数的控制:CREATE TRIGGER 。下面是一个用法示例:
+
+ 这些触发器函数会在 CREATE TRIGGER 命令中给定参数的控制下,从一个或多个文本列自动计算出一个 tsvector 列。下面是它们的一个使用示例:
+
+
CREATE TABLE messages (
title text,
body text,
@@ -1248,13 +1290,19 @@ SELECT title, body FROM messages WHERE tsv @@ to_tsquery('title & body');
title | body
------------+-----------------------
title here | the body text is here
- 创建这个触发器后,title 或body 中的任何更改都会自动反映到tsv 中,应用无需为此操心。
+
+
+ 创建该触发器之后,对title 或body 的任何修改都会自动反映到tsv 中,而应用程序无需关心这一点。
+
- 第一个触发器参数必须是要更新的 tsvector 列名。第二个参数指定执行转换时要使用的文本搜索配置。对于 tsvector_update_trigger ,配置名直接作为第二个触发器参数给出。如上所示,它必须带模式限定,这样触发器行为就不会随着 search_path 的变化而变化。对于 tsvector_update_trigger_column ,第二个触发器参数则是另一个表列的名称,该列必须是 regconfig 类型。这样就可以按行选择配置。其余参数是文本列的名称(类型为 text 、varchar 或 char ),它们会按给定顺序并入文档。NULL 值会被跳过(但其他列仍会被索引)。
+ 第一个触发器参数必须是要更新的 tsvector 列名。第二个参数指定执行转换时要使用的文本检索配置。对于 tsvector_update_trigger ,配置名直接作为第二个触发器参数给出。如上所示,它必须带模式限定,这样触发器行为就不会随着 search_path 的变化而变化。对于 tsvector_update_trigger_column ,第二个触发器参数则是另一个表列的名称,该列必须是 regconfig 类型。这样就可以按行选择配置。其余参数是文本列的名称(类型为 text 、varchar 或 char ),它们会按给定顺序并入文档。NULL 值会被跳过(但其他列仍会被索引)。
- 这些内置触发器有一个限制,即它们会一视同仁地处理所有输入列。要对不同列采用不同处理方式 — 例如,给标题赋予与正文不同的权重 — 就需要编写自定义触发器。下面是一个使用PL/pgSQL 作为触发器语言的示例:
+
+ 这些内置触发器的一个限制是,它们会以相同方式处理所有输入列。若要对列做不同处理 — 例如让标题和正文具有不同权重 — 就需要编写自定义触发器。下面是一个使用 PL/pgSQL 作为触发器语言的示例:
+
+
CREATE FUNCTION messages_trigger() RETURNS trigger AS $$
begin
new.tsv :=
@@ -1315,7 +1363,7 @@ ts_stat(sqlquery text>,
- 如果提供了 weights ,则只统计具有这些权重之一的出现。
+ 如果提供了 weights ,则只统计具有这些权重之一的词的出现次数。
@@ -1344,7 +1392,7 @@ LIMIT 10;
解析器
- 文本搜索解析器负责把未处理的文档文本划分成词元 并标识每个词元的类型,而可能的类型集合由解析器本身定义。注意,解析器完全不会修改文本 — 它只是识别看似合理的词边界。由于作用范围有限,相比自定义词典,对应用相关的自定义解析器的需求没有那么强烈。目前PostgreSQL 只提供一种内置解析器,而它已经被证明对广泛的应用都很有用。
+ 文本检索解析器负责把未处理的文档文本划分成词元 并标识每个词元的类型,而可能的类型集合由解析器本身定义。注意,解析器完全不会修改文本 — 它只是识别看似合理的词边界。由于作用范围有限,相比自定义词典,对应用相关的自定义解析器的需求没有那么强烈。目前PostgreSQL 只提供一种内置解析器,而它已经被证明对广泛的应用都很有用。
@@ -1364,12 +1412,12 @@ LIMIT 10;
asciiword
- 单词,所有 ASCII 字母
+ 单词,全部由 ASCII 字母组成
elephant
word
- 单词,所有字母
+ 单词,全部由字母组成
mañana
@@ -1379,12 +1427,12 @@ LIMIT 10;
asciihword
- 带连字符的单词,所有 ASCII
+ 带连字符的单词,全部为 ASCII 字符
up-to-date
hword
- 带连字符的单词,所有字母
+ 带连字符的单词,由字母组成
lógico-matemática
@@ -1394,12 +1442,12 @@ LIMIT 10;
hword_asciipart
- 带连字符的单词部分,所有 ASCII
+ 带连字符的单词部分,全部为 ASCII 字符
在 postgresql-beta1 上下文中的 postgresql
hword_part
- 带连字符的单词部分,所有字母
+ 带连字符的单词部分,全部由字母组成
在 lógico-matemática 上下文中的 lógico 或 matemática
@@ -1474,8 +1522,8 @@ LIMIT 10;
blank
- 空格符号
- (其他不识别的任意空白或标点符号)
+ 空白符号
+ (未被识别为其他类型的空白或标点符号)
@@ -1483,7 +1531,7 @@ LIMIT 10;
- 解析器的一个字母
的概念由数据库的区域设置决定,具体是lc_ctype 。只包含基本 ASCII 字母的词被报告为一个单独的词元类型,因为有时可以用来区别它们。在大部分欧洲语言中,词元类型word 和asciiword 应该被同样对待。
+ 解析器对字母
的界定由数据库的区域设置决定,具体是lc_ctype 。只包含基本 ASCII 字母的词被报告为一个单独的词元类型,因为有时区分它们会很有用。在大部分欧洲语言中,词元类型word 和asciiword 应该被同样对待。
email 不支持 RFC 5322 定义的所有有效电子邮件字符。具体来说,电子邮件用户名中支持的非字母数字字符只有句点、短横线和下划线。
@@ -1523,7 +1571,7 @@ SELECT alias, description, token FROM ts_debug('http://example.com/stuff/index.h
词典
- 词典用于消除不应参与搜索的词(stop words ),并用于对词进行正规化 ,以便同一个词的不同派生形式能够匹配。成功完成正规化的词被称为词位 。除了改善搜索质量,正规化和移除停用词还会减小文档的tsvector 表示,从而提高性能。正规化并不总是具有语言学意义,而且通常依赖于应用的语义。
+ 词典用于消除不应参与搜索的词(停用词 ),并用于对词进行正规化 ,以便同一个词的不同派生形式能够匹配。成功完成正规化的词被称为词位 。除了改善搜索质量,正规化和移除停用词还会减小文档的tsvector 表示,从而提高性能。正规化并不总是具有语言学意义,而且通常依赖于应用的语义。
一些正规化的示例:
@@ -1535,7 +1583,7 @@ SELECT alias, description, token FROM ts_debug('http://example.com/stuff/index.h
- URL 地址可以被正规化,以便让等价的 URL 匹配:
+ URL 地址可以规范化,以便让等价的 URL 匹配:
@@ -1580,32 +1628,32 @@ SELECT alias, description, token FROM ts_debug('http://example.com/stuff/index.h
- 一个带有 TSL_FILTER 标志的单个词位,它会用一个新词元替换原始词元,并把它传递给后续词典(执行这种工作的词典称为过滤字典 )
+ 一个带有 TSL_FILTER 标志的单个词位,它会用一个新词元替换原始词元,并把它传递给后续词典(执行这种工作的词典称为过滤词典 )
- 如果字典知道该词元但它是一个停用词,则返回一个空数组
+ 如果词典知道该词元但它是一个停用词,则返回一个空数组
- 如果字典不识别该输入词元,则返回NULL
+ 如果词典不识别该输入词元,则返回NULL
- PostgreSQL 为许多语言提供了预定义的字典。也有多种预定义模板可以被用于创建带自定义参数的新词典。每一种预定义词典模板在下面描述。如果没有合适的现有模板,可以创建新的;示例见PostgreSQL 发布的contrib/ 区域。
+ PostgreSQL 为许多语言提供了预定义的词典。也有多种预定义模板可以被用于创建带自定义参数的新词典。每一种预定义词典模板在下面描述。如果没有合适的现有模板,可以创建新的;示例见PostgreSQL 发行版的contrib/ 目录。
- 文本搜索配置把一个解析器与一组用于处理解析器输出词元的词典绑定在一起。对于解析器可能返回的每一种词元类型,配置都会指定一个单独的词典列表。当解析器找到该类型的词元时,会按顺序依次查询列表中的每个词典,直到有某个词典把它识别为已知词。如果它被识别为停用词,或者没有任何词典识别它,那么该词元就会被丢弃,既不会建立索引,也不会参与搜索。通常,第一个返回非 NULL 输出的词典就决定结果,后续词典不会再被查询;但过滤词典可以把给定单词替换为一个修改后的单词,再传递给后续词典。
+ 文本检索配置把一个解析器与一组用于处理解析器输出词元的词典绑定在一起。对于解析器可能返回的每一种词元类型,配置都会指定一个单独的词典列表。当解析器找到该类型的词元时,会按顺序依次查询列表中的每个词典,直到有某个词典把它识别为已知词。如果它被识别为停用词,或者没有任何词典识别它,那么该词元就会被丢弃,既不会建立索引,也不会参与搜索。通常,第一个返回非 NULL 输出的词典就决定结果,后续词典不会再被查询;但过滤词典可以把给定单词替换为一个修改后的单词,再传递给后续词典。
- 配置词典列表的一般规则是,把最窄、最专门的词典放在最前面,然后是更通用的词典,最后以一个非常通用的词典收尾,例如 Snowball 词干分析器,或能识别所有内容的 simple 。例如,对于一个天文学相关搜索(配置名为 astro_en ),可以把词元类型 asciiword (ASCII 词)绑定到一个天文学术语分类词典、一个通用英语词典,以及一个 Snowball 英语词干分析器:
+ 配置词典列表的一般规则是,把适用范围最窄、最专门的词典放在最前面,然后是更通用的词典,最后以一个非常通用的词典收尾,例如 Snowball 词干分析器,或能识别所有内容的 simple 。例如,对于一个天文学相关搜索(配置名为 astro_en ),可以把词元类型 asciiword (ASCII 词)绑定到一个天文学术语同义词词典、一个通用英语词典,以及一个 Snowball 英语词干分析器:
ALTER TEXT SEARCH CONFIGURATION astro_en
@@ -1614,14 +1662,14 @@ ALTER TEXT SEARCH CONFIGURATION astro_en
- 过滤词典可以放在列表中的任何位置,只是不能放在最后,因为放在最后就没有意义了。过滤词典可用于先对词做部分正规化,以简化后续词典的工作。例如,可以用过滤词典去掉带重音字母中的重音符号,就像模块所做的那样。
+ 过滤词典可以放在列表中的任何位置,但放在末尾没有用处。过滤词典可用于先对词做部分正规化,以简化后续词典的工作。例如,可以用过滤词典去掉带重音字母中的重音符号,就像模块所做的那样。
停用词
- 停用词是非常常见、几乎出现在每个文档中的词,没有区分价值。因此,在全文搜索中可以忽略它们。例如,每篇英文文本都包含像 a 和 the 这样的词,所以把它们存储在索引中没有用处。不过,停用词确实会影响 tsvector 中的位置,而这又会影响排名:
+ 停用词是非常常见、几乎出现在每个文档中的词,没有区分价值。因此,在全文检索中可以忽略它们。例如,每篇英文文本都包含像 a 和 the 这样的词,所以把它们存储在索引中没有用处。不过,停用词确实会影响 tsvector 中的位置,而这又会影响排名:
SELECT to_tsvector('english', 'in the list of stop words');
@@ -1753,7 +1801,7 @@ SELECT * FROM ts_debug('english', 'Paris');
- synonym 模板要求的唯一参数是SYNONYMS ,它是其配置文件的基本名 — 上例中的my_synonyms 。该文件的完整名称将是$SHAREDIR/tsearch_data/my_synonyms.syn (其中$SHAREDIR 表示PostgreSQL 安装的共享数据目录)。该文件格式是每行一个要被替换的词,后面跟着它的同义词,用空白分隔。空行和结尾的空格会被忽略。
+ synonym 模板要求的唯一参数是SYNONYMS ,它是其配置文件的基名 — 上例中的my_synonyms 。该文件的完整名称将是$SHAREDIR/tsearch_data/my_synonyms.syn (其中$SHAREDIR 表示PostgreSQL 安装的共享数据目录)。该文件格式是每行一个要被替换的词,后面跟着它的同义词,用空白分隔。空行和结尾的空格会被忽略。
@@ -1815,28 +1863,28 @@ mydb=# SELECT 'indexes are very useful'::tsvector @@ to_tsquery('tst', 'indices'
- 基本上一个分类词典会用一个首选词替换所有非首选词,并且也可选择地保留原始术语用于索引。PostgreSQL 的分类词典的当前实现是同义词词典的一个扩展,并增加了短语 支持。一个分类词典要求一个下列格式的配置文件:
+ 分类词典基本上会用一个首选词替换所有非首选词,并且也可以选择保留原始词用于索引。PostgreSQL 的分类词典的当前实现是同义词词典的一个扩展,并增加了短语 支持。一个分类词典需要一个采用以下格式的配置文件:
-# this is a comment
-sample word(s) : indexed word(s)
-more sample word(s) : more indexed word(s)
+# 这是一条注释
+示例词(一个或多个) : 索引词(一个或多个)
+更多示例词(一个或多个) : 更多索引词(一个或多个)
...
- 其中冒号(: )符号扮演了一个短语及其替换之间的定界符。
+ 其中冒号(: )符号用作短语及其替换词之间的分隔符。
- 分类词典会使用一个子词典 (在词典配置中指定)在检查短语匹配之前正规化输入文本。只能选择一个子词典。如果子词典无法识别某个词,就会报错。在这种情况下,你应当避免使用该词,或者让子词典学会它。你可以在某个被索引词的开头放置一个星号(* ),以跳过对子词典的应用,但所有样例词都必须 能被子词典识别。
+ 分类词典会使用一个子词典 (在词典配置中指定)在检查短语匹配之前正规化输入文本。只能选择一个子词典。如果子词典无法识别某个词,就会报错。在这种情况下,你应当避免使用该词,或者让子词典学会它。你可以在某个被索引词的开头放置一个星号(* ),以跳过将子词典应用于该词,但所有样例词都必须 能被子词典识别。
- 如果有多个短语匹配输入,则分类词典选择最长的那一个,并且使用最后的定义打破连结。
+ 如果有多个短语匹配输入,分类词典会选择最长的匹配;长度相同时使用最后的定义。
- 由子词典识别的特定停用词不能够被指定;改用? 标记任何可以出现停用词的地方。例如,假定根据子词典a 和the 是停用词:
+ 由子词典识别的特定停用词不能够被指定;改用? 标记可出现任意停用词的位置。例如,假定根据子词典a 和the 是停用词:
? one ? two : swsw
@@ -1878,7 +1926,7 @@ CREATE TEXT SEARCH DICTIONARY thesaurus_simple (
- mythesaurus 是分类词典配置文件的基础名称(它的全名将是$SHAREDIR/tsearch_data/mythesaurus.ths ,其中$SHAREDIR 表示安装的共享数据目录)。
+ mythesaurus 是分类词典配置文件的基名(它的全名将是$SHAREDIR/tsearch_data/mythesaurus.ths ,其中$SHAREDIR 表示安装的共享数据目录)。
@@ -1903,7 +1951,7 @@ ALTER TEXT SEARCH CONFIGURATION russian
分类词典示例
- 考虑简单的天文词库 thesaurus_astro ,其中包含一些天文单词组合:
+ 考虑一个简单的天文分类词典 thesaurus_astro ,其中包含一些天文单词组合:
supernovae stars : sn
@@ -1971,7 +2019,7 @@ SELECT plainto_tsquery('supernova star');
Ispell 词典
- Ispell 词典模板支持形态词典 ,它可以把一个词的许多不同语言学形式正规化为同一个词位。例如,一个英语 Ispell 词典可以把搜索词 bank 的词尾变化和词形变化对应起来,例如 banking 、banked 、banks 、banks' 和 bank's 。
+ Ispell 词典模板支持形态词典 ,它可以把一个词的许多不同语言学形式正规化为同一个词位。例如,一个英语 Ispell 词典可以匹配搜索词 bank 的所有变格和变位形式,例如 banking 、banked 、banks 、banks' 和 bank's 。
@@ -1986,12 +2034,12 @@ SELECT plainto_tsquery('supernova star');
- 要创建一个Ispell 词典,执行这三步:
+ 要创建一个Ispell 词典,请执行以下步骤:
- 下载词典配置文件。OpenOffice 扩展文件的扩展名是.oxt 。有必要抽取.aff 和.dic 文件,把扩展改为.affix 和.dict 。对于某些词典文件,还需要使用下面的命令把字符转换成 UTF-8 编码(例如挪威语词典):
+ 下载词典配置文件。OpenOffice 扩展文件的扩展名是.oxt 。需要提取.aff 和.dic 文件,将扩展名改为.affix 和.dict 。对于某些词典文件,还需要使用下面的命令把字符转换成 UTF-8 编码(例如挪威语词典):
iconv -f ISO_8859-1 -t UTF-8 -o nn_no.affix nn_NO.aff
iconv -f ISO_8859-1 -t UTF-8 -o nn_no.dict nn_NO.dic
@@ -2000,7 +2048,7 @@ iconv -f ISO_8859-1 -t UTF-8 -o nn_no.dict nn_NO.dic
- 拷贝文件到$SHAREDIR/tsearch_data 目录
+ 复制文件到$SHAREDIR/tsearch_data 目录
@@ -2018,11 +2066,11 @@ CREATE TEXT SEARCH DICTIONARY english_hunspell (
- 这里,DictFile 、AffFile 和StopWords 指定词典、词缀和停用词文件的基础名称。停用词文件的格式和前面解释的simple 词典类型相同。其他文件的格式在这里没有指定,但是也可以从上面提到的网站获得。
+ 这里,DictFile 、AffFile 和StopWords 指定词典、词缀和停用词文件的基名。停用词文件的格式和前面解释的simple 词典类型相同。其他文件的格式在这里没有指定,但是也可以从上面提到的网站获得。
- Ispell 词典通常识别一个有限集合的词,这样它们后面应该跟着另一个更广义的词典;例如,一个 Snowball 词典,它可以识别所有东西。
+ Ispell 词典通常只能识别有限的词,因此其后应跟着另一个覆盖范围更广的词典;例如,一个 Snowball 词典,它可以识别所有输入。
@@ -2030,13 +2078,13 @@ CREATE TEXT SEARCH DICTIONARY english_hunspell (
prefixes
flag *A:
- . > RE # As in enter > reenter
+ . > RE # 例如 enter > reenter
suffixes
flag T:
- E > ST # As in late > latest
- [^AEIOU]Y > -Y,IEST # As in dirty > dirtiest
- [AEIOU]Y > EST # As in gray > grayest
- [^EY] > EST # As in small > smallest
+ E > ST # 例如 late > latest
+ [^AEIOU]Y > -Y,IEST # 例如 dirty > dirtiest
+ [AEIOU]Y > EST # 例如 gray > grayest
+ [^EY] > EST # 例如 small > smallest
@@ -2052,14 +2100,14 @@ lark/MRS
.dict 文件的格式是:
-basic_form/affix_class_name
+基本词形/词缀类名
在.affix 文件中,每一个词缀标志以下面的格式描述:
-condition > [-stripping_letters,] adding_affix
+条件 > [-删除的字母,] 添加的词缀
@@ -2068,7 +2116,7 @@ condition > [-stripping_letters,] adding_affix
- Ispell 词典支持划分复合词,这是一个有用的特性。注意词缀文件应该用compoundwords controlled 语句指定一个特殊标志,它标记可以参与到复合格式中的词典词:
+ Ispell 词典支持划分复合词,这是一个有用的特性。注意词缀文件应该用compoundwords controlled 语句指定一个特殊标志,用于标记词典中可以参与构成复合词的词:
compoundwords controlled z
@@ -2098,7 +2146,7 @@ SFX T 0 est [^ey]
- 一个词缀类的第一行是头部。头部后面列出了词缀规则的域:
+ 一个词缀类的第一行是首部。首部后面列出了词缀规则的字段:
@@ -2150,7 +2198,7 @@ largehearted
Snowball 词典
- Snowball 词典模板基于 Martin Porter 的一个项目,他是流行的英语 Porter 词干分析算法的发明者。Snowball 现在对许多语言提供词干分析算法(详见Snowball 站点 )。每一个算法懂得按照其语言中的拼写,如何缩减词的常见变体形式为一个基础或词干。一个 Snowball 词典要求一个language 参数来标识要用哪种词干分析器,并且可以选择地指定一个stopword 文件名来给出一个要被消除的词列表(PostgreSQL 的标准停用词列表也是由 Snowball 项目提供的)。例如,有一个内置的定义等效于
+ Snowball 词典模板基于 Martin Porter 的一个项目,他是流行的英语 Porter 词干分析算法的发明者。Snowball 现在对许多语言提供词干分析算法(详见Snowball 站点 )。每种算法都知道如何把其语言中词的常见变体约简为基本拼写形式,也就是词干。一个 Snowball 词典要求一个language 参数来标识要用哪种词干分析器,并且可以选择指定一个stopword 文件名来给出一个要被消除的词列表(PostgreSQL 的标准停用词列表也是由 Snowball 项目提供的)。例如,有一个内置的定义等效于
CREATE TEXT SEARCH DICTIONARY english_stem (
@@ -2164,7 +2212,7 @@ CREATE TEXT SEARCH DICTIONARY english_stem (
- 一个Snowball 词典识别所有的东西,不管它能不能简化该词,因此它应当被放置在词典列表的最后。把它放在任何其他词典前面是没有用处的,因为一个词元永远不会穿过它而进入到下一个词典。
+ 一个Snowball 词典识别所有输入,不管它能不能简化该词,因此它应当被放置在词典列表的最后。把它放在任何其他词典前面是没有用处的,因为一个词元永远不会穿过它而进入到下一个词典。
@@ -2175,11 +2223,11 @@ CREATE TEXT SEARCH DICTIONARY english_stem (
配置示例
- 一个文本搜索配置指定了将一个文档转换成一个tsvector 所需的所有选项:用于把文本分解成词元的解析器,以及用于将每一个词元转换成词位的词典。每一次to_tsvector 或to_tsquery 的调用都需要一个文本搜索配置来执行其处理。配置参数指定了默认配置的名称,如果忽略了显式的配置参数,文本搜索函数将会使用它。它可以在postgresql.conf 中设置,或者使用SET 命令为一个单独的会话设置。
+ 一个文本检索配置指定了将一个文档转换成一个tsvector 所需的所有选项:用于把文本分解成词元的解析器,以及用于将每一个词元转换成词位的词典。每一次to_tsvector 或to_tsquery 的调用都需要一个文本检索配置来执行其处理。配置参数指定了默认配置的名称,如果省略了显式的配置参数,文本检索函数将会使用它。它可以在postgresql.conf 中设置,或者使用SET 命令为一个单独的会话设置。
- 有一些预定义的文本搜索配置可用,并且你可以容易地创建自定义的配置。为了便于管理文本搜索对象,可以使用一组SQL 命令,并且有多个psql 命令可以显示有关文本搜索对象()的信息。
+ 有一些预定义的文本检索配置可用,并且你可以容易地创建自定义的配置。为了便于管理文本检索对象,可以使用一组SQL 命令,并且有多个psql 命令可以显示有关文本检索对象()的信息。
@@ -2271,17 +2319,17 @@ SHOW default_text_search_config;
- 测试和调试文本搜索
+ 测试和调试文本检索
- 一个自定义文本搜索配置的行为很容易变得混乱。本节中描述的函数对于测试文本搜索对象有用。你可以测试一个完整的配置,或者独立测试解析器和词典。
+ 一个自定义文本检索配置的行为很容易让人困惑。本节中描述的函数对于测试文本检索对象有用。你可以测试一个完整的配置,或者独立测试解析器和词典。
配置测试
- 函数ts_debug 允许简单地测试一个文本搜索配置。
+ 函数ts_debug 可方便地测试一个文本检索配置。
@@ -2301,7 +2349,7 @@ ts_debug( config re
ts_debug>显示document 的每一个词元的信息,词元由解析器产生并由配置的词典处理过。该函数使用由config 指定的配置,如果该参数被忽略则使用default_text_search_config 指定的配置。
+ class="PARAMETER">config指定的配置,如果省略该参数则使用default_text_search_config 指定的配置。
@@ -2376,7 +2424,7 @@ SELECT * FROM ts_debug('english', 'a fat cat sat on a mat - it ate a fat rats')
- 为了一个更广泛的示范,我们先为英语语言创建一个public.english 配置和 Ispell 词典:
+ 为了做更完整的演示,我们先为英语创建一个public.english 配置和 Ispell 词典:
@@ -2405,7 +2453,7 @@ SELECT * FROM ts_debug('public.english', 'The Brightest supernovaes');
- 在这个示例中,词Brightest 被解析器识别为一个ASCII word (别名asciiword )。对于这种词元类型,词典列表是english_ispell 和english_stem 。该词被english_ispell 识别,并被这个词典归约为名词bright 。词supernovaes 对english_ispell 词典来说是未知的,因此它会被传递给下一个词典;幸运的是,它随后被识别了。(实际上,english_stem 是一个 Snowball 词典,它能够识别所有输入;这也是为什么它被放在词典列表末尾。)
+ 在这个示例中,词Brightest 被解析器识别为一个ASCII 词 (别名asciiword )。对于这种词元类型,词典列表是english_ispell 和english_stem 。该词被english_ispell 识别,并被这个词典归约为词位bright 。词supernovaes 对english_ispell 词典来说是未知的,因此它会被传递给下一个词典;幸运的是,它随后被识别了。(实际上,english_stem 是一个 Snowball 词典,它能够识别所有输入;这也是为什么它被放在词典列表末尾。)
@@ -2434,7 +2482,7 @@ FROM ts_debug('public.english', 'The Brightest supernovaes');
解析器测试
- 下列函数允许直接测试一个文本搜索解析器。
+ 下列函数允许直接测试一个文本检索解析器。
@@ -2476,7 +2524,7 @@ ts_token_type(parser_oid> oid>, OUT
- ts_token_type 返回一个表,描述指定解析器能够识别的每一种词元。对于每种词元类型,该表给出解析器用来标记该类词元的整数 tokid 、在配置命令中命名该词元类型的 alias ,以及简短的 description 。例如:
+ ts_token_type 返回一个表,描述指定解析器能够识别的每一种词元类型。对于每种词元类型,该表给出解析器用来标记该类词元的整数 tokid 、在配置命令中命名该词元类型的 alias ,以及简短的 description 。例如:
SELECT * FROM ts_token_type('default');
@@ -2514,7 +2562,7 @@ SELECT * FROM ts_token_type('default');
词典测试
- ts_lexize 函数帮助词典测试。
+ ts_lexize 函数便于测试词典。
@@ -2572,17 +2620,17 @@ SELECT plainto_tsquery('supernovae stars');
- 文本搜索的首选索引类型
+ 文本检索的首选索引类型
- 文本搜索
+ 文本检索
索引
- 有两种索引可以用来加速全文搜索:GIN 和
+ 有两种索引可以用来加速全文检索:GIN 和
GiST 。
- 请注意,索引对于全文搜索并非强制要求,但在定期搜索某一列的情况下,通常是可取的。
+ 请注意,索引对于全文检索并非强制要求,但在定期搜索某一列的情况下,通常是可取的。
要创建这样的索引,可以采用下面的任一种方式:
@@ -2593,7 +2641,7 @@ SELECT plainto_tsquery('supernovae stars');
索引
GIN
- 文本搜索
+ 文本检索
CREATE INDEX name ON table USING GIN (column );
@@ -2613,7 +2661,7 @@ SELECT plainto_tsquery('supernovae stars');
索引
GiST
- 文本搜索
+ 文本检索
CREATE INDEX name ON table USING GIST (column );
@@ -2631,7 +2679,7 @@ SELECT plainto_tsquery('supernovae stars');
- GIN 索引是文本搜索的首选索引类型。作为倒排索引,每个词(词位)在
+ GIN 索引是文本检索的首选索引类型。作为倒排索引,每个词(词位)在
其中都有一个索引项,其中有压缩过的匹配位置的列表。多词搜索可以找到
第一个匹配,然后使用该索引移除缺少额外词的行。GIN 索引只存储
tsvector 值的词(词位),并且不存储它们的权重标签。因此,
@@ -2639,15 +2687,15 @@ SELECT plainto_tsquery('supernovae stars');
- 一个 GiST 索引是有损的 ,这表示索引可能产生假匹配,并且有必要检查真实的表行来消除这种假匹配(PostgreSQL 在需要时会自动做这一步)。GiST 索引之所以是有损的,是因为每一个文档在索引中被表示为一个定长的签名。该签名通过哈希每一个词到一个 n 位串中的一个单一位来产生,通过将所有这些位 OR 在一起产生一个 n 位的文档签名。当两个词哈希到同一个位位置时就会产生假匹配。如果查询中所有词都有匹配(真或假),则必须检索表行查看匹配是否正确。
+ 一个 GiST 索引是有损的 ,这表示索引可能产生假匹配,并且有必要检查真实的表行来消除这种假匹配(PostgreSQL 在需要时会自动做这一步)。GiST 索引之所以是有损的,是因为每一个文档在索引中被表示为一个定长的签名。该签名通过将每个词 hash 到一个 n 位串中的一位,再将所有这些位进行 OR 运算来生成,结果是一个 n 位的文档签名。当两个词 hash 到同一个位位置时就会产生假匹配。如果查询中所有词都有匹配(真或假),则必须检索表行查看匹配是否正确。
- 有损性导致的性能下降归因于不必要的表记录(即被证实为假匹配的记录)获取。因为表记录的随机访问是较慢的,这限制了 GiST 索引的可用性。假匹配的可能性取决于几个因素,特别是唯一词的数量,因此推荐使用词典来缩减这个数量。
+ 有损性导致的性能下降归因于不必要的表记录(即被证实为假匹配的记录)获取。因为表记录的随机访问是较慢的,这限制了 GiST 索引的实用性。假匹配的可能性取决于几个因素,特别是不同词的数量,因此推荐使用词典来缩减这个数量。
- 注意GIN 索引的构件时间常常可以通过增加来改进,而GiST 索引的构建时间则与该参数无关。
+ 注意GIN 索引的构建时间常常可以通过增加来改进,而GiST 索引的构建时间则对该参数不敏感。
对大集合分区并正确使用 GIN 和 GiST 索引允许实现带在线更新的快速搜索。分区可以在数据库层面上使用表继承来完成,或者通过将文档分布在服务器上,并使用 模块收集搜索结果来完成。后者是可能的,因为排名函数只使用本地信息。
@@ -2658,7 +2706,7 @@ SELECT plainto_tsquery('supernovae stars');
psql 支持
- 关于文本搜索配置对象的信息可以在psql 中使用一组命令获得:
+ 关于文本检索配置对象的信息可以在psql 中使用一组命令获得:
\dF{d,p,t}+ PATTERN
@@ -2666,7 +2714,7 @@ SELECT plainto_tsquery('supernovae stars');
- 可选参数 PATTERN 可以是文本搜索对象的名称,也可以可选地带上模式限定。如果省略 PATTERN ,则会显示所有可见对象的信息。PATTERN 还可以是正则表达式,并且可以为模式名和对象名分别提供独立 的模式。下面的示例说明了这一点:
+ 可选参数 PATTERN 可以是文本检索对象的名称,也可以可选地带上模式限定。如果省略 PATTERN ,则会显示所有可见对象的信息。PATTERN 还可以是正则表达式,并且可以为模式名和对象名分别提供独立 的模式。下面的示例说明了这一点:
=> \dF *fulltext*
@@ -2692,7 +2740,9 @@ SELECT plainto_tsquery('supernovae stars');
\dF+ PATTERN
- 列出文本搜索配置(添加 + 可获得更详细的信息)。
+
+ 列出文本检索配置(加上 + 可显示更多细节)。
+
=> \dF russian
List of text search configurations
Schema | Name | Description
@@ -2731,7 +2781,9 @@ Parser: "pg_catalog.default"
\dFd+ PATTERN
- 列出文本搜索词典(加上+ 可获得更详细的信息)。
+
+ 列出文本检索词典(加上 + 可显示更多细节)。
+
=> \dFd
List of text search dictionaries
Schema | Name | Description
@@ -2760,7 +2812,9 @@ Parser: "pg_catalog.default"
\dFp+ PATTERN
- 列出文本搜索解析器(添加 + 可获得更详细的信息)。
+
+ 列出文本检索解析器(加上 + 可显示更多细节)。
+
=> \dFp
List of text search parsers
Schema | Name | Description
@@ -2811,7 +2865,9 @@ Parser: "pg_catalog.default"
\dFt+ PATTERN
- 列出文本搜索模板(添加 + 可获得更详细的信息)。
+
+ 列出文本检索模板(加上 + 可显示更多细节)。
+
=> \dFt
List of text search templates
Schema | Name | Description
@@ -2832,7 +2888,7 @@ Parser: "pg_catalog.default"
限制
- 目前,PostgreSQL 的文本搜索功能存在以下限制:
+ 目前,PostgreSQL 的文本检索功能存在以下限制:
每个词位的长度必须小于 2K 字节
@@ -2859,12 +2915,12 @@ Parser: "pg_catalog.default"
- 为了对比,PostgreSQL 8.1 的文档包含 10,441 个唯一词,总数 335,420 个词,并且最频繁的词postgresql
在 655 个文档中被提到 6,127 次。
+ 为了对比,PostgreSQL 8.1 的文档包含 10,441 个不同词,总数 335,420 个词,并且最频繁的词postgresql
在 655 个文档中被提到 6,127 次。
- 另一个示例 — PostgreSQL 的邮件列表归档在 461,020 条消息的 57,491,343 个词位中包含 910,989 个唯一词。
+ 另一个示例 — PostgreSQL 的邮件列表归档在 461,020 条消息的 57,491,343 个词位中包含 910,989 个不同词。
diff --git a/zh/10/unaccent.sgml b/zh/10/unaccent.sgml
index 0bc0bfe7..ea1617ac 100644
--- a/zh/10/unaccent.sgml
+++ b/zh/10/unaccent.sgml
@@ -8,11 +8,11 @@
- unaccent 是一个文本搜索词典,它会从词位中移除重音符号(变音符号)。它是一个过滤字典,也就是说,它的输出总会被传递给下一个词典(如果有),这不同于词典的通常行为。这使得全文搜索能够以不区分重音的方式处理文本。
+ unaccent 是一个文本检索词典,它会从词位中移除重音符号(变音符号)。它是一个过滤词典,也就是说,它的输出总会被传递给下一个词典(如果有),这不同于词典的通常行为。这使得全文检索能够以不区分重音的方式处理文本。
- unaccent 当前的实现还不能作为thesaurus 词典的正规化字典使用。
+ unaccent 当前的实现还不能作为thesaurus 词典的正规化词典使用。
@@ -61,7 +61,7 @@
- 与其他PostgreSQL 文本搜索配置文件一样,规则文件必须以 UTF-8 编码存储。加载时,数据会自动转换为当前数据库的编码。任何包含无法转换的字符的行都会被静默忽略,因此规则文件可以包含不适用于当前编码的规则。
+ 与其他PostgreSQL 文本检索配置文件一样,规则文件必须以 UTF-8 编码存储。加载时,数据会自动转换为当前数据库的编码。任何包含无法转换的字符的行都会被静默忽略,因此规则文件可以包含不适用于当前编码的规则。
@@ -74,7 +74,7 @@
用法
- 安装unaccent 扩展会创建一个文本搜索模板unaccent 以及一个基于该模板的词典unaccent 。unaccent 词典的默认参数设置是RULES='unaccent' ,因此它可立即配合标准的unaccent.rules 文件使用。如果愿意,也可以修改这个参数,例如
+ 安装unaccent 扩展会创建一个文本检索模板unaccent 以及一个基于该模板的词典unaccent 。unaccent 词典的默认参数设置是RULES='unaccent' ,因此它可立即配合标准的unaccent.rules 文件使用。如果愿意,也可以修改这个参数,例如
mydb=# ALTER TEXT SEARCH DICTIONARY unaccent (RULES='my_rules');
@@ -95,7 +95,7 @@ mydb=# select ts_lexize('unaccent','Hôtel');
- 下面的示例展示了如何将unaccent 词典插入到文本搜索配置中:
+ 下面的示例展示了如何将unaccent 词典插入到文本检索配置中:
mydb=# CREATE TEXT SEARCH CONFIGURATION fr ( COPY = french );
mydb=# ALTER TEXT SEARCH CONFIGURATION fr
@@ -126,7 +126,7 @@ mydb=# select ts_headline('fr','Hôtel de la Mer',to_tsquery('fr','Hotels')
函数
- unaccent() 函数会从给定字符串中移除重音符号(变音符号)。从本质上说,它是对unaccent 这一类型词典的一个包装器,但也可以在常规文本搜索环境之外使用。
+ unaccent() 函数会从给定字符串中移除重音符号(变音符号)。从本质上说,它是对unaccent 这一类型词典的一个包装器,但也可以在常规文本检索环境之外使用。
@@ -138,7 +138,7 @@ unaccent(dictionary
- 如果省略dictionary 参数,则会使用与unaccent() 函数本身位于同一模式中、名为unaccent 的文本搜索词典。
+ 如果省略dictionary 参数,则会使用与unaccent() 函数本身位于同一模式中、名为unaccent 的文本检索词典。
diff --git a/zh/11/array.sgml b/zh/11/array.sgml
index 49e8b7b6..5491ebf5 100644
--- a/zh/11/array.sgml
+++ b/zh/11/array.sgml
@@ -4,7 +4,7 @@
数组
- array
+ 数组
@@ -15,8 +15,8 @@
数组类型的声明
- array
- declaration
+ 数组
+ 声明
@@ -64,8 +64,8 @@ CREATE TABLE tictactoe (
数组值输入
- array
- constant
+ 数组
+ 常量
@@ -86,7 +86,7 @@ CREATE TABLE tictactoe (
(这类数组常量实际上只是 中讨论的通用类型常量的一种特例。该常量最初会被当作字符串处理,然后传递给数组输入转换例程。必要时可能需要显式指定类型。)
+ linkend="sql-syntax-constants-generic"/>中讨论的通用类型常量的一种特例。该常量最初会被当作字符串处理,然后传递给数组输入转换例程。可能需要显式指定类型。)
@@ -118,7 +118,10 @@ SELECT * FROM sal_emp;
- 多维数组在每个维度上的长度必须匹配。不匹配会导致错误,例如:
+
+ 多维数组的各个子数组在每个维度上的长度必须匹配。不匹配会导致错误,例如:
+
+
INSERT INTO sal_emp
VALUES ('Bill',
'{10000, 10000, 10000, 10000}',
@@ -148,8 +151,8 @@ INSERT INTO sal_emp
访问数组
- array
- accessing
+ 数组
+ 访问
@@ -182,9 +185,9 @@ SELECT pay_by_quarter[3] FROM sal_emp;
- 我们还可以访问数组或子数组的任意矩形切片。数组切片通过在一个或多个数组维度上写成
+ 我们还可以访问数组的任意矩形切片,即子数组。数组切片通过在一个或多个数组维度上写成
lower-bound :upper-bound
- 的形式来表示。例如,下面这个查询取回 Bill 在一周前两天日程安排中的第一个项目:
+ 的形式来表示。例如,下面这个查询取回 Bill 在一周中前两天里每天的首项日程:
SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';
@@ -231,11 +234,11 @@ SELECT schedule[:][1:1] FROM sal_emp WHERE name = 'Bill';
- 如果数组本身或任一下标表达式为 NULL,则数组下标表达式将返回空值。此外,如果下标超出数组边界,也会返回空值(这种情况不会报错)。例如,如果 schedule 当前的维度是 [1:3][1:2] ,那么引用 schedule[3][3] 会得到 NULL。类似地,使用错误数量的下标访问数组,得到的也是空值而不是错误。
+ 如果数组本身或任一下标表达式为 NULL,则数组下标表达式将返回 NULL。此外,如果下标超出数组边界,也会返回 NULL(这种情况不会报错)。例如,如果 schedule 当前的维度是 [1:3][1:2] ,那么引用 schedule[3][3] 会得到 NULL。类似地,使用错误数量的下标访问数组,得到的也是 NULL 而不是错误。
- 同样地,如果数组本身或任一下标表达式为 NULL,数组切片表达式也会返回空值。不过,在其他情况下,例如选择一个完全位于当前数组边界之外的数组切片时,切片表达式返回的是空(零维)数组而不是空值。(这与非切片行为不一致,是出于历史原因。)如果所请求的切片与数组边界仅部分重叠,那么它会被静默缩减为重叠区域,而不是返回空值。
+ 同样地,如果数组本身或任一下标表达式为 NULL,数组切片表达式也会返回 NULL。不过,在其他情况下,例如选择一个完全位于当前数组边界之外的数组切片时,切片表达式返回的是空(零维)数组而不是 NULL。(这与非切片行为不一致,是出于历史原因。)如果所请求的切片与数组边界仅部分重叠,那么它会被静默缩减为重叠区域,而不是返回 NULL。
@@ -289,8 +292,8 @@ SELECT cardinality(schedule) FROM sal_emp WHERE name = 'Carol';
修改数组
- array
- modifying
+ 数组
+ 修改
@@ -327,7 +330,7 @@ UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'
- 已存储的数组值可以通过给尚不存在的元素赋值来扩展。原有元素与新赋值元素之间的任何位置都将用空值填充。例如,如果数组 myarray 当前有 4 个元素,那么在一次更新把值赋给 myarray[6] 之后,它将有 6 个元素;myarray[5] 将包含空值。目前,以这种方式扩展只允许用于一维数组,不允许用于多维数组。
+ 已存储的数组值可以通过给尚不存在的元素赋值来扩展。原有元素与新赋值元素之间的任何位置都将用 NULL 填充。例如,如果数组 myarray 当前有 4 个元素,那么在一次更新把值赋给 myarray[6] 之后,它将有 6 个元素;myarray[5] 将包含 NULL。目前,以这种方式扩展只允许用于一维数组,不允许用于多维数组。
@@ -439,21 +442,21 @@ SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]);
在简单情况下,优先使用上面讨论的连接操作符,而不是直接调用这些函数。不过,由于连接操作符被重载以同时服务于这三种情形,所以在某些场景下使用这些函数之一有助于避免歧义。例如,考虑:
-SELECT ARRAY[1, 2] || '{3, 4}'; -- the untyped literal is taken as an array
+SELECT ARRAY[1, 2] || '{3, 4}'; -- 未指定类型的字面量被当作数组
?column?
-----------
{1,2,3,4}
-SELECT ARRAY[1, 2] || '7'; -- so is this one
+SELECT ARRAY[1, 2] || '7'; -- 这个字面量也一样
ERROR: malformed array literal: "7"
-SELECT ARRAY[1, 2] || NULL; -- so is an undecorated NULL
+SELECT ARRAY[1, 2] || NULL; -- 未加类型修饰的 NULL 也一样
?column?
----------
{1,2}
(1 row)
-SELECT array_append(ARRAY[1, 2], NULL); -- this might have been meant
+SELECT array_append(ARRAY[1, 2], NULL); -- 这可能才是原本想表达的意思
array_append
--------------
{1,2,NULL}
@@ -467,8 +470,8 @@ SELECT array_append(ARRAY[1, 2], NULL); -- this might have been meant
在数组中搜索
- array
- searching
+ 数组
+ 搜索
@@ -509,9 +512,14 @@ SELECT * FROM
关于该函数的说明见 。
- 还可以使用&& 操作符搜索数组,它检查左操作数是否与右操作数重叠。例如:
+
+ 也可以使用 && 操作符来搜索数组,它会检查左操作数是否与右操作数有重叠。例如:
+
+
SELECT * FROM sal_emp WHERE pay_by_quarter && ARRAY[10000];
- 关于此操作符和其他数组操作符的更多说明,参见 。可以通过适当的索引来加速这种搜索,参见 。
+
+
+ 关于该操作符和其他数组操作符的更多说明见 。如 所述,也可以通过适当的索引加速。
还可以使用array_position 和array_positions 函数在数组中搜索特定值。前者返回某个值在数组中首次出现位置的下标;后者返回一个数组,其中包含该值在数组中所有出现位置的下标。例如:
@@ -538,7 +546,7 @@ SELECT array_positions(ARRAY[1, 4, 3, 1, 3, 4, 2, 1], 1);
数组输入和输出语法
- array
+ 数组
I/O
@@ -551,7 +559,7 @@ SELECT array_positions(ARRAY[1, 4, 3, 1, 3, 4, 2, 1], 1);
- 默认情况下,数组各维度的下界索引值都设为 1。要表示具有其他下界的数组,可以在写出数组内容之前显式指定数组下标范围。这种修饰由包围每个数组维度上下界的方括号([] )构成,中间以冒号(: )作为分隔符字符。数组维度修饰后面再跟一个等号(= )。例如:
+ 默认情况下,数组各维度的下界下标值都设为 1。要表示具有其他下界的数组,可以在写出数组内容之前显式指定数组下标范围。这种修饰由包围每个数组维度上下界的方括号([] )构成,中间以冒号(: )作为分隔符字符。数组维度修饰后面再跟一个等号(= )。例如:
SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2
FROM (SELECT '[1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}'::int[] AS f1) AS ss;
diff --git a/zh/11/catalogs.sgml b/zh/11/catalogs.sgml
index e81e5cd4..bec99122 100644
--- a/zh/11/catalogs.sgml
+++ b/zh/11/catalogs.sgml
@@ -310,27 +310,27 @@
pg_ts_config
- 文本搜索配置
+ 文本检索配置
pg_ts_config_map
- 文本搜索配置的词元映射
+ 文本检索配置的词元映射
pg_ts_dict
- 文本搜索字典
+ 文本检索词典
pg_ts_parser
- 文本搜索分析器
+ 文本检索解析器
pg_ts_template
- 文本搜索模板
+ 文本检索模板
@@ -6925,12 +6925,12 @@ SCRAM-SHA-256$<iteration count> :&l
- pg_ts_config 目录包含表示文本搜索配置的条目。一个配置指定某个特定的文本搜索分析器,以及针对该分析器每种输出词元类型所定义的字典列表。分析器由pg_ts_config 项表示,而词元到字典的映射则由 pg_ts_config系统目录包含表示文本检索配置的条目。一个配置指定某个特定的文本检索解析器,以及针对该解析器每种输出词元类型所定义的词典列表。解析器记录在pg_ts_config 条目中,而词元到词典的映射则由pg_ts_config_map 中的辅助项定义。
- PostgreSQL 的文本搜索特性在 中有更详尽的描述。
+ PostgreSQL 的文本检索特性在 中有更详尽的描述。
@@ -6961,7 +6961,7 @@ SCRAM-SHA-256$<iteration count> :&l
name
- 文本搜索配置名
+ 文本检索配置名
@@ -6988,7 +6988,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_ts_parser .oid
- 该配置的文本搜索分析器的OID
+ 该配置的文本检索解析器的 OID
@@ -7005,11 +7005,11 @@ SCRAM-SHA-256$<iteration count> :&l
- pg_ts_config_map 目录包含的项展示了对于每一个文本搜索配置的每一种输出词元类型,有哪些文本搜索字典可供查询以及以何种顺序。
+ pg_ts_config_map 系统目录中的条目说明了,对于每个文本检索配置所用解析器的每种输出词元类型,应当查询哪些文本检索词典以及查询的顺序。
- PostgreSQL 的文本搜索特性在 中有更详尽的描述。
+ PostgreSQL 的文本检索特性在 中有更详尽的描述。
@@ -7042,7 +7042,7 @@ SCRAM-SHA-256$<iteration count> :&l
integer
- 一种由配置的分析器送出的词元类型
+ 一种由配置的解析器送出的词元类型
@@ -7060,7 +7060,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_ts_dict .oid
- 要查询的文本搜索字典的OID
+ 要查询的文本检索词典的 OID
@@ -7077,11 +7077,11 @@ SCRAM-SHA-256$<iteration count> :&l
- pg_ts_dict 目录包含定义文本搜索字典的项。一个字典依赖于一个文本搜索模板,它指定了所有需要的函数实现,字典本身则为模板支持的用户可设置参数提供值。这种分工允许无权限的用户创建字典。参数由一个文本串dictinitoption 定义,其格式和意义随着模板而变化。
+ pg_ts_dict 系统目录包含定义文本检索词典的项。一个词典依赖于一个文本检索模板,它指定了所有需要的实现函数,词典本身则为模板支持的用户可设置参数提供值。这种分工允许普通用户创建词典。参数由一个文本串dictinitoption 定义,其格式和意义随着模板而变化。
- PostgreSQL 的文本搜索特性在 中有更详尽的描述。
+ PostgreSQL 的文本检索特性在 中有更详尽的描述。
@@ -7112,7 +7112,7 @@ SCRAM-SHA-256$<iteration count> :&l
name
- 文本搜索字典名
+ 文本检索词典名
@@ -7121,7 +7121,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_namespace .oid
- 包含该字典的名字空间OID
+ 包含该词典的名字空间的 OID
@@ -7130,7 +7130,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_authid .oid
- 字典的拥有者
+ 词典的拥有者
@@ -7139,7 +7139,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_ts_template .oid
- 该字典的文本搜索模板的OID
+ 该词典的文本检索模板的 OID
@@ -7165,11 +7165,11 @@ SCRAM-SHA-256$<iteration count> :&l
- pg_ts_parser 目录包含定义文本搜索分析器的项。一个分析器负责将输入文本分割成词位并为每一个词位分配一个词元类型。由于一个分析器必须用C语言级别的函数实现,创建新分析器的工作只限于数据库的超级用户。
+ pg_ts_parser 系统目录包含定义文本检索解析器的项。一个解析器负责将输入文本分割成词位并为每一个词位分配一个词元类型。由于一个解析器必须用 C 语言级别的函数实现,创建新解析器的工作只限于数据库的超级用户。
- PostgreSQL 的文本搜索特性在 中有更详尽的描述。
+ PostgreSQL 的文本检索特性在 中有更详尽的描述。
@@ -7200,7 +7200,7 @@ SCRAM-SHA-256$<iteration count> :&l
name
- 文本搜索分析器的名字
+ 文本检索解析器的名字
@@ -7209,7 +7209,7 @@ SCRAM-SHA-256$<iteration count> :&l
oid
pg_namespace .oid
- 包含此分析器的名字空间的OID
+ 包含此解析器的名字空间的 OID
@@ -7218,7 +7218,7 @@ SCRAM-SHA-256$<iteration count> :&l
regproc
pg_proc .oid
- 分析器启动函数的OID
+ 解析器启动函数的 OID
@@ -7227,7 +7227,7 @@ SCRAM-SHA-256$<iteration count> :&l
regproc
pg_proc .oid
- 分析器的下一词元函数的OID
+ 解析器的下一词元函数的 OID
@@ -7236,7 +7236,7 @@ SCRAM-SHA-256$<iteration count> :&l
regproc
pg_proc .oid
- 分析器的关闭函数的OID
+ 解析器的关闭函数的 OID
@@ -7245,7 +7245,7 @@ SCRAM-SHA-256$<iteration count> :&l
regproc
pg_proc .oid
- 分析器标题函数的 OID
+ 解析器的 headline 函数的 OID
@@ -7254,7 +7254,7 @@ SCRAM-SHA-256$<iteration count> :&l
regproc
pg_proc .oid
- 分析器的词汇类型函数的OID
+ 解析器的 lextype 函数的 OID
@@ -7271,11 +7271,11 @@ SCRAM-SHA-256$<iteration count> :&l
- pg_ts_template 目录包含定义文本搜索模板的项。一个模板是一类文本搜索字典的实现骨架。由于一个模板必须用C语言级别的函数实现,新模板的创建只限于数据库超级用户。
+ pg_ts_template 系统目录包含定义文本检索模板的项。一个模板是一类文本检索词典的实现骨架。由于一个模板必须用 C 语言级别的函数实现,新模板的创建只限于数据库超级用户。
- PostgreSQL 的文本搜索特性在 中有更详尽的描述。
+ PostgreSQL 的文本检索特性在 中有更详尽的描述。
@@ -7306,7 +7306,7 @@ SCRAM-SHA-256$<iteration count> :&l
name
- 文本搜索模板的名字
+ 文本检索模板的名字
diff --git a/zh/11/config.sgml b/zh/11/config.sgml
index 8537d74b..ece5a2e4 100644
--- a/zh/11/config.sgml
+++ b/zh/11/config.sgml
@@ -2802,7 +2802,7 @@ ANY num_sync ( num_sync ( num_sync ( num_sync ( )。
+ 设置规划器对一系列顺序磁盘页面读取中单次读取的代价估计。默认值是 1.0。对于某个表空间内的表和索引,可以通过设置该表空间的同名参数来覆盖此值(见 )。
@@ -2957,7 +2956,7 @@ ANY num_sync ( )。
+ 设置规划器对一次非顺序磁盘页面读取的代价估计。默认值是 4.0。对于某个表空间内的表和索引,可以通过设置该表空间的同名参数来覆盖此值(见 )。
@@ -2979,8 +2978,7 @@ ANY num_sync ( num_sync ( num_sync ( num_sync ( num_sync ( num_sync ( num_sync (
- 遗传查询优化
+ 遗传查询优化器
- GEQO是一个使用探索式搜索来执行查询规划的算法。它可以降低负载查询的规划时间。 同时,GEQO的检索是随机的,因此它的规划可能会不可确定。 更多信息参阅Chapter 50。
- 遗传查询规划器(GEQO)是一种使用启发式搜索来进行查询规划的算法。它可以降低对于复杂查询(连接很多表的查询)的规划时间,但是代价是它产生的计划有时候要差于使用穷举搜索算法找到的计划。详见 。
+ 遗传查询优化器(GEQO)是一种使用启发式搜索进行查询规划的算法。它可以缩短复杂查询(连接很多关系的查询)的规划时间,代价是生成的计划有时不如常规穷举搜索算法找到的计划。更多信息见 。
@@ -3185,7 +3182,7 @@ ANY num_sync ( num_sync ( num_sync ( num_sync ( num_sync ( .)
+ 目前,约束排除仅在通常用于通过继承树实现表分区的情况下默认启用。为所有表启用它会增加额外的规划开销,这在简单查询上相当明显,而且通常不会为简单查询带来好处。如果没有通过传统继承方式进行分区的表,你可能希望完全关闭它。(注意,分区表的等效功能由另一个参数 控制。)
@@ -3430,8 +3424,7 @@ SELECT * FROM parent WHERE key = 2400;
parallel_leader_participation (boolean )
- parallel_leader_participation configuration
- parameter
+ parallel_leader_participation 配置参数
@@ -3485,7 +3478,7 @@ SELECT * FROM parent WHERE key = 2400;
- 在哪里做日志
+ 日志记录到哪里
日志写到哪里
@@ -3493,7 +3486,7 @@ SELECT * FROM parent WHERE key = 2400;
current_logfiles
- 和日志_目的地配置参数
+ 和 log_destination 配置参数
@@ -3520,7 +3513,7 @@ csvlog log/postgresql.csv
- 在大多数 Unix 系统上,你将需要修改系统的syslog 守护进程的配置来使用log_destination 的syslog 选项。PostgreSQL 可以在syslog 设备LOCAL0 到LOCAL7 中记录(见 ),但是大部分平台上的默认syslog 配置会丢弃所有这种消息。你将需要增加这样的内容:
+ 在大多数 Unix 系统上,你将需要修改系统的syslog 守护进程的配置来使用log_destination 的syslog 选项。PostgreSQL 可以在syslog 设施LOCAL0 到LOCAL7 中记录(见 ),但是大部分平台上的默认syslog 配置会丢弃所有这种消息。你将需要增加这样的内容:
local0.* /var/log/postgresql
@@ -3528,7 +3521,7 @@ local0.* /var/log/postgresql
- 在 Windows 上,当你使用log_destination 的eventlog 选项时,你应该在操作系统中注册一个事件源极其库,这样 Windows 事件查看器能够清楚地显示事件日志消息。详见 。
+ 在 Windows 上,当你使用log_destination 的eventlog 选项时,你应该在操作系统中注册一个事件源及其库,这样 Windows 事件查看器能够清楚地显示事件日志消息。详见 。
@@ -3544,20 +3537,20 @@ local0.* /var/log/postgresql
- 这个参数启用日志收集器 ,它是一个捕捉被发送到stderr 的日志消息的后台进程,并且它会将这些消息重定向到日志文件中。这种方法比记录到syslog 通常更有用,因为某些类型的消息不会在syslog 输出中出现(一个常见的示例是动态链接器错误消息;另一个示例是由archive_command 等脚本产生的错误消息)。这个参数只能在服务器启动时设置。
+ 这个参数启用日志收集器 ,它是一个捕捉被发送到stderr 的日志消息的后台进程,并且它会将这些消息重定向到日志文件中。这种方法比记录到syslog 通常更有用,因为某些类型的消息可能不会在syslog 输出中出现(一个常见的示例是动态链接器错误消息;另一个示例是由archive_command 等脚本产生的错误消息)。这个参数只能在服务器启动时设置。
- 也可以不使用日志收集器而把日志记录到stderr ,日志消息将只会去到服务器的stderr 被定向到的位置。不过,那种方法只适合于低日志量,因为它没有提供方法来轮转日志文件。还有,在某些不使用日志收集器的平台上可能会导致丢失或者混淆日志输出,因为多个进程并发写入同一个日志文件时会覆盖彼此的输出。
+ 也可以不使用日志收集器而把日志记录到stderr ,日志消息将只会去到服务器的stderr 被定向到的位置。不过,那种方法只适合于低日志量,因为它没有提供便捷的方法来轮转日志文件。还有,在某些平台上,不使用日志收集器可能会导致日志输出丢失或混杂,因为多个进程并发写入同一个日志文件时会覆盖彼此的输出。
- 日志收集器被设计成从来不会丢失消息。这意味着在极高的负载下,如果服务器进程试图在收集器已经落后时发送更多的日志消息,那么它会被阻塞。相反,syslog 倾向于在无法写入消息时丢掉消息,这意味着在这样的情况下它可能会无法记录某些消息,但是它不会阻塞系统的其他部分。
+ 日志收集器被设计成从来不会丢失消息。这意味着在极高的负载下,如果服务器进程试图在收集器已经落后时发送更多的日志消息,那么它可能会被阻塞。相反,syslog 倾向于在无法写入消息时丢掉消息,这意味着在这样的情况下它可能会无法记录某些消息,但是它不会阻塞系统的其他部分。
@@ -3589,7 +3582,7 @@ local0.* /var/log/postgresql
当logging_collector 被启用时,这个参数设置被创建的日志文件的文件名。
- 该值被视为一种strftime 模式,因此% 转义可以被用来指定根据时间变化的文件名(注意如果有任何时区独立的% 转义,计算将在由 指定的时区中完成)。
+ 该值被视为一种strftime 模式,因此% 转义可以被用来指定根据时间变化的文件名(注意如果有任何依赖时区的% 转义,计算将在由 指定的时区中完成)。
被支持的% 转义和开放组织的strftime 说明中列举的类似。
注意系统的strftime 不会被直接使用,因此平台相关(非标准)的扩展无法工作。
默认是postgresql-%Y-%m-%d_%H%M%S.log 。
@@ -3616,7 +3609,7 @@ local0.* /var/log/postgresql
- 在 Unix 系统上,当logging_collector 被启用时,这个参数设置日志文件的权限(在微软 Windows 上这个参数将被忽略)。这个参数值应当是一个数字形式的模式,它可以被chmod 和umask 系统调用接受(要使用通常的十进制格式,该数字必须以一个0 (零)开始)。
+ 在 Unix 系统上,当logging_collector 被启用时,这个参数设置日志文件的权限(在微软 Windows 上这个参数将被忽略)。这个参数值应当是一个数字形式的模式,它可以被chmod 和umask 系统调用接受(要使用通常的八进制格式,该数字必须以一个0 (零)开始)。
@@ -3677,7 +3670,7 @@ local0.* /var/log/postgresql
- 示例:要保留 24 小时的日志,每个小时一个日志文件,但是在日志文件尺寸超过 1GB 时轮转。可以这样做:将log_filename 设置为server_log.%H%M 、
+ 示例:要保留 24 小时的日志,每个小时一个日志文件,如果日志文件尺寸超过 1GB,也会提前轮转。可以这样做:将log_filename 设置为server_log.%H%M 、
将log_truncate_on_rotation 设置为on 、
将log_rotation_age 设置为60 并且
将log_rotation_size 设置为1000000 。
@@ -3696,7 +3689,7 @@ local0.* /var/log/postgresql
- 当启用了向syslog 记录时,这个参数决定要使用的syslog 设备
。你可以在LOCAL0 、LOCAL1 、LOCAL2 、LOCAL3 、LOCAL4 、
+ 当启用了向syslog 记录时,这个参数决定要使用的syslog 设施
。你可以在LOCAL0 、LOCAL1 、LOCAL2 、LOCAL3 、LOCAL4 、
LOCAL5 、LOCAL6 、LOCAL7 中选择,默认值是LOCAL0 。还请参阅系统的syslog 守护进程的文档。这个参数只能在postgresql.conf 文件中或在服务器命令行上设置。
@@ -3751,7 +3744,7 @@ local0.* /var/log/postgresql
- 如果 syslog 最终被记录到一个文本文件中,那么两种设置的效果是一样的,但最好设置为 on,因为大部分 syslog 实现要么不能处理大型消息,要么需要做特殊的配置以处理大型消息。但是如果 syslog 最终写入到某种其他媒介,有必要让消息保持逻辑上的整体性(也更加有用)。
+ 如果 syslog 最终被记录到一个文本文件中,那么两种设置的效果是一样的,但最好设置为 on,因为大部分 syslog 实现要么不能处理大型消息,要么需要做特殊的配置以处理大型消息。但是如果 syslog 最终写入到某种其他媒介,让消息保持逻辑上的完整性可能是必要的,也可能更有用。
@@ -3813,9 +3806,7 @@ local0.* /var/log/postgresql
- 控制在服务器日志中记录哪些导致错误条件的SQL语句。当前的SQL语句将包含在任何指定
- severity
- 或更高消息的日志条目中。
+ 控制在服务器日志中记录哪些导致错误条件的SQL语句。对于达到指定 严重级别或更高级别的消息,其日志条目中会包含当前 SQL 语句。
有效值为DEBUG5 、
DEBUG4 、DEBUG3 、
DEBUG2 、DEBUG1 、
@@ -3847,7 +3838,7 @@ local0.* /var/log/postgresql
- 对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间将被独立记录。
+ 对于使用扩展查询协议的客户端,Parse、Bind 和 Execute 步骤的持续时间将被独立记录。
@@ -3881,7 +3872,7 @@ local0.* /var/log/postgresql
DEBUG1..DEBUG5
- 为开发者提供连续的更详细的信息。
+ 为开发者提供逐级更加详细的信息。
DEBUG
INFORMATION
@@ -3940,7 +3931,7 @@ local0.* /var/log/postgresql
- 记录什么到日志
+ 记录哪些内容
@@ -3961,7 +3952,7 @@ local0.* /var/log/postgresql
- application_name 可以是任意小于NAMEDATALEN 个字符(标准编译中是 64 个字符)的字符串。应用通常在连接服务器时设置此值。该名称将被显示在pg_stat_activity 视图中并被包括在 CSV 日志项中。它也会被通过 包括在普通日志项中。只有可打印 ASCII 字符能被使用在application_name 之中。其他字符将被替换为问号(? )。
+ application_name 可以是任意小于NAMEDATALEN 个字符(标准编译中是 64 个字符)的字符串。应用通常在连接服务器时设置此值。该名称将被显示在pg_stat_activity 视图中并被包括在 CSV 日志项中。也可以通过 将其包括在普通日志项中。只有可打印 ASCII 字符能被使用在application_name 之中。其他字符将被替换为问号(? )。
@@ -3985,7 +3976,6 @@ local0.* /var/log/postgresql
- 这个参数启用发出各种调试输出。当设置时,会打印生成的解析树, 查询重写输出,或执行的每个查询的执行计划。这些信息是在LOG 信息级别发出,因此默认的,它们会出现在服务器日志中,但不会发送给客户端。 可以通过 client_min_messages和/或log_min_messages 来设置。这些参数缺省是off。
这些参数将会让多种调试输出被发出。当被设置时,它们为每一个被执行的查询打印结果分析树、查询重写器输出或执行计划。这些消息在LOG 消息级别上被发出,因此默认情况下它们将出现在服务器日志中但不会被发送到客户端。你可以通过调整 和/或 来改变这种情况。这些参数默认是关闭的。
@@ -4019,7 +4009,7 @@ local0.* /var/log/postgresql
导致检查点和重启点在服务器日志中记录。日志消息中包括一些统计信息,
包括写入的缓冲区数量和写入它们所花费的时间。此参数只能在
- postgresql.conf 文件或服务器命令行中设置。默认值为开启。
+ postgresql.conf 文件或服务器命令行中设置。默认值为关闭。
@@ -4076,7 +4066,7 @@ local0.* /var/log/postgresql
- 对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间将被独立记录。
+ 对于使用扩展查询协议的客户端,Parse、Bind 和 Execute 步骤的持续时间将被独立记录。
@@ -4098,7 +4088,7 @@ local0.* /var/log/postgresql
控制在服务器日志中记录的每条消息的详细程度。有效值为TERSE ,
- DEFAULT 和VERBOSE ,每个值都会添加更多字段到显示的消息中。
+ DEFAULT 和VERBOSE ,它们依次在显示的消息中增加更多字段。
TERSE 不包括DETAIL ,HINT ,
QUERY 和CONTEXT 错误信息的记录。
VERBOSE 输出包括SQLSTATE 错误代码
@@ -4118,7 +4108,7 @@ local0.* /var/log/postgresql
- 默认情况下,连接日志消息只显示连接主机的 IP 地址。打开这个参数将导致也记录主机名。注意根据你的主机名解析设置,这可能会导致很微小的性能损失。这个参数只能在postgresql.conf 文件中或在服务器命令行上设置。
+ 默认情况下,连接日志消息只显示连接主机的 IP 地址。打开这个参数将导致也记录主机名。注意根据你的主机名解析设置,这可能会导致不可忽视的性能开销。这个参数只能在postgresql.conf 文件中或在服务器命令行上设置。
@@ -4191,8 +4181,8 @@ local0.* /var/log/postgresql
%n
- 带毫秒的时间戳(作为 Unix 时代)
- no
+ 带毫秒精度的 Unix 时间戳
+ 否
%i
@@ -4307,7 +4297,7 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
UPDATE 、DELETE 、TRUNCATE ,
和COPY FROM 。
如果PREPARE 、EXECUTE 和
- EXPLAIN ANALYZE 包含合适类型的命令,它们也会被记录。对于使用扩展查询协议的客户端,当收到一个执行消息时会产生日志并且会包括绑定参数的值(任何内嵌的单引号会被双写)。
+ EXPLAIN ANALYZE 包含合适类型的命令,它们也会被记录。对于使用扩展查询协议的客户端,当收到一个 Execute 消息时会产生日志并且会包括 Bind 参数的值(任何内嵌的单引号会被双写)。
@@ -4318,7 +4308,7 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
- 即使使用log_statement = all 设置,包含简单语法错误的语句也不会被记录。这是因为只有在完成基本语法解析并确定了语句类型之后才会发出日志消息。在扩展查询协议的情况下,在执行阶段之前(即在解析分析或规划期间)出错的语句也不会被记录。将log_min_error_statement 设置为ERROR (或更低)来记录这种语句。
+ 即使使用log_statement = all 设置,包含简单语法错误的语句也不会被记录。这是因为只有在完成基本语法解析并确定了语句类型之后才会发出日志消息。在扩展查询协议的情况下,在 Execute 阶段之前(即在解析分析或规划期间)出错的语句也不会被记录。将log_min_error_statement 设置为ERROR (或更低)来记录这种语句。
@@ -4355,7 +4345,7 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
控制临时文件名和大小的日志记录。
- 临时文件可以用于排序、哈希和临时查询结果。
+ 临时文件可以用于排序、hash 和临时查询结果。
每当删除临时文件时都会发出日志记录。
值为零时记录所有临时文件信息,而正值仅记录大小大于或等于指定千字节数的文件。
默认设置为-1,禁用此类日志记录。
@@ -4433,7 +4423,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 设置log_filename 和log_rotation_age 为你的日志文件提供一种一致的、可预测的命名空间。这让你预测文件名会是怎样以及知道什么时候一个个体日志文件完成并且因此准备好被导入。
+ 设置log_filename 和log_rotation_age ,为日志文件提供一致且可预测的命名方案。这样就能预测文件名,并知道单个日志文件何时已完成写入、可以导入。
@@ -4462,8 +4452,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
进程标题
- 这些设置控制服务器进程的进程标题如何修改。通常可以通过ps 等程序查看进程标题,
- 在 Windows 上则可以使用Process Explorer 。详情参见 。
+ 这些设置控制服务器进程的进程标题如何修改。通常可以通过ps 等程序查看进程标题,在 Windows 上则可以使用Process Explorer 。详情参见 。
@@ -4490,7 +4479,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 每次服务器接收到新的SQL命令时,都可以更新进程标题。
+ 启用后,每次服务器接收到新的 SQL 命令时都会更新进程标题。
在大多数平台上,默认情况下此设置为on ,但在Windows上默认为off ,
因为该平台更新进程标题的开销较大。
只有超级用户能更改这个设置。
@@ -4525,7 +4514,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
启用对每个会话当前执行命令的信息收集,包括命令开始执行的时间。
- 此参数默认为开启状态。请注意,即使启用了此信息,只有超级用户、具有
+ 此参数默认为开启状态。请注意,即使启用了此参数,只有超级用户、具有
pg_read_all_stats 角色权限的角色和拥有被报告会话的用户
(包括属于他们具有权限的角色的会话)才能看到此信息,因此不应构成安全风险。
只有超级用户能更改这个设置。
@@ -4541,7 +4530,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 为每个活动会话指定存储当前执行命令的文本所保留的字节数,它们被用于pg_stat_activity .query 域。
+ 为每个活动会话指定存储当前执行命令的文本所预留的字节数,它们被用于pg_stat_activity .query 字段。
默认值是 1024字节。这个参数只能在服务器启动时被设置。
@@ -4558,7 +4547,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
启用对数据库活动的统计信息收集。
- 此参数默认为开启,因为自动清理守护进程需要收集的信息。
+ 此参数默认为开启,因为自动清理守护进程需要这些收集到的信息。
只有超级用户能更改这个设置。
@@ -4572,7 +4561,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 启用数据库I/O调用的计时。 默认情况下,此参数处于关闭状态,因为它将重复查询操作系统的当前时间,这可能会在某些平台上造成显著的开销。 您可以使用 工具来测量系统上计时的开销。
+ 启用数据库I/O调用的计时。 默认情况下,此参数处于关闭状态,因为它将重复查询操作系统的当前时间,这可能会在某些平台上造成显著的开销。 你可以使用 工具来测量系统上计时的开销。
I/O计时信息显示在 中,也显示在使用BUFFERS 选项的 输出中,
并由 提供。只有超级用户能更改这个设置。
@@ -4589,7 +4578,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 启用函数调用次数和时间的跟踪。指定pl 以仅跟踪过程语言函数,
+ 启用函数调用次数和耗时的跟踪。指定pl 以仅跟踪过程语言函数,
all 以同时跟踪SQL和C语言函数。默认值为none ,
即禁用函数统计跟踪。只有超级用户能更改这个设置。
@@ -4649,7 +4638,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
对于每个查询,将各自模块的性能统计输出到服务器日志中。这是一个简单的性能分析工具,类似于Unix getrusage() 操作系统功能。
- log_statement_stats 报告总语句统计,而其他选项报告每个模块的统计信息。
+ log_statement_stats 报告整个语句的统计信息,而其他选项报告每个模块的统计信息。
log_statement_stats 不能与任何单独模块选项一起启用。所有这些选项默认情况下都是禁用的。
只有超级用户才能更改这些设置。
@@ -4665,7 +4654,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
自动清理
- autovacuum
+ 自动清理
配置参数
@@ -4705,10 +4694,10 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 每次由自动清理执行的操作都会被记录,如果运行时间至少达到指定毫秒数。将此设置为零会记录所有自动清理操作。
+ 当自动清理执行的操作运行时间至少达到指定毫秒数时,就会记录该操作。将此设置为零会记录所有自动清理操作。
负一(默认值)会禁用记录自动清理操作。
例如,如果将其设置为250ms ,则所有运行时间为250ms或更长的自动清理和分析都将被记录。
- 此外,当此参数设置为任何值而不是-1 时,如果由于冲突的锁定或同时删除的关系而跳过自动清理操作,则会记录消息。
+ 此外,当此参数设置为任何非-1 值时,如果由于冲突锁或关系被并发删除而跳过自动清理操作,则会记录消息。
启用此参数可帮助跟踪自动清理活动。
此参数只能在postgresql.conf 文件或服务器命令行中设置;但可以通过更改表存储参数来覆盖对单个表的设置。
@@ -4888,7 +4877,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
DEBUG1 、LOG 、NOTICE 、
WARNING 、ERROR 。
每个级别都包括其后的所有级别。级别越靠后,被发送的消息越少。默认值是NOTICE 。
- 注意LOG 在这里有与 中不同的排名。
+ 注意LOG 在这里的排序与 中的不同。
@@ -4906,11 +4895,11 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 这个变量指定当一个对象(表、数据类型、函数等)被用一个无模式限定的简单名称引用时,用于进行搜索该对象的模式顺序。当在不同模式中有同名对象时,将使用第一个在搜索路径中被找到的对象。一个不属于搜索路径中任何一个模式的对象只能通过用限定名(带点号)指定包含它的模式来引用。
+ 这个变量指定当一个对象(表、数据类型、函数等)被用一个无模式限定的简单名称引用时,搜索该对象时的模式顺序。当在不同模式中有同名对象时,将使用第一个在搜索路径中被找到的对象。一个不属于搜索路径中任何一个模式的对象只能通过用限定名(带点号)指定包含它的模式来引用。
- search_path 的值必需是一个逗号分隔的模式名列表。任何不是一个已有模式的名称,或者是一个用户不具有USAGE 权限的模式,将被安静地忽略。
+ search_path 的值必须是一个逗号分隔的模式名列表。任何不是一个已有模式的名称,或者是一个用户不具有USAGE 权限的模式,将被静默忽略。
@@ -4938,11 +4927,12 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 这个参数的缺省值是"$user", public 。这种设置支持一个数据库(其中没有用户拥有私有模式,并且所有人共享使用public )、每个用户私有模式及其组合的共享使用。其它效果可以通过全局或者针对每个用户修改默认搜索路径设置获得。
+ 这个参数的默认值是"$user", public 。这种设置支持共享使用数据库(用户没有私有模式,所有人共享使用public )、每个用户拥有私有模式,以及二者的组合。
+ 还可以通过全局或针对每个用户修改默认搜索路径设置来获得其他效果。
- 更多有关方案处理的信息,请参考 。特别地,只有当数据库只有一个用户或者有少数的相互信任的用户时,默认配置是合适的。
+ 更多有关模式处理的信息,请参考 。特别地,只有当数据库只有一个用户或者有少数的相互信任的用户时,默认配置是合适的。
@@ -4962,7 +4952,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 这个变量控制是否以抛出一个错误来代替应用一条行安全性策略。在设置为on 时,策略正常应用。在设置为off 时,只要有至少一条策略被应用则查询就会失败。默认为on 。受限的行可见性会导致不正确的结果时,可将其改成off 。例如,pg_dump 默认会做这种更改。这个变量对能绕过每一条行安全性策略的角色(即超级用户和具有BYPASSRLS )属性的角色没有效果。
+ 这个变量控制是否以抛出一个错误来代替应用一条行安全性策略。在设置为on 时,策略正常应用。在设置为off 时,原本会应用至少一条策略的查询就会失败。默认为on 。受限的行可见性可能导致不正确的结果时,可将其改成off 。例如,pg_dump 默认会做这种更改。这个变量对能绕过每一条行安全性策略的角色(即超级用户和具有BYPASSRLS 属性的角色)没有效果。
@@ -4984,7 +4974,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 该值要么是一个表空间的名字,要么是一个指定使用当前数据库默认表空间的空字符串。如果该值和任何现有表空间的名字都不匹配,PostgreSQL 将自动使用当前数据库的默认表空间。如果指定了一个非默认的表空间,用户必须对它有CREATE 权限,否则创建企图将失败。
+ 该值要么是一个表空间的名字,要么是一个指定使用当前数据库默认表空间的空字符串。如果该值和任何现有表空间的名字都不匹配,PostgreSQL 将自动使用当前数据库的默认表空间。如果指定了一个非默认的表空间,用户必须对它有CREATE 权限,否则创建尝试将失败。
@@ -4992,7 +4982,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 当创建数据库时也会使用这个变量。默认情况下,一个新数据库会从它的模板数据库继承其表空间设置。
+ 创建数据库时也不会使用这个变量。默认情况下,一个新数据库会从它的模板数据库继承其表空间设置。
@@ -5016,11 +5006,11 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 该值是一个表空间名字的列表。当列表中有多于一个名称时,每次一个临时对象被创建时PostgreSQL 随机选择列表中的一个成员。例外是在一个事务中,连续创建的临时对象被放置在里表中的连续表空间中。如果列表被选中元素是一个空字符串,PostgreSQL 将自动使用当前数据库的默认表空间。
+ 该值是一个表空间名字的列表。当列表中有多于一个名称时,每次一个临时对象被创建时PostgreSQL 随机选择列表中的一个成员。例外是在一个事务中,连续创建的临时对象被依次放置在列表中的连续表空间中。如果列表中被选中的元素是一个空字符串,PostgreSQL 将自动使用当前数据库的默认表空间。
- 当temp_tablespaces 被交互式地设置时,指定一个不存在的表空间是一种错误,类似于为用户指定一个不具有CREATE 权限的表空间。不过,当使用一个之前设置的值时,不存在的表空间会被忽略,就像用户缺少CREATE 权限的表空间一样。特殊地,使用一个在postgresql.conf 中设置的值时,这条规则起效。
+ 当temp_tablespaces 被交互式地设置时,指定一个不存在的表空间是一种错误,指定一个用户不具有CREATE 权限的表空间也同样是错误。不过,当使用一个之前设置的值时,不存在的表空间会被忽略,就像用户缺少CREATE 权限的表空间一样。特别是,使用一个在postgresql.conf 中设置的值时,这条规则起效。
@@ -5043,7 +5033,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
这个参数通常为打开。
当设置为off 时,它禁用 期间对函数体字符串的验证。
- 禁用验证避免了验证处理的副作用,特别避免了如向前引用导致的伪肯定。
+ 禁用验证避免了验证处理的副作用,也避免前向引用等问题导致的误报。
在代表其他用户载入函数之前设置这个参数为off ;pg_dump 会自动这样做。
@@ -5086,7 +5076,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 一个只读的 SQL 事务不能修改非临时表。这个参数控制每个新事务的默认只读状态 。默认是off (读/写)。
+ 一个只读的 SQL 事务不能修改非临时表。这个参数控制每个新事务的默认只读状态。默认是off (读/写)。
@@ -5107,11 +5097,11 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 当运行在serializable 隔离级别时,一个可延迟只读 SQL 事务可以在它被允许继续之前延迟一段时间。但是,一旦它开始执行就不会产生任何用来保证可串行化性的负荷;因此串行化代码将没有任何理由因为并发更新而强制它中断,使得这个选项适合于长时间运行的只读事务。
+ 当运行在serializable 隔离级别时,一个可延迟只读 SQL 事务可能在获准继续之前被延迟一段时间。但是,一旦它开始执行就不会产生任何用来保证可串行化性的开销;因此串行化代码将没有任何理由因为并发更新而强制它中止,使得这个选项适合于长时间运行的只读事务。
- 这个参数控制每个新事务的默认可延迟状态。目前它对读写事务或者那些操作在低于serializable 隔离级别上的事务无效。默认值是off 。
+ 这个参数控制每个新事务的默认可延迟状态。目前它对读写事务或者那些运行在低于serializable 隔离级别上的事务无效。默认值是off 。
@@ -5155,7 +5145,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
此参数反映当前事务的只读状态。
在每个事务的开始,它被设置为 的当前值。
- 任何后续尝试更改它的都等同于 命令。
+ 任何后续更改它的尝试都等同于 命令。
@@ -5175,7 +5165,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
此参数反映当前事务的可延迟性状态。
在每个事务的开始,它被设置为 的当前值。
- 任何后续尝试更改它的都等同于 命令。
+ 任何后续更改它的尝试都等同于 命令。
@@ -5189,16 +5179,13 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 控制当前会话中复制相关触发器和规则的触发。
- 可能的值是origin (默认值),
- replica 和local 。
- 设置此参数会导致丢弃先前缓存的任何查询计划。
- 只有超级用户能更改这个设置。
+ 控制当前会话中复制相关触发器和规则的触发。设置此变量需要超级用户权限,并会丢弃任何先前缓存的查询计划。
+ 可用值为origin (默认值)、replica 和local 。
这个设置的预期用途是由逻辑复制系统在应用所复制的更改时将它设置为replica 。
- 其效果将是触发器和规则(没有对其默认配置做修改)在复制机上将不会被触发。
+ 其效果将是触发器和规则(没有对其默认配置做修改)在副本上将不会被触发。
更多信息请参考 的子句ENABLE TRIGGER 以及ENABLE RULE 。
@@ -5245,7 +5232,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 与statement_timeout 不同,这个超时只在等待锁时发生。注意如果statement_timeout 为非零,设置lock_timeout 为相同或更大的值没有意义,因为事务超时将总是第一个被触发。
+ 与statement_timeout 不同,这个超时只在等待锁时发生。注意如果statement_timeout 为非零,设置lock_timeout 为相同或更大的值没有意义,因为语句超时将总是第一个被触发。
如果log_min_error_statement 被设置为ERROR 或更低,超时的语句将被记录。
@@ -5279,8 +5266,9 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
+
- 当表的pg_class .relfrozenxid 字段达到该设置指定的年龄时,VACUUM 会执行激进扫描。激进扫描与常规VACUUM 不同,它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不仅仅是那些可能包含死元组的页面。默认值是 1.5 亿个事务。尽管用户可以将该值设置为 0 到 20 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过 的 95%,从而在触发防回卷 autovacuum 之前仍有机会执行一次常规手工VACUUM 。更多信息请参见 。
+ 如果表的pg_class .relfrozenxid 字段达到此设置指定的年龄,VACUUM 就会执行一次激进扫描。激进扫描与常规VACUUM 不同,它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不仅仅是那些可能包含死元组的页面。默认值为 1.5 亿个事务。尽管用户可以将该值设置在 0 到 20 亿之间,VACUUM 仍会悄悄将其有效值限制为不超过 的 95%,以便在针对该表启动防回卷自动清理之前,周期性手工VACUUM 仍有机会运行。详见 。
@@ -5293,7 +5281,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 指定VACUUM 在扫描表时用来决定是否冻结行版本的切断年龄(以事务计)。默认值是 5000 万个事务。尽管用户可以将该值设置为 0 到 10 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过 的一半,这样强制 autovacuum 之间就不会间隔过短。更多信息请参见 。
+ 指定VACUUM 在扫描表时用来决定是否冻结行版本的截止年龄(以事务计)。默认值是 5000 万个事务。尽管用户可以将该值设置为 0 到 10 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过 的一半,这样强制 autovacuum 之间就不会间隔过短。更多信息请参见 。
@@ -5305,8 +5293,9 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
+
- 当表的pg_class .relminmxid 字段达到该设置指定的年龄时,VACUUM 会执行激进扫描。激进扫描与常规VACUUM 不同,它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不是只扫描那些可能包含死元组的页面。默认值是 1.5 亿个多事务。尽管用户可以将该值设置为 0 到 20 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过 的 95%,从而在触发防回卷 autovacuum 之前仍有机会执行一次常规手工VACUUM 。更多信息请参见 。
+ 如果表的pg_class .relminmxid 字段达到此设置指定的年龄,VACUUM 就会执行一次激进扫描。激进扫描与常规VACUUM 不同,它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不仅仅是那些可能包含死元组的页面。默认值为 1.5 亿个多事务。尽管用户可以将该值设置在 0 到 20 亿之间,VACUUM 仍会悄悄将其有效值限制为不超过 的 95%,以便在针对该表启动防回卷清理之前,周期性手工VACUUM 仍有机会运行。详见 。
@@ -5319,7 +5308,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 指定VACUUM 在扫描表时用来决定是否将多事务 ID 替换为较新的事务 ID 或多事务 ID 的切断年龄(以多事务计)。默认值是 500 万个多事务。尽管用户可以将该值设置为 0 到 10 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过 的一半,这样强制 autovacuum 之间就不会间隔过短。更多信息请参见 。
+ 指定VACUUM 在扫描表时用来决定是否将多事务 ID 替换为较新的事务 ID 或多事务 ID 的截止年龄(以多事务计)。默认值是 500 万个多事务。尽管用户可以将该值设置为 0 到 10 亿之间的任意值,VACUUM 会悄悄将有效值限制为不超过 的一半,这样强制 autovacuum 之间就不会间隔过短。更多信息请参见 。
@@ -5382,7 +5371,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 这里的实际选择都是根据爱好做出的,只受客户端应用中可能存在的限制的约束。两种方法都支持所有可能的值,尽管十六进制编码将比 base64 编码更大。
+ 这里的实际选择主要取决于偏好,只受客户端应用中可能存在的限制的约束。两种方法都支持所有可能的值,尽管十六进制编码会比 base64 编码略大。
@@ -5403,7 +5392,8 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
- 当在XML和字符串值之间进行转换时,无论设置DOCUMENT或 CONTENT都是隐式的。可参阅Section 8.13。 有效值是DOCUMENT和CONTENT。 缺省值是CONTENT。当在 XML 和字符串值之间进行转换时,设置DOCUMENT 或CONTENT 都是隐式的。详见 。有效值是DOCUMENT 和CONTENT 。默认值是CONTENT 。
+ 设置在 XML 与字符串值之间进行转换时,隐含采用DOCUMENT 还是CONTENT 。
+ 有关说明参见 。有效值是DOCUMENT 和CONTENT 。默认值是CONTENT 。
@@ -5435,7 +5425,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 区域和格式化
+ 区域设置和格式化
@@ -5449,7 +5439,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 设置日期和时间值的显示格式,以及解释有歧义的日期输入值的规则。由于历史原因, 这个变量包含两个独立的部分:输出格式声明(ISO 、Postgres 、SQL 或German )、 输入/输出的年/月/日顺序(DMY 、MDY 或YMD )。这些可以被独立设置或者一起设置。关键字Euro 和European 是DMY 的同义词;关键字US 、NonEuro 和NonEuropean 是MDY 的同义词。详见 。内置默认值是ISO, MDY ,但是initdb 将用对应于选中的lc_time 区域行为的设置初始化配置文件。
+ 设置日期和时间值的显示格式,以及解释有歧义的日期输入值的规则。由于历史原因, 这个变量包含两个独立的部分:输出格式声明(ISO 、Postgres 、SQL 或German )、 输入/输出的年/月/日顺序(DMY 、MDY 或YMD )。这些可以被独立设置或者一起设置。关键字Euro 和European 是DMY 的同义词;关键字US 、NonEuro 和NonEuropean 是MDY 的同义词。详见 。内置默认值是ISO, MDY ,但是initdb 将用对应于选中的lc_time 区域设置行为的设置初始化配置文件。
@@ -5462,10 +5452,13 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 设置间隔值的显示格式。值sql_standard 将产生匹配SQL 标准间隔文本的输出。当 参数被设置为ISO 时,值postgres (默认)将产生匹配PostgreSQL 发行 8.4 之前的输出。当DateStyle 参数被设置为非ISO 输出时,值postgres_verbose 会产生匹配PostgreSQL 发行 8.4 之前的输出。值iso_8601 会产生匹配在 ISO 8601 的 4.4.3.2 节中定义的带标志符格式
的时间间隔的输出。
+ 设置时间间隔值的显示格式。值sql_standard 会生成符合SQL 标准时间间隔字面量的输出。
+ 值postgres (默认值)的输出与PostgreSQL 8.4 之前版本中 设为ISO 时的输出一致。
+ 值postgres_verbose 的输出与PostgreSQL 8.4 之前版本中DateStyle 设为非ISO 输出时的输出一致。
+ 值iso_8601 会生成符合 ISO 8601 第 4.4.3.2 节定义的时间间隔带标志符格式
的输出。
- IntervalStyle 参数也可以影响对有歧义的间隔输入的解释。详见 。
+ IntervalStyle 参数也会影响对有歧义的时间间隔输入的解释。详见 。
@@ -5555,11 +5548,11 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 在一些系统上,这个区域分类并不存在。仍然可以设置这个变量,只是不会有任何效果。同样,所期望语言的翻译消息也可能不存在。在这种情况下,你将仍然继续看到英文消息。
+ 在一些系统上,这个区域设置类别并不存在。仍然可以设置这个变量,只是不会有任何效果。同样,所期望语言的翻译消息也可能不存在。在这种情况下,你将仍然继续看到英文消息。
- 只有超级用户能更改这个设置。
+ 只有超级用户能更改这个设置,因为它会同时影响发送到服务器日志和客户端的消息,设置不当可能降低服务器日志的可读性。
@@ -5574,7 +5567,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 设置用于格式化货币量的区域,例如用to_char 函数族。可接受的值是系统相关的;详见 。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
+ 设置用于格式化货币量的区域设置,例如用to_char 函数族。可接受的值是系统相关的;详见 。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
@@ -5589,7 +5582,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 设置用于格式化数字的区域,例如用to_char 函数族。可接受的值是系统相关的;详见 。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
+ 设置用于格式化数字的区域设置,例如用to_char 函数族。可接受的值是系统相关的;详见 。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
@@ -5604,7 +5597,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 设置用于格式化日期和时间的区域,例如用to_char 函数族。可接受的值是系统相关的;详见 。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
+ 设置用于格式化日期和时间的区域设置,例如用to_char 函数族。可接受的值是系统相关的;详见 。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
@@ -5619,7 +5612,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 选择被那些没有显式参数指定配置的文本搜索函数变体使用的文本搜索配置。详见 。内置默认值是pg_catalog.simple ,但是如果能够标识一个匹配区域的配置,initdb 将用对应于选中的lc_ctype 区域的设置初始化配置文件。
+ 选择被那些没有显式参数指定配置的文本检索函数变体使用的文本检索配置。详见 。内置默认值是pg_catalog.simple ,但是如果能够标识一个匹配该区域设置的配置,initdb 将用对应于选中的lc_ctype 区域设置的值初始化配置文件。
@@ -5633,7 +5626,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
为了载入附加的功能或者达到提高性能的目的,可用多个设置来预先载入共享库到服务器中。
- 例如'$libdir/mylib' 设置可能会导致mylib.so (或者某些平台上的mylib.sl )从安装的标准库目录被预装载。这些设置之间的区别在于生效的时间以及改变它们所需的权限。
+ 例如'$libdir/mylib' 设置会使mylib.so (或者某些平台上的mylib.sl )从安装的标准库目录被预装载。这些设置之间的区别在于生效的时间以及改变它们所需的权限。
@@ -5642,12 +5635,12 @@ SET XML OPTION { DOCUMENT | CONTENT };
只有特别为与PostgreSQL一起使用设计的共享库才能以这种方式载入。每一个PostgreSQL支持
- 的库都有一个魔法块
,它会被检查以保证兼容性。由于这个原因,非PostgreSQL无法
+ 的库都有一个魔法块
,它会被检查以保证兼容性。由于这个原因,非 PostgreSQL 库无法
以这种方式被载入。你可能可以使用操作系统的工具(如LD_PRELOAD )载入它。
- 总之,请参考特定模块的文档来用推荐的方法载入它。
+ 一般来说,请参考特定模块的文档来用推荐的方法载入它。
@@ -5679,9 +5672,8 @@ SET XML OPTION { DOCUMENT | CONTENT };
- 这个特性的目的是允许非特权用户在特定的会话中载入正在调试的或者性能度量库,
- 而无需一个显式的LOAD 命令。为了这个目的,通常通过使用客
- 户端的PGOPTIONS 环境变量或者
+ 这个特性的目的是允许非特权用户在特定的会话中载入用于调试或性能测量的库,
+ 而无需一个显式的LOAD 命令。为了这个目的,通常通过使用客户端的PGOPTIONS 环境变量或者
ALTER ROLE SET 来设置这个参数。
@@ -5718,7 +5710,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
和 不同,相对于在库被第一次使用
- 时载入它,在会话开始时载入库并没有什么性能优势。不过,当使用连接池时这样做还是有一些
+ 时载入它,在会话开始时载入库并没有明显的性能优势。不过,当使用连接池时这样做还是有一些
优势。
@@ -5756,9 +5748,9 @@ SET XML OPTION { DOCUMENT | CONTENT };
在 Windows 主机上,在服务器启动时预载入一个库并不会减少启动每个新服务器进程所需的
- 时间;每一个服务器进程将会重新载入预载入的库。不过,对于那些要在postmaster启动时
+ 时间;每一个服务器进程将会重新载入所有预载入的库。不过,对于那些要在postmaster启动时
执行操作的库来说,Windows 主机上的
- shared_preload_libraries 任然有用。
+ shared_preload_libraries 仍然有用。
@@ -5832,7 +5824,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- GIN 索引返回的集合尺寸的软上限。详见 。
+ GIN 索引扫描返回的集合尺寸的软上限。详见 。
@@ -5862,17 +5854,17 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 这是在锁上等待的毫秒数,然后再检查是否存在死锁条件。检查死锁相对昂贵,因此服务器不会每次等待锁时都运行它。
+ 指定在检查是否发生死锁之前等待锁的毫秒数。检查死锁相对昂贵,因此服务器不会每次等待锁时都运行它。
我们乐观地假设在生产应用程序中死锁并不常见,所以在检查死锁之前只是等待一段时间。
增加此值会减少在不必要的死锁检查中浪费的时间,但会减慢实际死锁错误的报告速度。
- 默认值为一秒(1s ),这可能是您在实践中想要的最小值。
- 在负载较重的服务器上,您可能希望提高它。
- 理想情况下,设置应超过您的典型事务时间,以提高在等待者决定检查死锁之前释放锁的几率。
+ 默认值为一秒(1s ),这可能是你在实践中想要的最小值。
+ 在负载较重的服务器上,你可能希望提高它。
+ 理想情况下,设置应超过你的典型事务时间,以提高在等待者决定检查死锁之前释放锁的几率。
只有超级用户能更改这个设置。
- 当 被设置时,这个参数还可以决定发出关于锁等待的日志之前等待的时间量。如果你想调查锁延迟,你可能希望设置一个比正常的deadlock_timeout 小的值。
+ 当 被设置时,这个参数也决定发出关于锁等待的日志之前等待的时间量。如果你想调查锁延迟,你可能希望设置一个比正常的deadlock_timeout 小的值。
@@ -5923,7 +5915,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 这个参数控制在谓词锁被提升为覆盖整个关系之前,该谓词锁能够在单个关系上锁住多少页面或元组。大于等于零的值表示一种绝对限制,而负值表示用 除以这个设置的绝对值。默认值为-2,它将保持以往版本的PostgreSQL 中的行为。这个参数只能在postgresql.conf 文件中或者服务器命令行上设置。
+ 这个参数控制在谓词锁被提升为覆盖整个关系之前,可以对单个关系中的多少页面或元组加谓词锁。大于等于零的值表示一种绝对限制,而负值表示用 除以这个设置的绝对值。默认值为-2,它将保持以往版本的PostgreSQL 中的行为。这个参数只能在postgresql.conf 文件中或者服务器命令行上设置。
@@ -5938,7 +5930,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 这个参数控制在谓词锁被提升为覆盖整个页面之前,该谓词锁能在单一页面上锁住多少行。默认值是2。这个参数只能在postgresql.conf 文件中或者服务器命令行上设置。
+ 这个参数控制在谓词锁被提升为覆盖整个页面之前,可以对单个页面中的多少行加谓词锁。默认值是2。这个参数只能在postgresql.conf 文件中或者服务器命令行上设置。
@@ -5964,7 +5956,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 这个参数控制数组输入解析器是否把未用引号的NULL 识别为一个空数组元素。默认为on ,允许输入包含空值的数组值。但是PostgreSQL 8.2 之前的版本不支持数组中的空值,并且因此将把NULL 当作指定一个值为字符串NULL
的正常数组元素。对于那些要求旧行为的应用的向后兼容性,这个变量可以被设置为off 。
+ 这个参数控制数组输入解析器是否把未用引号的NULL 识别为一个值为空值的数组元素。默认为on ,允许输入包含空值的数组值。但是PostgreSQL 8.2 之前的版本不支持数组中的空值,并且因此将把NULL 当作指定一个值为字符串NULL
的正常数组元素。为了向后兼容那些要求旧行为的应用,这个变量可以被设置为off 。
@@ -5982,11 +5974,11 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 这个参数控制字符串文本中的单引号是否能够用\' 来表示。首选的 SQL 标准的方法是将其双写('' ),但是PostgreSQL 在历史上也接受\' 。不过使用\' 容易导致安全风险,因为在某些客户端字符集编码中,有多字节字符的最后一个字节在数值上等价于 ASCII 的\ 。如果客户端代码没有做到正确转义,那么将会导致 SQL 注入攻击。如果服务器拒绝看起来带有被反斜线转义的单引号的查询,那么就可以避免这种风险。backslash_quote 的可用值是on (总是允许\' )、off (总是拒绝)以及safe_encoding (只有客户端编码不允许在多字节字符中存在 ASCII \ 时允许)。safe_encoding 是默认设置。
+ 这个参数控制字符串字面量中的单引号是否能够用\' 来表示。首选的 SQL 标准的方法是将其双写('' ),但是PostgreSQL 在历史上也接受\' 。不过使用\' 容易导致安全风险,因为在某些客户端字符集编码中,有多字节字符的最后一个字节在数值上等价于 ASCII 的\ 。如果客户端代码没有做到正确转义,那么就可能遭到 SQL 注入攻击。如果服务器拒绝看起来带有被反斜线转义的单引号的查询,那么就可以避免这种风险。backslash_quote 的可用值是on (总是允许\' )、off (总是拒绝)以及safe_encoding (只有客户端编码不允许在多字节字符中存在 ASCII \ 时允许)。safe_encoding 是默认设置。
- 注意在符合标准的字符串文本中,\ 就表示\ 。这个参数只影响不符合标准的文本的处理,包括转义字符串语法(E'...' )。
+ 注意在符合标准的字符串字面量中,\ 就表示\ 。这个参数只影响不符合标准的字面量的处理,包括转义字符串语法(E'...' )。
@@ -6024,11 +6016,11 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 打开时,如果在普通字符串文本中('...' 语法)出现了 一个反斜线(\ )并且standard_conforming_strings 为关闭,那么就会发出一个警告。默认值是on 。
+ 打开时,如果在普通字符串字面量中('...' 语法)出现了 一个反斜线(\ )并且standard_conforming_strings 为关闭,那么就会发出一个警告。默认值是on 。
- 希望使用反斜线作为转义符的应用应该被修改来使用转义字符串语法(E'...' ),因为在 SQL 标准中普通字符串的默认行为是将反斜线视作一个普通字符。这个变量可以被启用来帮助定位需要被更改的代码。
+ 希望使用反斜线作为转义符的应用应该被修改来使用转义字符串语法(E'...' ),因为按照 SQL 标准,普通字符串现在默认将反斜线视作一个普通字符。这个变量可以被启用来帮助定位需要被更改的代码。
@@ -6049,7 +6041,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 设置这个参数不会禁用所有与大对象相关的安全检查 — 除了那些在PostgreSQL 9.0中已经修改了的默认行为。
+ 设置此变量不会禁用所有与大对象相关的安全检查 — 只禁用那些在PostgreSQL 9.0 中默认行为发生变化的检查。
@@ -6091,7 +6083,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
standard_conforming_strings (boolean )
- 字符串 标准符合
+ 字符串 符合标准
standard_conforming_strings 配置参数
@@ -6099,7 +6091,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 控制普通字符串文本('...' )是否按照 SQL 标准把反斜线当普通文本。从PostgreSQL 9.1 开始,默认值为on (之前的发行中默认值为off )。应用可以检查这个参数来判断字符串文本如何被处理。这个参数的存在也可以被当做转义字符串语法(E'...' )被支持的标志。如果一个应用希望反斜线被当做转义字符,应该使用转义字符串语法( )。
+ 控制普通字符串字面量('...' )是否按照 SQL 标准把反斜线当普通文本。从PostgreSQL 9.1 开始,默认值为on (之前的发行中默认值为off )。应用可以检查这个参数来判断字符串字面量如何被处理。这个参数的存在也可以被当做转义字符串语法(E'...' )被支持的标志。如果一个应用希望反斜线被当做转义字符,应该使用转义字符串语法( )。
@@ -6114,7 +6106,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 它允许对大型表的顺序扫描与其他扫描同步,因此并发扫描可以在几乎相同的时刻读取相同的块,这样可以分担 I/O 负载。当启用这个参数时,一个扫描可能会从表的中间开始并且之后绕回
到开头以覆盖所有的行,这样可以与已在进行中的扫描活动同步。对于没有ORDER BY 子句的查询来,这样的扫描会在返回行的顺序中造成不可预料的改变。将这个参数设置为off 以保证 8.3 之前的行为(顺序扫描总是从表的起始处开始)。默认值是on 。
+ 它允许对大型表的顺序扫描与其他扫描同步,因此并发扫描可以在几乎相同的时刻读取相同的块,这样可以分担 I/O 负载。当启用这个参数时,一个扫描可能会从表的中间开始并且之后绕回
到开头以覆盖所有的行,这样可以与已在进行中的扫描活动同步。对于没有ORDER BY 子句的查询,这样的扫描可能会在返回行的顺序中造成不可预料的改变。将这个参数设置为off 以保证 8.3 之前的行为(顺序扫描总是从表的起始处开始)。默认值是on 。
@@ -6137,15 +6129,15 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 当打开时,形为expr = NULL (或NULL = expr )的表达式将被当做expr IS NULL , 也就是说,如果expr 得出空值值则返回真,否则返回假。正确的 SQL 标准兼容的expr = NULL 行为总是返回空(未知)。因此这个参数默认为off 。
+ 当打开时,形为expr = NULL (或NULL = expr )的表达式将被当做expr IS NULL , 也就是说,如果expr 计算结果为空值则返回真,否则返回假。正确的 SQL 标准兼容的expr = NULL 行为总是返回空值(未知)。因此这个参数默认为off 。
- 不过,在Microsoft Access 里的过滤表单生成的查询似乎使用expr = NULL 来测试空值,因此,如果你使用这个接口访问数据库,你可能想把这个选项打开。因为expr = NULL 形式的表达式总是返回空值(使用 SQL 标准解释)。它们不是非常有用并且在普通应用中也不常见,在应用中也不常见,因此这个选项实际上没有什么危害。但是新用户常常对涉及 空值的表达式的语义上感到困惑,因此这个选项默认为关闭。
+ 不过,在Microsoft Access 里的过滤表单生成的查询似乎使用expr = NULL 来测试空值,因此,如果你使用这个接口访问数据库,你可能想把这个选项打开。因为expr = NULL 形式的表达式总是返回空值(使用 SQL 标准解释),它们不是非常有用并且在普通应用中也不常见,因此这个选项实际上没有什么危害。但是新用户常常对涉及空值的表达式语义感到困惑,因此这个选项默认为关闭。
- 请注意这个选项只影响= NULL 形式,而不影响其它比较操作符或者其它与一些涉及等值操作符的表达式在计算上等效的其他表达式(例如IN )。因此,这个选项不是劣质程序的一般修复。
+ 请注意这个选项只影响= NULL 形式,而不影响其它比较操作符或者其它与一些涉及等值操作符的表达式在计算上等效的其他表达式(例如IN )。因此,这个选项不能普遍修复错误的程序写法。
@@ -6202,15 +6194,15 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 如果设置为false(默认值),PostgreSQL 在将修改的数据文件刷新到文件系统失败时,将引发PANIC级错误。
+ 如果设置为false(默认值),PostgreSQL 在将修改后的数据文件刷盘到文件系统失败时,将引发PANIC级错误。
这样会导致数据库服务器崩溃。这个参数只能在服务器启动时被设置。
在某些操作系统上,回写失败后,内核页面缓存中的数据状态未知。 在某些情况下,它可能已被完全遗忘,因此重试不安全;第二次尝试可能报告为成功,而事实上数据已丢失。在此类情形下,避免数据丢失的唯一方法是在报告任何故障后从WAL中恢复,最好是在调查了故障的根本原因并更换了任何有故障的硬件之后。
- 如果设置为true,PostgreSQL 将报告错误,但会继续运行,以便可以在以后的检查点中重试数据刷新操作。
- 仅在调查操作系统假如回写失败时对缓冲数据的处理方式的情况下,才将其设置为true。
+ 如果设置为true,PostgreSQL 将报告错误,但会继续运行,以便可以在以后的检查点中重试数据刷盘操作。
+ 只有在调查清楚操作系统在回写失败时如何处理缓冲数据之后,才应将其设置为true。
@@ -6223,11 +6215,10 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
预置选项
- 下列参数
是只读的。
- 同样,它们被排除在postgresql.conf 文件示例之外。
- 这些选项报告特定应用可能感兴趣的多种PostgreSQL 行为,特别是管理前端相关的行为。
- 所有这些都是在PostgreSQL 被编译或者它被安装时决定的。
-
+ 下列参数
是只读的,在编译或安装 PostgreSQL 时确定。
+ 因此,它们未列入示例 postgresql.conf 文件。
+ 这些选项报告 PostgreSQL 行为的各个方面,某些应用(特别是管理前端)可能对此感兴趣。
+
@@ -6256,7 +6247,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告对这个集簇是否启用了数据校验码。详见 。
+ 报告对这个集簇是否启用了数据校验和。详见 。
@@ -6269,7 +6260,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 在Unix系统上,这个参数报告启动时的数据目录(由 定义)的权限。
+ 在 Unix 系统上,这个参数报告服务器启动时数据目录(由 定义)的权限。
(在Microsoft Windows上这个参数将总是显示0700 。)
更多信息请参考 。
@@ -6305,7 +6296,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告PostgreSQL 是否在编译时打开了 64 位整数日期和时间。从PostgreSQL 10起,这个值总是on 。
+ 报告PostgreSQL 是否在编译时启用了对 64 位整数日期和时间的支持。从PostgreSQL 10起,这个值总是on 。
@@ -6352,7 +6343,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告函数参数的最大数量。它由编译服务器时的FUNC_MAX_ARGS 值决定的。默认值是 100 个参数。
+ 报告函数参数的最大数量。它由编译服务器时的FUNC_MAX_ARGS 值决定。默认值是 100 个参数。
@@ -6367,7 +6358,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告标识符的最大长度。它由编译服务器时的NAMEDATALEN 值减一决定。NAMEDATALEN 的默认值是 64 ;因此max_identifier_length 的默认值是 63,但是在使用多字节编码时可以少于 63 个字符。
+ 报告标识符的最大长度。它由编译服务器时的NAMEDATALEN 值减一决定。NAMEDATALEN 的默认值是 64;因此max_identifier_length 的默认值是 63 字节,在使用多字节编码时,这可能不足 63 个字符。
@@ -6428,7 +6419,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告服务器版本数值。它是由编译服务器时的PG_VERSION 值决定的。
+ 报告服务器的版本号。它是由编译服务器时的PG_VERSION 值决定的。
@@ -6443,7 +6434,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 报告服务器版本数值的整数值。它是由编译服务器时的PG_VERSION_NUM 值决定的。
+ 以整数形式报告服务器的版本号。它是由编译服务器时的PG_VERSION_NUM 值决定的。
@@ -6486,11 +6477,11 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
自定义选项
- 这个特性被设计用来由附加模块向PostgreSQL 添加通常不为系统知道的参数(例如过程语言)。这允许使用标准方法配置扩展模块。
+ 这个特性允许附加模块(例如过程语言)向PostgreSQL 添加系统通常不认识的参数。这样便能以标准方式配置扩展模块。
- 自定义选项有两部分名称:一个扩展名,然后是一个句点,再然后是正确的参数名,就像 SQL 中的合格名称。一个示例是plpgsql.variable_conflict 。
+ 自定义选项的名称由两部分组成:扩展名称和参数名本身,中间用句点分隔,类似于 SQL 中的限定名。例如plpgsql.variable_conflict 。
@@ -6498,7 +6489,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
PostgreSQL 将接受任何两部分参数名称的设置。
这些变量被视为占位符,在定义它们的模块加载之前没有任何功能。
当加载扩展模块时,它将添加其变量定义并根据这些定义转换任何占位符值。
- 如果存在以其扩展名开头的任何未识别的占位符,将发出警告并删除这些占位符。
+ 如果存在以其扩展名称开头的任何未识别的占位符,将发出警告。
@@ -6522,7 +6513,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 允许将表空间创建为pg_tblspc 内的目录,当CREATE TABLESPACE 命令提供空位置字符串时。
+ 当向CREATE TABLESPACE 命令提供空的位置字符串时,允许将表空间创建为pg_tblspc 内的目录。
这旨在允许测试主库和备库在同一台机器上运行的复制场景。这样的目录可能会混淆备份工具,因为这些工具期望在该位置只找到符号链接。
只有超级用户能更改这个设置。
@@ -6553,7 +6544,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 读取系统表时忽略系统索引(但是修改系统表时依然同时更新索引)。这在从被破坏的系统索引中恢复数据的时有用。这个参数在会话开始之后不能被更改。
+ 读取系统表时忽略系统索引(但是修改系统表时依然同时更新索引)。这在从被破坏的系统索引中恢复数据时有用。这个参数在会话开始之后不能被更改。
@@ -6598,7 +6589,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 为LISTEN 和NOTIFY 命令生成大量调试输出。 和 必须是DEBUG1 或者更低才能把这种输出分别发送到客户端或者服务器日志。
+ 为LISTEN 和NOTIFY 命令生成大量调试输出。 或 必须是DEBUG1 或者更低才能把这种输出分别发送到客户端或者服务器日志。
@@ -6633,7 +6624,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 如果打开,发出在排序操作中的资源使用的相关信息。只有在编译PostgreSQL 时定义了TRACE_SORT 宏, 这个参数才可用(不过,当前在默认情况下就定义了TRACE_SORT )。
+ 如果开启,输出排序操作中的资源使用信息。只有在编译PostgreSQL 时定义了TRACE_SORT 宏, 这个参数才可用(不过,当前在默认情况下就定义了TRACE_SORT )。
@@ -6648,7 +6639,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
- 如果开启,发出锁使用情况的信息。被转储信息中包括锁操作的类型、锁的类型和 被锁或被解锁对象的唯一标识符。同样包括的还有已经授予这个对象的锁类型的位掩码和 等待这个对象的锁类型的位掩码。对每一种锁类型,已授权锁和等待锁的计数也会被一起转储。一个日志文件输出的示例如下:
+ 如果开启,发出锁使用情况的信息。被转储信息中包括锁操作的类型、锁的类型和 被锁或被解锁对象的唯一标识符。同样包括的还有已经授予这个对象的锁类型的位掩码和 等待这个对象的锁类型的位掩码。还会转储每种锁类型已授予的锁数、等待的锁数,以及它们的总数。一个日志文件输出的示例如下:
LOG: LockAcquire: new: lock(0xb7acd844) id(24688,24696,0,0,0,1)
grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0
@@ -6720,7 +6711,7 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
- 如果设置,不会跟踪小于这个 OID 的锁(用于避免在系统表上的输出)。
+ 如果设置,不会跟踪 OID 小于此值的表上的锁(用于避免在系统表上的输出)。
@@ -6794,7 +6785,7 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
- 这个参数被设计用来检查WAL重做例程中的缺陷。当这个参数被启用时,被修改的任何缓冲区的整页镜像及其WAL记录都被加入到记录中。如果该记录后来被重放,系统将首先应用每个记录然后测试该记录修改的缓冲区是否符合存储的镜像。在某些情况下(例如提示位),小的变动是可以接受的,并且会被忽略。任何预期之外的差别都将导致致命错误,最后中止恢复。
+ 这个参数被设计用来检查WAL重做例程中的缺陷。当这个参数被启用时,与该 WAL 记录相关的所有已修改缓冲区的整页镜像都会被添加到该记录中。如果该记录后来被重放,系统将首先应用每个记录然后测试该记录修改的缓冲区是否符合存储的镜像。在某些情况下(例如提示位),小的变动是可以接受的,并且会被忽略。任何预期之外的差别都将导致致命错误,最后中止恢复。
@@ -6837,11 +6828,11 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
在读取过程中检测到校验和失败通常会导致PostgreSQL 报告错误,中止当前事务。
- 将ignore_checksum_failure 设置为on会导致系统忽略失败(但仍然报告警告),并继续处理。
- 这种行为可能导致崩溃,传播或隐藏损坏,或其他严重问题 。然而,它可能允许您跳过错误,
- 并检索可能仍然存在于表中的未损坏的元组,如果块头仍然正常。如果头部损坏,即使启用此选项也会报告错误。
- 默认设置为off 。
- 只有超级用户能更改这个设置。
+ 将ignore_checksum_failure 设置为 on 会使系统忽略失败(但仍报告警告),并继续处理。
+ 这种行为可能导致崩溃、传播或隐藏损坏,或引发其他严重问题 。
+ 但是,如果块首部仍然正常,它可能允许你跳过错误,检索表中可能仍然存在的未损坏元组。
+ 如果首部损坏,即使启用此选项也会报告错误。默认设置为off 。
+ 只有超级用户才能更改此设置。
@@ -6858,7 +6849,7 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
检测到损坏的页面头通常会导致PostgreSQL 报告错误,中止当前事务。
将zero_damaged_pages 设置为on会导致系统报告警告,将内存中的损坏页面清零,并继续处理。
- 这种行为会破坏数据 ,即损坏页面上的所有行。但是,它确实允许您跳过错误,并从表中可能存在的未损坏页面中检索行。
+ 这种行为会破坏数据 ,即损坏页面上的所有行。但是,它确实允许你跳过错误,并从表中可能存在的未损坏页面中检索行。
如果由于硬件或软件错误而发生损坏,这对于恢复数据很有用。通常在放弃从表的损坏页面恢复数据的希望之前,不应将其设置为on。
清零的页面不会强制写入磁盘,因此建议在再次关闭此参数之前重新创建表或索引。默认设置为off 。
只有超级用户能更改这个设置。
@@ -6874,7 +6865,8 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
- 如果LLVM有所需要的功能,用GDB 注册所生成的函数。这会让调试更加容易。默认设置是off 。这个参数只能在服务器启动时设置。
+ 如果 LLVM 具有所需的功能,则向GDB 注册生成的函数。
+ 这会让调试更加容易。默认设置为off 。这个参数只能在服务器启动时设置。
@@ -6890,7 +6882,7 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
将生成的LLVM IR写入文件系统,位于 内。
- 这仅对于在JIT实现内部工作时有用。默认设置为off 。
+ 这仅对开发 JIT 的内部实现有用。默认设置为off 。
只有超级用户能更改这个设置。
@@ -6919,10 +6911,9 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
- 如果LLVM有所需的功能,发出需要的数据以允许perf 对JIT生成的函数画像。
- 这会写出文件到$HOME/.debug/jit/ 中,如果需要,由用户负责对其执行清除。
- 默认设置是off 。
- 这个参数只能在服务器启动时设置。
+ 如果 LLVM 具有所需的功能,则输出让perf 对 JIT 生成的函数进行性能分析所需的数据。
+ 这会将文件写入$HOME/.debug/jit/ ;用户应在需要时自行清理。
+ 默认设置为off 。这个参数只能在服务器启动时设置。
@@ -6948,11 +6939,11 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
短选项
- 为了方便起见,系统中还为一些参数提供了单字母的命令行选项开关。它们在 中描述。其中一些选项是由于历史原因而存在,并且它们作为一个单字母选项存在并不表示它们会被大量使用。
+ 为了方便起见,系统中还为一些参数提供了单字母的命令行选项开关。它们在 中描述。其中一些选项是由于历史原因而存在,它们以单字母选项的形式存在,并不一定表示鼓励频繁使用这些选项。
- 短选项键
+ 短选项对照
diff --git a/zh/11/datatype.sgml b/zh/11/datatype.sgml
index f567c21f..d64aff9b 100644
--- a/zh/11/datatype.sgml
+++ b/zh/11/datatype.sgml
@@ -148,7 +148,7 @@
line
- 平面上的无限长的线
+ 平面上的无限直线
@@ -160,19 +160,19 @@
macaddr
- MAC(Media Access Control)地址
+ MAC(媒体访问控制)地址
macaddr8
- MAC(Media Access Control)地址(EUI-64格式)
+ MAC(媒体访问控制)地址(EUI-64格式)
money
- 货币数量
+ 货币额
@@ -180,7 +180,7 @@
s ) ]
decimal [ (p ,
s ) ]
- 可选择精度的精确数字
+ 可选择精度的精确数值
@@ -192,7 +192,7 @@
pg_lsn
- PostgreSQL 日志序列号类型
+ PostgreSQL 日志序列号
@@ -264,13 +264,13 @@
tsquery
- 文本搜索查询
+ 文本检索查询
tsvector
- 文本搜索文档
+ 文本检索文档
@@ -407,14 +407,14 @@
- 数字类型常量的语法在 里描述。数字类型有一整套对应的数学操作符和函数。相关信息请参考 。下面的几节详细描述这些类型。
+ 数字类型常量的语法在 里描述。数字类型有一整套对应的算术操作符和函数。相关信息请参考 。下面的几节详细描述这些类型。
整数类型
- 整数
+ integer
@@ -427,7 +427,7 @@
int4
- 整数
+ integer
@@ -447,11 +447,11 @@
- 常用的类型是integer ,因为它提供了在范围、存储空间和性能之间的最佳平衡。一般只有在磁盘空间紧张的时候才使用 smallint 类型。而只有在integer 的范围不够的时候才使用bigint 。
+ 常用的类型是integer ,因为它提供了在范围、存储空间和性能之间的最佳平衡。一般只有在磁盘空间紧张的时候才使用 smallint 类型。bigint 则设计用于integer 的范围不够的情况。
- SQL 只声明了整数类型integer (或int )、smallint 和bigint 。类型int2 、int4 和int8 都是扩展,也在许多其它SQL 数据库系统中使用。
+ SQL 只规定了整数类型integer (或int )、smallint 和bigint 。类型int2 、int4 和int8 都是扩展,也在某些其他SQL 数据库系统中使用。
@@ -460,11 +460,11 @@
任意精度数值
- 数字(数据类型)
+ numeric(数据类型)
- 任意精度数字
+ 任意精度数值
@@ -476,7 +476,14 @@
类型numeric 可以存储非常多位的数字。我们特别建议将它用于货币金额和其它要求计算准确的数量。numeric 值的计算在可能的情况下会得到准确的结果,例如加法、减法、乘法。不过,numeric 类型上的算术运算比整数类型或者下一节描述的浮点数类型要慢很多。
- 下面使用如下术语:numeric 的精度 是整个数中有效数字的总数,即小数点两侧的数字位数之和。numeric 的小数位数 是小数部分中十进制数字的数量,即小数点右侧的位数。因此,数值 23.5141 的精度为 6,小数位数为 4。整数可以视为小数位数为零。
+
+ 我们在下文中使用以下术语:
+ 精度 (precision)是一个numeric
+ 值中有效数字的总位数,也就是小数点两侧数字的总数。
+ 小数位数 (scale)是小数部分中位于小数点
+ 右侧的十进制位数。因此,数值 23.5141 的精度为 6,小数位数为 4。
+ 整数可以认为其小数位数为 0。
+
可以配置numeric 列的最大精度和最大小数位数。要声明numeric 类型的列,使用以下语法:
NUMERIC(precision , scale )
@@ -506,12 +513,12 @@ NUMERIC
NaN
- 非数字
+ 非数
- 非数字
- 数字(数据类型)
+ 非数
+ numeric(数据类型)
除了普通数值外,numeric 类型还允许特殊值NaN ,表示非数
。对NaN 的任何运算都会产生另一个NaN 。在 SQL 命令中将该值写为常量时,必须加上引号,例如UPDATE table SET x = 'NaN' 。输入时,字符串NaN 的识别不区分大小写。
@@ -565,7 +572,7 @@ FROM generate_series(-3.5, 3.5, 1) as x;
- 双精度
+ double precision
@@ -575,7 +582,7 @@ FROM generate_series(-3.5, 3.5, 1) as x;
float8
- 双精度
+ double precision
@@ -618,7 +625,7 @@ FROM generate_series(-3.5, 3.5, 1) as x;
- 非数字
+ 非数
double precision
@@ -626,7 +633,7 @@ FROM generate_series(-3.5, 3.5, 1) as x;
Infinity
-Infinity
NaN
-它们分别表示 IEEE 754 的特殊值无穷大
, 负无穷大
和非数字
。(在浮点运算不遵循 IEEE 754 的机器上,这些值可能无法按预期工作。)在 SQL 命令中将这些值写为常量时,必须加上引号,例如UPDATE table SET x = '-Infinity' 。输入时,这些字符串的识别不区分大小写。
+它们分别表示 IEEE 754 的特殊值无穷大
、 负无穷大
和非数
。(在浮点运算不遵循 IEEE 754 的机器上,这些值可能无法按预期工作。)在 SQL 命令中将这些值写为常量时,必须加上引号,例如UPDATE table SET x = '-Infinity' 。输入时,这些字符串的识别不区分大小写。
@@ -686,13 +693,13 @@ FROM generate_series(-3.5, 3.5, 1) as x;
- auto-increment
+ 自动递增
serial
- sequence
- and serial type
+ 序列
+ 与 serial 类型
@@ -817,7 +824,7 @@ ALTER SEQUENCE tablename _
SELECT '12.34'::float8::numeric::money;
- 但是,我们不推荐这样做。浮点数不应该被用来处理货币,因为浮点数可能会有圆整错误。
+ 但是,我们不推荐这样做。浮点数不应该被用来处理货币,因为浮点数可能会有舍入误差。
@@ -829,7 +836,7 @@ SELECT '52093.89'::money::numeric::float8;
一个 money 值除以一个整数值时,会朝零方向截去小数
- 部分。要得到圆整结果,可以除以一个浮点值,或者在除法前先把
+ 部分。要得到舍入后的结果,可以除以一个浮点值,或者在除法前先把
money 转换为 numeric ,再在除法后转换回
money (如果要避免精度丢失风险,后一种做法更好)。
当一个 money 值被另一个 money 值除时,
@@ -848,12 +855,12 @@ SELECT '52093.89'::money::numeric::float8;
- string
+ 串
字符串
- 字符
+ character
@@ -888,7 +895,7 @@ SELECT '52093.89'::money::numeric::float8;
character(n ) , char(n )
- 定长,空白填充
+ 定长,空格填充
text
@@ -960,7 +967,7 @@ SELECT '52093.89'::money::numeric::float8;
- 可以存储在这些数据类型中的字符由数据库字符集确定,该数据库字符集在创建数据库时选择。无论特定的字符集是什么,都无法存储代码为零的字符(有时称为NUL)。有关更多信息,请参阅 。
+ 可以存储在这些数据类型中的字符由数据库字符集确定,该数据库字符集在创建数据库时选择。无论特定的字符集是什么,都无法存储编码值为零的字符(有时称为NUL)。有关更多信息,请参阅 。
@@ -979,7 +986,7 @@ SELECT '52093.89'::money::numeric::float8;
- 这三种类型之间没有性能差别,除了使用空白填充类型时会占用更多存储
+ 这三种类型之间没有性能差别,除了使用空格填充类型时会占用更多存储
空间,以及在写入带长度约束的列时需要少量额外 CPU 周期来检查长度。
虽然在某些其他数据库系统中,character(n )
可能有一定性能优势,但在 PostgreSQL
@@ -1014,7 +1021,7 @@ 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
+INSERT INTO test2 VALUES ('too long'::varchar(5)); -- 显式截断
SELECT b, char_length(b) FROM test2;
b | char_length
@@ -1133,13 +1140,15 @@ SELECT b, char_length(b) FROM test2;
开头(以便与转义格式区分)。在某些上下文中,这个开头的反斜线
可能需要通过双写进行转义(见
)。作为输入时,十六进制数字
- 可以使用大写或小写,并且在两个数字组成的一组之间允许出现空白
+ 可以使用大写或小写,并且每两个数字组成一组,组与组之间允许出现空白
(但组内以及起始的 \x 序列中不能有空白)。
十六进制格式与大量外部应用和协议兼容,并且通常比转义格式转换得
更快,因此更推荐使用。
- 例如:
+
+ 示例:
+
SET bytea_output = 'hex';
SELECT '\xDEADBEEF'::bytea;
@@ -1190,7 +1199,7 @@ SELECT '\xDEADBEEF'::bytea;
0
- 0字节
+ 零值字节
'\000'
SELECT '\000'::bytea;
\x00
@@ -1247,15 +1256,24 @@ SELECT '\xDEADBEEF'::bytea;
- Bytea 字节默认以hex 格式输出。如果把 改为escape ,
- 不可打印
字节会被转换为等价的三位八进制值,并在前面加一个反斜线。大多数可打印
字节以客户端字符集中相应的标准表示输出,例如:
+ 默认情况下,bytea 字节会以 hex
+ 格式输出。如果把 改为
+ escape ,不可打印
字节会被转换成
+ 等价的三位八进制值,并在前面加一个反斜线。大多数
+ 可打印
字节则会按其在客户端字符集中的标准表示输出,
+ 例如:
+
+
SET bytea_output = 'escape';
SELECT 'abc \153\154\155 \052\251\124'::bytea;
bytea
----------------
abc klm *\251T
- 十进制值为 92 的字节(反斜线)在输出中会被双写。详情见 。
+
+
+ 十进制值 92(反斜线)的字节在输出中会被双写。详情见
+ 。
@@ -1321,10 +1339,10 @@ SELECT 'abc \153\154\155 \052\251\124'::bytea;
time
- 不带时区的时间
+ time without time zone
- 带时区的时间
+ time with time zone
timestamp
@@ -1333,13 +1351,13 @@ SELECT 'abc \153\154\155 \052\251\124'::bytea;
timestamptz
- 带时区的时间戳
+ timestamp with time zone
- 不带时区的时间戳
+ timestamp without time zone
- 间隔
+ interval
时间跨度
@@ -1423,7 +1441,7 @@ SELECT 'abc \153\154\155 \052\251\124'::bytea;
- SQL 要求仅写 timestamp 时,应等效于
+ SQL 标准要求仅写 timestamp 时,应等效于
timestamp without time zone ,而
PostgreSQL 也遵循这种行为。
timestamptz 被接受为
@@ -1506,7 +1524,7 @@ MINUTE TO SECOND
其中 p 是可选的精度说明,给出秒字段中
保留的小数位数。精度可用于 time 、
timestamp 和 interval 类型,
- 范围是 0 到 6。这与前文描述的取值一致。如果在常量声明中没有指定
+ 范围是 0 到 6。如果在常量声明中没有指定
精度,则默认采用该字面值本身的精度(但不超过 6 位)。
@@ -1533,7 +1551,7 @@ MINUTE TO SECOND
1999-01-08
- ISO 8601; 任何模式下的1月8日
+ ISO 8601; 任何模式下的1月8日
(推荐格式)
@@ -1569,27 +1587,27 @@ MINUTE TO SECOND
99-Jan-08
- YMD 模式中的1月8日,否则错误
+ YMD 模式中的1月8日,否则报错
08-Jan-99
- 1月8日,除了在YMD 模式中错误
+ 1月8日,但在YMD 模式中会报错
Jan-08-99
- 1月8日,除了在YMD 模式中错误
+ 1月8日,但在YMD 模式中会报错
19990108
- ISO 8601; 任何模式中的1999年1月8日
+ ISO 8601; 任何模式中的1999年1月8日
990108
- ISO 8601; 任何模式中的1999年1月8日
+ ISO 8601; 任何模式中的1999年1月8日
1999.008
- 年和一年中的日子
+ 年和一年中的第几天
J2451187
@@ -1611,10 +1629,10 @@ MINUTE TO SECOND
time
- 无时区的时间
+ time without time zone
- 带时区的时间
+ time with time zone
@@ -1691,11 +1709,11 @@ MINUTE TO SECOND
040506+0730
- ISO 8601,以分数小时形式给出 UTC 偏移
+ ISO 8601,时区的 UTC 偏移不是整小时
040506+07:30:00
- UTC偏移量指定为秒(ISO 8601中不允许)
+ UTC 偏移精确到秒(ISO 8601中不允许)
04:05:06 PST
@@ -1772,20 +1790,34 @@ MINUTE TO SECOND
- 带时区的时间戳
+ timestamp with time zone
- 无时区的时间戳
+ timestamp without time zone
- 时间戳类型的有效输入由日期与时间拼接而成,其后可以跟时区,再后可以跟AD 或BC 。(或者,AD /BC 可以出现在时区之前,但这不是首选顺序。)因此:
+
+ 时间戳类型的有效输入由一个日期和时间的串接组成,后面跟着一个可选
+ 时区,以及一个可选的 AD 或 BC
+ (另外,AD /BC 也可以出现在
+ 时区前面,但这种顺序并不推荐)。因此:
+
+
1999-01-08 04:05:06
- 以及:
+
+ 和:
+
1999-01-08 04:05:06 -8:00
- 都是有效值,遵循ISO 8601 标准。此外,也支持下面这种常用格式:
+
+
+ 都是遵循 ISO 8601 标准的有效值。另外,广泛使用
+ 的下列格式:
+
January 8 04:05:06 1999 PST
- 。
+
+ 也被支持。
+
按照SQL 标准,timestamp without time zone 和timestamp with time zone 字面量的区别在于,时间后是否有+
或-
符号及其后的时区偏移。因此,按照该标准,TIMESTAMP '2004-10-19 10:23:54' 是timestamp without time zone ,而TIMESTAMP '2004-10-19 10:23:54+02' 是timestamp with time zone 。
PostgreSQL 在确定字符串字面量的类型之前,从不检查其内容,因此会把上述两者都视为timestamp without time zone 。为确保字面量被视为timestamp with time zone ,应为它显式指定正确类型:TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02' 若字面量已经被确定为timestamp without time zone , PostgreSQL 会静默忽略任何时区标记。也就是说,所得值来自输入值中的日期/时间字段,不会根据时区调整。
@@ -1815,12 +1847,12 @@ January 8 04:05:06 1999 PST
time
- constants
+ 常量
date
- constants
+ 常量
@@ -1921,13 +1953,13 @@ January 8 04:05:06 1999 PST
date
输出格式
- formatting
+ 格式化
time
输出格式
- formatting
+ 格式化
@@ -1957,7 +1989,7 @@ January 8 04:05:06 1999 PST
ISO
- ISO 8601, SQL标准
+ ISO 8601,SQL 标准
1997-12-17 07:37:16-08
@@ -1988,7 +2020,7 @@ January 8 04:05:06 1999 PST
- SQL 和POSTGRES风格中,如果DMY域顺序被指定,“日”将出现在“月”之前,否则“月”出现在“日”之前(有关该设置如何影响输入值的解释,请参考 )。 给出了示例。
+ SQL 和POSTGRES风格中,如果指定了 DMY 字段顺序,“日”将出现在“月”之前,否则“月”出现在“日”之前(有关该设置如何影响输入值的解释,请参考 )。 给出了示例。
@@ -2051,7 +2083,7 @@ January 8 04:05:06 1999 PST
时区
- time zone
+ 时区
@@ -2106,7 +2138,8 @@ January 8 04:05:06 1999 PST
- PostgreSQL 允许使用三种不同形式指定时区:
+ PostgreSQL 允许使用三种不同形式来指定时区:
+
完整时区名称,例如 America/New_York 。
@@ -2135,11 +2168,20 @@ January 8 04:05:06 1999 PST
除了时区名称和缩写之外,
PostgreSQL 还接受 POSIX 风格的
时区说明,见 。
- 这个选项通常不如使用具名时区更合适,但如果没有可用的 IANA
- 时区条目,它可能就是必需的。
+ 这个选项通常不如使用具名时区更合适,但如果没有合适的 IANA 时区条目可用,它可能就是必需的。
- 简而言之,缩写和完整名称的区别是:缩写表示特定的 UTC 偏移,而许多完整名称隐含本地夏令时规则,因此有两个可能的 UTC 偏移。例如,2014-06-04 12:00 America/New_York 表示纽约当地时间的中午,在该日期使用的是东部夏令时间(UTC-4)。因此,2014-06-04 12:00 EDT 指定相同的时刻。但是,2014-06-04 12:00 EST 指定东部标准时间(UTC-5)的中午,而不管该日期是否名义上实行夏令时。
+
+
+ 简而言之,这就是缩写和全名的区别:缩写表示某个特定的 UTC 偏移,
+ 而很多完整名称隐含了当地的夏令时规则,因此可能对应两个不同的
+ UTC 偏移。例如,
+ 2014-06-04 12:00 America/New_York 表示纽约
+ 当地时间中午;在这个具体日期,它属于东部夏令时(UTC-4),所以
+ 2014-06-04 12:00 EDT 指定的是同一个时刻。
+ 但 2014-06-04 12:00 EST 指定的是东部标准时
+ 中午(UTC-5),无论当天名义上是否正在实行夏令时。
+
更复杂的是,一些司法辖区在不同时间使用同一时区缩写来表示不同的
@@ -2150,12 +2192,17 @@ January 8 04:05:06 1999 PST
当地民用时间。
- 在所有情况下,时区名称和缩写的识别都不区分大小写。(这与 8.2 之前的PostgreSQL 版本不同;那些版本在某些上下文中区分大小写,在另一些上下文中则不区分。)
+
+ 无论哪种形式,时区名称及其缩写都不区分大小写。(这是对
+ PostgreSQL 8.2 之前版本的一项改动;
+ 在那些版本中,时区名在某些环境下区分大小写,而在另一些环境下则
+ 不区分。)
+
时区名称和缩写并不是硬编码在服务器中的;它们来自安装目录下
.../share/timezone/ 和
- .../share/timezonesets/ 子目录中的数据
+ .../share/timezonesets/ 子目录中的配置文件
(见 )。
@@ -2193,13 +2240,13 @@ January 8 04:05:06 1999 PST
- interval 值可以使用下列语法书写:
+ interval 值可以使用下列详细语法书写:
@ quantity unit quantity unit ... direction
- 其中quantity 是一个数字(很可能是有符号的);
+ 其中quantity 是一个数字(可以带有符号);
unit 是microsecond 、
millisecond 、second 、
minute 、hour 、day 、
@@ -2233,7 +2280,7 @@ January 8 04:05:06 1999 PST
P quantity unit quantity unit ... T quantity unit ...
字符串必须以 P 开头,并且可以包含一个
- T 来引出一天中时间单位。可用的单位缩写见
+ T 来引出一天中的时间单位。可用的单位缩写见
。单位可以省略,
也可以按任意顺序出现,但小于一天的单位必须出现在
T 之后。特别是,M 的含义
@@ -2272,7 +2319,7 @@ P quantity unit
M
- 分钟 (在时间部分中)
+ 分钟(在时间部分中)
S
@@ -2347,7 +2394,7 @@ P years -months -
P1Y2M3DT4H5M6S
- 带标志符的
ISO 8601 格式:含义同上
+ ISO 8601 带标志符的格式
:含义同上
P0001-02-03T04:05:06
@@ -2377,7 +2424,7 @@ SELECT EXTRACT(days from '80 hours'::interval);
interval
输出格式
- formatting
+ 格式化
@@ -2414,7 +2461,7 @@ SELECT EXTRACT(days from '80 hours'::interval);
iso_8601 风格的输出符合 ISO 8601 标准
- 4.4.3.2 节描述的带标志符格式
。
+ 4.4.3.2 节描述的带标志符的格式
。
@@ -2465,7 +2512,7 @@ SELECT EXTRACT(days from '80 hours'::interval);
布尔类型
- Boolean
+ 布尔
数据类型
@@ -2576,15 +2623,15 @@ SELECT * FROM test1 WHERE a;
数据类型
- enumerated (enum)
+ 枚举(enum)
- enumerated types
+ 枚举类型
- 枚举(enum)类型是由一个静态、值的有序集合构成的数据类型。它们等效于很多编程语言所支持的enum 类型。枚举类型的一个示例可以是一周中的日期,或者一个数据的状态值集合。
+ 枚举(enum)类型是由一个静态的有序值集合构成的数据类型。它们等效于很多编程语言所支持的enum 类型。枚举类型的一个示例可以是一周中的各天,或者一个数据的状态值集合。
@@ -2693,7 +2740,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
实现细节
- 枚举标签是大小写敏感的,因此'happy' 与'HAPPY' 是不同的。标签中的空格也是有意义的。
+ 枚举标签是大小写敏感的,因此'happy' 与'HAPPY' 是不同的。标签中的空白也是有意义的。
@@ -2705,7 +2752,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 从内部枚举值到文本标签的翻译被保存在系统目录pg_enum 中。可以直接查询该目录。
+ 从内部枚举值到文本标签的转换关系被保存在系统目录pg_enum 中。直接查询该目录可能会有所帮助。
@@ -2776,7 +2823,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
circle
24字节
圆
- <(x,y),r>(中心点和半径)
+ <(x,y),r>(圆心和半径)
@@ -2784,7 +2831,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
我们提供了丰富的函数和操作符来进行各种几何操作,例如缩放、平移、
- 旋转以及计算相交等,详见 。
+ 旋转以及求交等,详见 。
@@ -2795,7 +2842,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 点是几何类型的基本二维构造块。用下面的语法描述point 类型的值:
+ 点是几何类型的基本二维构造块。用下面任一种语法描述point 类型的值:
( x , y )
@@ -2811,14 +2858,14 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 线
+ 直线
line
- 线由线性方程A x + B y + C = 0
+ 直线由线性方程A x + B y + C = 0
表示,其中A 和B 不能同时为零。类型line
的值采用以下形式输入和输出:
@@ -2838,7 +2885,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
(x1 ,y1 )
和
(x2 ,y2 )
- 是线上不同的两点。
+ 是直线上不同的两点。
@@ -2854,7 +2901,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 线段用一对线段的端点来表示。lseg 类型的值用下面的语法声明:
+ 线段用一对线段的端点来表示。lseg 类型的值用下面任一种语法指定:
[ ( x1 , y1 ) , ( x2 , y2 ) ]
@@ -2878,15 +2925,15 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
方框
- box (data type)
+ box(数据类型)
- rectangle
+ 矩形
- 方框用其对角的点对表示。box 类型的值使用下面的语法指定:
+ 方框用其对角的点对表示。box 类型的值使用下面任一种语法指定:
( ( x1 , y1 ) , ( x2 , y2 ) )
@@ -2905,7 +2952,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 在输入时可以提供任意两个对角,但是值将根据需要被按顺序记录为右上角和左下角。
+ 在输入时可以提供任意两个对角,但是值将根据需要被重新排列,并依次存储为右上角和左下角。
@@ -2913,7 +2960,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
路径
- path (data type)
+ path(数据类型)
@@ -2921,7 +2968,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- path 类型的值用下面的语法声明:
+ path 类型的值用下面任一种语法指定:
[ ( x1 , y1 ) , ... , ( xn , yn ) ]
@@ -2931,11 +2978,11 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
x1 , y1 , ... , xn , yn
- 其中的点是组成路径的线段的端点。方括弧([] )表示一个开放的路径,圆括弧(() )表示一个封闭的路径。如第三种到第五种语法所示,当最外面的圆括号被忽略时,路径将被假定为封闭。
+ 其中的点是组成路径的线段的端点。方括弧([] )表示一个开放的路径,圆括弧(() )表示一个封闭的路径。如第三种到第五种语法所示,当最外面的圆括号被省略时,路径将被假定为封闭。
- 路径的输出使用第一种或第二种语法。
+ 路径的输出视情况使用第一种或第二种语法。
@@ -2946,10 +2993,10 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
polygon
- 多边形由点的列表(多边形的顶点)表示。多边形与闭合路径非常相似,但存储方式不同,并且有自己的支持例程。
+ 多边形由点的列表(多边形的顶点)表示。多边形与封闭路径非常相似,但存储方式不同,并且有自己的支持例程。
- polygon 类型的值用下列语法声明:
+ polygon 类型的值用下列任一种语法指定:
( ( x1 , y1 ) , ... , ( xn , yn ) )
@@ -2974,7 +3021,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- 圆由一个圆心和一个半径代表。circle 类型的值用下面的语法指定:
+ 圆由一个圆心和一个半径代表。circle 类型的值用下面任一种语法指定:
< ( x , y ) , r >
@@ -2997,7 +3044,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
网络地址类型
- network
+ 网络
数据类型
@@ -3051,8 +3098,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
在对 inet 或 cidr 数据类型排序时,IPv4
- 地址总是排在 IPv6 地址之前,包括那些封装在 IPv6 地址中或映射到
- IPv6 地址中的 IPv4 地址,例如 ::10.2.3.4 或
+ 地址总是排在 IPv6 地址之前,即使后者是封装或映射 IPv4 地址所得的 IPv6 地址,例如 ::10.2.3.4 或
::ffff:10.4.3.2。
@@ -3098,7 +3144,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
cidr 类型保存 IPv4 或 IPv6 网络说明。输入和输出格式
遵循无类别域间路由(CIDR)约定。指定网络的格式为
address/y ,其中
- address 是网络最低地址的
+ address 是网络的
IPv4 或 IPv6 表示,而
y 是网络掩码中的位数。
如果省略 y ,则会按照旧式
@@ -3208,7 +3254,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- inet vs. cidr
+ inet 与 cidr
inet 和 cidr 两种数据类型的本质区别在于:
@@ -3234,12 +3280,12 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
- MAC地址
+ MAC 地址
macaddr
- macaddr 类型存储 MAC 地址,也就是以太网卡硬件地址 (尽管 MAC 地址还用于其它用途)。可以接受下列格式的输入:
+ macaddr 类型存储 MAC 地址,例如以太网卡硬件地址 (尽管 MAC 地址还用于其它用途)。可以接受下列格式的输入:
'08:00:2b:01:02:03'
@@ -3273,15 +3319,15 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
macaddr8
- macaddr8 (data type)
+ macaddr8(数据类型)
- MAC地址(EUI-64格式)
+ MAC 地址(EUI-64 格式)
macaddr
- 此macaddr8 类型以 EUI-64 格式存储 MAC 地址,例如常见的以太网卡硬件地址(尽管 MAC 地址也有其他用途)。该类型既接受 6 字节也接受 8 字节的 MAC 地址,并以 8 字节格式存储。给定的 6 字节格式 MAC 地址会以 8 字节格式存储,其中第 4 和第 5 字节分别设为 FF 和 FE。注意,IPv6 使用修改后的 EUI-64 格式,从 EUI-48 转换后应将第 7 位设为 1。提供的函数macaddr8_set7bit 可完成这一更改。一般来说,接受由成对十六进制数字(在字节边界上)构成的输入,各对之间可以统一使用':' , '-' 或'.' 中的一种分隔。十六进制数字的数量必须为 16 个(8 字节)或 12 个(6 字节)。开头和结尾的空白会被忽略。以下是可以接受的输入格式示例:
+ 此macaddr8 类型以 EUI-64 格式存储 MAC 地址,例如常见的以太网卡硬件地址(尽管 MAC 地址也有其他用途)。该类型既接受 6 字节也接受 8 字节的 MAC 地址,并以 8 字节格式存储。给定的 6 字节格式 MAC 地址会以 8 字节格式存储,其中第 4 和第 5 字节分别设为 FF 和 FE。注意,IPv6 使用修改后的 EUI-64 格式,从 EUI-48 转换后应将第 7 位设为 1。提供的函数macaddr8_set7bit 可完成这一更改。一般来说,接受由成对十六进制数字(在字节边界上)构成的输入,各对之间可以统一使用':' 、 '-' 或'.' 中的一种分隔。十六进制数字的数量必须为 16 个(8 字节)或 12 个(6 字节)。开头和结尾的空白会被忽略。以下是可以接受的输入格式示例:
'08:00:2b:01:02:03:04:05'
'08-00-2b-01-02-03-04-05'
'08002b:0102030405'
@@ -3314,7 +3360,13 @@ SELECT macaddr8_set7bit('08:00:2b:01:02:03');
数据类型
- 位串是由 1 和 0 组成的字符串,可用于存储或可视化位掩码。SQL 有两种位类型:bit(n ) 和bit varying(n ) ,其中n 是正整数。
+
+ 位串是由 1 和 0 组成的字符串。它们可用于存储或展示位掩码。
+ SQL 中有两种位类型:
+ bit(n ) 和
+ bit varying(n ) ,其中
+ n 是正整数。
+
bit 类型的数据长度必须与
@@ -3364,31 +3416,31 @@ SELECT * FROM test;
- 一个 bit 串值每 8 位需要 1 个字节,再加上 5 或 8 个字节的额外
+ 一个位串值每 8 位需要 1 个字节,再加上 5 或 8 个字节的额外
开销,具体取决于串的长度。(不过,长值可能会被压缩或移到行外存储,
与 中对字符串的说明相同。)
- 文本搜索类型
+ 文本检索类型
- 全文搜索
+ 全文检索
数据类型
- 文本搜索
+ 文本检索
数据类型
- PostgreSQL 提供了两种专为支持全文搜索而
- 设计的数据类型。所谓全文搜索,是指在一组自然语言
+ PostgreSQL 提供了两种专为支持全文检索而
+ 设计的数据类型。所谓全文检索,是指在一组自然语言
文档 中查找最匹配某个
查询 的文档。tsvector 类型以
- 适合文本搜索的优化形式表示文档,tsquery 类型则表示
+ 适合文本检索的优化形式表示文档,tsquery 类型则表示
文本查询。关于这一功能的详细解释见 ;
相关函数和操作符的概览见 。
@@ -3400,40 +3452,74 @@ SELECT * FROM test;
tsvector(数据类型)
- 一个tsvector 值是由互不相同的词位 组成的有序列表。词位是经过规范化 以合并同一个词的不同变体的词(详情见 )。排序和去重会在输入时自动完成,如本例所示:
+
+ tsvector 值是一个排好序且互不重复的
+ 词位 (lexeme)列表,这些词已经过
+ 正规化 ,以便把同一单词的不同变体合并起来
+ (详见 )。排序和去重会在输入时自动
+ 完成,如下例所示:
+
+
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
tsvector
----------------------------------------------------
'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'
- 要表示包含空白或标点符号的词位,请用引号括住它们:
+
+
+ 若要表示包含空白或标点的词位,请用引号将它们括起来:
+
+
SELECT $$the lexeme ' ' contains spaces$$::tsvector;
tsvector
-------------------------------------------
' ' 'contains' 'lexeme' 'spaces' 'the'
- (本例和下一个示例使用美元符号引用的字符串字面量,以免在字面量中双写引号造成混淆。)内嵌的引号和反斜线必须双写:
+
+
+ (本例及下例使用美元引用的字符串常量,以避免在字符串内部必须
+ 双写引号所造成的混淆。)嵌入的引号和反斜线必须双写:
+
+
SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;
tsvector
------------------------------------------------
'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'
- 还可以给词位附加整数形式的位置 ,如下所示:
+
+
+ 还可以为词位附加整数形式的 位置 :
+
+
SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;
tsvector
-------------------------------------------------------------------------------
'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4
- 位置通常表示原词在文档中的位置。位置信息可用于邻近度排序 。位置值的范围为 1 到 16383;更大的数值会被静默设为 16383。同一词位的重复位置会被丢弃。
+
- 具有位置的词位还可以标记一个权重 ,它可以是A ,
- B , C 或D 。
- D 是默认值,因此不会在输出中显示:
+ 一个位置通常表示源词在文档中的位置。位置信息可用于
+ 邻近度排序 。位置值可以位于 1 到 16383
+ 之间;更大的数字会被静默设为 16383。同一词位的重复位置会被丢弃。
+
+
+
+ 带有位置的词位还可以进一步附加一个
+ 权重 标签,其值可以是
+ A 、B 、C
+ 或 D 。D 是默认值,因此在
+ 输出中不会显示:
+
+
SELECT 'a:1A fat:2B,4C cat:5D'::tsvector;
tsvector
----------------------------
'a':1A 'cat':5 'fat':2B,4C
- 权重通常用来反映文档结构,例如为标题中的词和正文中的词采用不同标记。文本搜索排名函数可以为不同的权重标记分配不同优先级。
+
+
+ 权重通常用于反映文档结构,例如把标题中的词和正文中的词区分开来。
+ 文本检索排序函数可以为不同的权重标记分配不同优先级。
+
必须认识到,tsvector 类型本身并不会执行任何词语
- 规范化;它假定输入的词已经按照应用需求完成规范化。例如:
+ 正规化;它假定输入的词已经按照应用需求完成正规化。例如:
SELECT 'The Fat Rats'::tsvector;
@@ -3442,9 +3528,9 @@ SELECT 'The Fat Rats'::tsvector;
'Fat' 'Rats' 'The'
- 对于大多数英文全文搜索应用来说,上述词会被视为尚未规范化,但
+ 对于大多数英文全文检索应用来说,上述词会被视为尚未正规化,但
tsvector 并不在意。原始文档文本通常应先经过
- to_tsvector ,以按搜索需要对词语进行规范化:
+ to_tsvector ,以按检索需要对词语进行正规化:
SELECT to_tsvector('english', 'The Fat Rats');
@@ -3533,9 +3619,9 @@ SELECT 'super:*'::tsquery;
引号的使用规则与前面介绍 tsvector 时相同;同样,
- 与 tsvector 一样,任何需要的词语规范化都必须在
+ 与 tsvector 一样,任何需要的词语正规化都必须在
转换为 tsquery 类型之前完成。to_tsquery
- 函数很适合用来实现这种规范化:
+ 函数很适合用来实现这种正规化:
SELECT to_tsquery('Fat:ab & Cats');
@@ -3561,8 +3647,7 @@ SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' );
---------------+------------
'postgradu':1 | 'postgr':*
- 因而它能够匹配其带前缀的后继形式
- postgraduate 。
+ 因而它能够匹配postgraduate 词干化后的形式。
@@ -3580,7 +3665,7 @@ SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' );
uuid 数据类型用于存储由
RFC 4122、
ISO/IEC 9834-8:2005 及相关标准定义的通用唯一标识符(UUID)。
- (有些系统把这种数据类型称为全局唯一标识符,或 GUID,
+ (有些系统把这种数据类型称为全局唯一标识符,或 GUID
GUID 。)这种标识符是一个
128 位的量,由某种算法生成,该算法被设计为使同一算法在已知宇宙中
被其他人生成出相同标识符的概率极低。因此,对于分布式系统而言,
@@ -3597,7 +3682,7 @@ SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' );
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
PostgreSQL 也接受其他输入形式:可以使用
- 大写字母、用花括号包围标准格式、忽略部分或全部连字符,或者在任意
+ 大写字母、用花括号包围标准格式、省略部分或全部连字符,或者在任意
4 位分组后额外加上连字符。例如:
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
@@ -3645,16 +3730,25 @@ a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
创建XML值
- 要生成xml 类型的值,可以对字符数据使用函数xmlparse :xmlparse
+
+ 要从字符数据生成 xml 类型的值,可以使用函数
+ xmlparse :xmlparse
XMLPARSE ( { DOCUMENT | CONTENT } value )
- 例如:
+ 示例:
+Manual ... ')
XMLPARSE (CONTENT 'abcbar foo ')
-]]> 按照 SQL 标准,这是将字符串转换为 XML 值的唯一方式,不过也可以使用以下 PostgreSQL 特有语法:
+ 按照 SQL 标准,这是把字符串转换为 XML 值的
+ 唯一方法;但 PostgreSQL 特有的下列语法:
+bar'
'bar '::xml
-]]> 。
+]]>
+ 也可以使用。
+
即使输入值指定了文档类型声明(DTD),xml 类型也不会
@@ -3663,18 +3757,25 @@ xml 'bar '
来执行验证。
- 相反的操作是把xml 值转换为字符串,这使用函数xmlserialize :xmlserialize
+
+ 反向操作,也就是从 xml 生成字符串值,则使用函数
+ xmlserialize :xmlserialize
XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type )
- type 可以是character , character varying 或text (或这些类型之一的别名)。同样,按照 SQL 标准,这是在xml 类型和字符类型之间转换的唯一方式,不过 PostgreSQL 也允许直接对值进行类型转换。
+ type 可以是
+ character 、character varying 或
+ text (或它们的别名)。同样,根据 SQL 标准,这是在
+ xml 与字符类型之间进行转换的唯一方式,但
+ PostgreSQL 也允许你直接进行类型转换。
+
当字符串值在不经过 XMLPARSE 或
XMLSERIALIZE 的情况下与 xml 类型互相转换时,
选择 DOCUMENT 还是 CONTENT
- 由会话配置参数 XML option
- XML option 决定,可以使用
+ 由会话配置参数 XML 选项
+ XML 选项 决定,可以使用
标准命令设置:
SET XML OPTION { DOCUMENT | CONTENT };
@@ -3738,7 +3839,7 @@ SET xmloption TO { DOCUMENT | CONTENT };
xml 数据类型有些特殊,因为它不提供任何比较操作符。
这是因为对 XML 数据并不存在良定义且通用的比较算法。其结果是,
- 你无法通过把某个 xml 值与搜索值比较来检索行。
+ 你无法通过把某个 xml 列与搜索值比较来检索行。
因此,XML 值通常应伴随一个独立的键字段,例如 ID。另一种比较
XML 值的办法,是先把它们转换成字符串;但请注意,字符串比较对
XML 的比较需求通常帮助不大。
@@ -3746,14 +3847,14 @@ SET xmloption TO { DOCUMENT | CONTENT };
由于 xml 数据类型没有可用的比较操作符,因此无法直接
- 在这种类型上创建索引。如果需要在 XML 中快速搜索,可行方案包括:
+ 在这种类型的列上创建索引。如果需要在 XML 中快速搜索,可行方案包括:
将表达式转换为字符串类型后为其建立索引,或者为某个 XPath 表达式
建立索引。当然,实际查询也必须相应调整为使用该被索引的表达式。
- PostgreSQL 的文本搜索功能也可用于加速
- XML 数据的全文搜索。不过,目前 PostgreSQL 发行版中仍缺少所需的
+ PostgreSQL 的文本检索功能也可用于加速
+ XML 数据的全文检索。不过,目前 PostgreSQL 发行版中仍缺少所需的
预处理支持。
@@ -3771,12 +3872,12 @@ SET xmloption TO { DOCUMENT | CONTENT };
域类型
- domain
+ 域
- data type
- domain
+ 数据类型
+ 域
@@ -3788,13 +3889,13 @@ SET xmloption TO { DOCUMENT | CONTENT };
CREATE DOMAIN posint AS integer CHECK (VALUE > 0);
CREATE TABLE mytable (id posint);
-INSERT INTO mytable VALUES(1); -- works
-INSERT INTO mytable VALUES(-1); -- fails
+INSERT INTO mytable VALUES(1); -- 成功
+INSERT INTO mytable VALUES(-1); -- 失败
- 当底层类型的一个操作符或函数适用于一个域值时,域会被自动向下转换为底层类型。因此,mytable.id - 1 的结果会被认为是类型integer 而不是posint 。我们可以写成(mytable.id - 1)::posint 来把结果转换回posint ,这会导致域的约束被重新检查。在这种情况下,如果该表达式被应用于一个值为1的id 就会错误。把底层类型的值赋给域类型的一个字段或者变量不需要写显式的类型转换,但是域的约束将会被检查。
+ 当底层类型的一个操作符或函数被应用于一个域值时,域会被自动向下转换为底层类型。因此,mytable.id - 1 的结果会被认为是类型integer 而不是posint 。我们可以写成(mytable.id - 1)::posint 来把结果转换回posint ,这会导致域的约束被重新检查。在这种情况下,如果该表达式被应用于一个值为1的id 就会报错。把底层类型的值赋给域类型的一个字段或者变量不需要写显式的类型转换,但是域的约束将会被检查。
@@ -3925,7 +4026,7 @@ SELECT * FROM pg_attribute
regprocedure
pg_proc
- 函数与参数类型
+ 带参数类型的函数
sum(int4)
@@ -3974,21 +4075,21 @@ SELECT * FROM pg_attribute
regconfig
pg_ts_config
- 文本搜索配置
+ 文本检索配置
english
regdictionary
pg_ts_dict
- 文本搜索字典
+ 文本检索词典
simple
- 对于按名字空间分组的对象,所有 OID 别名类型都接受模式限定名称;如果不加限定就无法在当前搜索路径中找到对象,输出时也会显示模式限定名称。regproc 和regoper 别名类型只接受唯一的(未重载的)输入名称,因此用途有限;对于大多数用途,regprocedure 或regoperator 更合适。对于regoperator ,通过将未使用的操作数写为NONE 来标识一元操作符。
+ 对于按命名空间分组的对象,所有 OID 别名类型都接受模式限定名称;如果不加限定就无法在当前搜索路径中找到对象,输出时也会显示模式限定名称。regproc 和regoper 别名类型只接受唯一的(未重载的)输入名称,因此用途有限;对于大多数用途,regprocedure 或regoperator 更合适。对于regoperator ,通过将未使用的操作数写为NONE 来标识一元操作符。
大多数 OID 别名类型还有一个附加特性,就是会创建依赖关系。如果
@@ -3996,9 +4097,8 @@ SELECT * FROM pg_attribute
它就会对被引用对象建立依赖。例如,如果某列的默认表达式是
nextval('my_seq'::regclass) ,
PostgreSQL 就会知道该默认表达式依赖于
- 序列 my_seq ,因此系统在删除该序列之前,必须先
- 移除该默认表达式。
- (regrole 是这一特性的例外:该类型的常量不允许出现在
+ 序列 my_seq ,因此系统不允许在尚未移除该默认表达式时删除序列。
+ (regrole 是这一特性的唯一例外:该类型的常量不允许出现在
存储表达式中。)
@@ -4160,7 +4260,7 @@ SELECT * FROM pg_attribute
anyarray
- 表示一个函数可以接受任意数组数据类型(参见 )
+ 表示一个函数可以接受任意数组数据类型(参见 )。
@@ -4215,12 +4315,12 @@ SELECT * FROM pg_attribute
trigger
- 触发器函数被声明为返回trigger.
+ 表示触发器函数被声明为返回 trigger 。
event_trigger
- 事件触发器函数被声明为返回event_trigger.
+ 表示事件触发器函数被声明为返回 event_trigger 。
@@ -4235,7 +4335,7 @@ SELECT * FROM pg_attribute
unknown
- 标识一种尚未解析出的类型,例如未修饰的字符串字面值。
+ 标识一种尚未解析出的类型,例如未修饰的字符串字面值的类型。
diff --git a/zh/11/dict-int.sgml b/zh/11/dict-int.sgml
index 2988defd..c20e9906 100644
--- a/zh/11/dict-int.sgml
+++ b/zh/11/dict-int.sgml
@@ -1,16 +1,16 @@
- dict_int — 用于整数的示例全文搜索词典
+ dict_int — 用于整数的示例全文检索词典
dict_int
- dict_int 是一个全文搜索附加词典模板的示例。
+ dict_int 是一个全文检索附加词典模板的示例。
引入这个示例词典是为了控制整数(有符号和无符号)的索引,
- 使这类数字能够被索引,同时又避免唯一词的数量过度增长,
+ 使这类数字能够被索引,同时又避免不同词的数量过度增长,
因为那会严重影响搜索性能。
@@ -42,7 +42,7 @@
用法
- 安装dict_int 扩展后,会创建一个文本搜索模板
+ 安装dict_int 扩展后,会创建一个文本检索模板
intdict_template 以及一个基于该模板、使用默认参数的词典
intdict 。你可以修改这些参数,例如:
@@ -65,7 +65,7 @@ mydb# select ts_lexize('intdict', '12345678');
但在实际使用中,通常需要像 所述那样,
- 将它包含到某个文本搜索配置中。可能类似如下:
+ 将它包含到某个文本检索配置中。可能类似如下:
ALTER TEXT SEARCH CONFIGURATION english
diff --git a/zh/11/func.sgml b/zh/11/func.sgml
index 327a7fa5..586aa67d 100644
--- a/zh/11/func.sgml
+++ b/zh/11/func.sgml
@@ -6921,7 +6921,7 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
- 文本搜索函数和操作符
+ 文本检索函数和操作符
全文检索
@@ -6929,7 +6929,7 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
- 文本搜索
+ 文本检索
函数和操作符
@@ -6937,11 +6937,11 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
、
以及
- 总结了为全文检索提供的函数和操作符。PostgreSQL 的文本搜索功能的详细解释可参考 。
+ 总结了为全文检索提供的函数和操作符。PostgreSQL 的文本检索功能的详细解释可参考 。
- 文本搜索操作符
+ 文本检索操作符
@@ -7024,10 +7024,10 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
tsquery 包含操作符只考虑两个查询中列出的词位,忽略组合操作符。
- 除了表中列出的操作符,tsvector 和 tsquery 类型还定义了普通的 B-树比较操作符(= 、< 等)。这些操作符对文本搜索用处不大,但可以用于其他用途,例如在这些类型的列上建立唯一索引。
+ 除了表中列出的操作符,tsvector 和 tsquery 类型还定义了普通的 B-树比较操作符(= 、< 等)。这些操作符对文本检索用处不大,但可以用于其他用途,例如在这些类型的列上建立唯一索引。
- 文本搜索函数
+ 文本检索函数
@@ -7049,7 +7049,7 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
get_current_ts_config get_current_ts_config()
regconfig
- 获取默认的文本搜索配置
+ 获取默认的文本检索配置
get_current_ts_config()
english
@@ -7258,17 +7258,17 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
- 所有接受一个可选的regconfig 参数的文本搜索函数在省略该参数时,会使用由 指定的配置。
+ 所有接受一个可选的regconfig 参数的文本检索函数在省略该参数时,会使用由 指定的配置。
- 中的函数被单独列出,因为它们通常不被用于日常的文本搜索操作。
- 它们有助于开发和调试新的文本搜索配置。
+ 中的函数被单独列出,因为它们通常不被用于日常的文本检索操作。
+ 它们有助于开发和调试新的文本检索配置。
- 文本搜索调试函数
+ 文本检索调试函数
diff --git a/zh/11/gist.sgml b/zh/11/gist.sgml
index eb2c2180..d65755e3 100644
--- a/zh/11/gist.sgml
+++ b/zh/11/gist.sgml
@@ -690,7 +690,7 @@ my_fetch(PG_FUNCTION_ARGS)
示例
- PostgreSQL 源代码发行包包含了若干使用GiST 实现的索引方法示例。核心系统目前提供了文本搜索支持(为tsvector 和tsquery 建立索引),并为某些内置几何数据类型提供了与 R 树等价的功能(见src/backend/access/gist/gistproc.c )。下列contrib 模块中也包含GiST 操作符类:
+ PostgreSQL 源代码发行包包含了若干使用GiST 实现的索引方法示例。核心系统目前提供了文本检索支持(为tsvector 和tsquery 建立索引),并为某些内置几何数据类型提供了与 R 树等价的功能(见src/backend/access/gist/gistproc.c )。下列contrib 模块中也包含GiST 操作符类:
diff --git a/zh/11/json.sgml b/zh/11/json.sgml
index aa67ebc1..94fda2cb 100644
--- a/zh/11/json.sgml
+++ b/zh/11/json.sgml
@@ -23,7 +23,7 @@
有两种 JSON 数据类型:json 和 jsonb 。它们接受的输入值集合几乎 相同。实际使用中的主要区别是效率。json 数据类型保存输入文本的精确副本,处理函数每次执行时都必须重新解析;而 jsonb 数据以分解后的二进制格式存储,额外的转换开销使输入稍慢,但无需重新解析,因此处理速度明显更快。jsonb 还支持索引,这可能带来显著优势。
- 由于 json 类型存储的是输入文本的精确副本,因此它会保留标记
+ 由于 json 类型存储的是输入文本的精确副本,因此它会保留词元
之间在语义上无关紧要的空白,以及 JSON 对象内部键的顺序。此外,如果值中
的某个 JSON 对象包含同一个键多次,所有键/值对都会被保留下来(处理函数会
将最后一个值视为生效值)。相比之下,jsonb 不保留空白,不保留
@@ -46,7 +46,7 @@
当把文本形式的 JSON 输入转换为 jsonb 时,
- RFC 7159 描述的基本类型会有效映射到原生的
+ RFC 7159 描述的基本类型实际上会映射到原生的
PostgreSQL 类型上,如
所示。因此,什么样的数据构成
有效的 jsonb 会有一些额外但较小的限制,这些限制不适用于
@@ -94,7 +94,7 @@
null
- (无)
+ (无)
SQL NULL 是不同的概念
@@ -109,18 +109,18 @@
以下都是有效的 json (或 jsonb )表达式:
--- Simple scalar/primitive value
--- Primitive values can be numbers, quoted strings, true, false, or null
+-- 简单的标量/基本值
+-- 基本值可以是数字、加引号的字符串、true、false 或 null
SELECT '5'::json;
--- Array of zero or more elements (elements need not be of same type)
+-- 包含零个或多个元素的数组(元素不必是同一类型)
SELECT '[1, 2, "foo", null]'::json;
--- Object containing pairs of keys and values
--- Note that object keys must always be quoted strings
+-- 包含键值对的对象
+-- 注意,对象的键必须始终是加引号的字符串
SELECT '{"bar": "baz", "balance": 7.77, "active": false}'::json;
--- Arrays and objects can be nested arbitrarily
+-- 数组和对象可以任意嵌套
SELECT '{"foo": [true, "bar"], "tags": {"a": 1, "b": null}}'::json;
@@ -171,8 +171,7 @@ SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
当 JSON 数据存储在表中时,它与任何其他数据类型一样,都要面对相同的并发控
制考量。虽然存储大型文档是可行的,但要记住,任何更新都会在整行上获取一个
行级锁。应考虑将 JSON 文档限制在可管理的大小,以减少更新事务之间的锁争用。
- 理想情况下,每个 JSON 文档都应表示一个原子数据项,按照业务规则,它不应被
- 合理地进一步拆分为更小且可独立修改的数据项。
+ 理想情况下,每个 JSON 文档都应表示一个原子数据项,根据业务规则,无法再合理地将它细分为更小且可独立修改的数据项。
@@ -180,11 +179,11 @@ SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
jsonb 包含与存在
jsonb
- containment
+ 包含
jsonb
- existence
+ 存在
测试 包含 是 jsonb 的一项重要能力。
@@ -193,33 +192,32 @@ SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
示例都返回真:
--- Simple scalar/primitive values contain only the identical value:
+-- 简单的标量/基本值只包含相同的值:
SELECT '"foo"'::jsonb @> '"foo"'::jsonb;
--- The array on the right side is contained within the one on the left:
+-- 左侧数组包含右侧数组:
SELECT '[1, 2, 3]'::jsonb @> '[1, 3]'::jsonb;
--- Order of array elements is not significant, so this is also true:
+-- 数组元素的顺序无关紧要,因此下面的结果也为真:
SELECT '[1, 2, 3]'::jsonb @> '[3, 1]'::jsonb;
--- Duplicate array elements don't matter either:
+-- 重复的数组元素也无关紧要:
SELECT '[1, 2, 3]'::jsonb @> '[1, 2, 2]'::jsonb;
--- The object with a single pair on the right side is contained
--- within the object on the left side:
+-- 左侧对象包含右侧只有一个键值对的对象:
SELECT '{"product": "PostgreSQL", "version": 9.4, "jsonb": true}'::jsonb @> '{"version": 9.4}'::jsonb;
--- The array on the right side is not considered contained within the
--- array on the left, even though a similar array is nested within it:
-SELECT '[1, 2, [1, 3]]'::jsonb @> '[1, 3]'::jsonb; -- yields false
+-- 左侧数组被认为不 包含右侧数组,
+-- 尽管其中嵌套了一个类似的数组:
+SELECT '[1, 2, [1, 3]]'::jsonb @> '[1, 3]'::jsonb; -- 结果为假
--- But with a layer of nesting, it is contained:
+-- 但增加一层嵌套后,就构成了包含关系:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[[1, 3]]'::jsonb;
--- Similarly, containment is not reported here:
-SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"bar": "baz"}'::jsonb; -- yields false
+-- 同样,下面也不构成包含关系:
+SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"bar": "baz"}'::jsonb; -- 结果为假
--- A top-level key and an empty object is contained:
+-- 包含由顶层键和空对象构成的对象:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"foo": {}}'::jsonb;
@@ -234,11 +232,11 @@ SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"foo": {}}'::jsonb;
对于结构必须匹配这一一般原则,有一个特殊例外:数组可以包含一个基本值:
--- This array contains the primitive string value:
+-- 这个数组包含该基本字符串值:
SELECT '["foo", "bar"]'::jsonb @> '"bar"'::jsonb;
--- This exception is not reciprocal -- non-containment is reported here:
-SELECT '"bar"'::jsonb @> '["bar"]'::jsonb; -- yields false
+-- 这个例外并不对称——下面的结果表示不包含:
+SELECT '"bar"'::jsonb @> '["bar"]'::jsonb; -- 结果为假
@@ -248,19 +246,19 @@ SELECT '"bar"'::jsonb @> '["bar"]'::jsonb; -- yields false
外,下面这些示例都返回真:
--- String exists as array element:
+-- 字符串作为数组元素存在:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';
--- String exists as object key:
+-- 字符串作为对象键存在:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';
--- Object values are not considered:
-SELECT '{"foo": "bar"}'::jsonb ? 'bar'; -- yields false
+-- 不考虑对象的值:
+SELECT '{"foo": "bar"}'::jsonb ? 'bar'; -- 结果为假
--- As with containment, existence must match at the top level:
-SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- yields false
+-- 与包含关系一样,存在性必须在顶层匹配:
+SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- 结果为假
--- A string is considered to exist if it matches a primitive JSON string:
+-- 如果字符串与一个基本 JSON 字符串匹配,则认为它存在:
SELECT '"foo"'::jsonb ? 'foo';
@@ -274,8 +272,7 @@ SELECT '"foo"'::jsonb ? 'foo';
由于 JSON 包含是嵌套的,因此适当的查询可以跳过对子对象的显式选择。例如,
假设我们有一个 doc 列,其顶层是对象,而且大
多数对象都带有 tags 字段,该字段中包含子对象数组。下面
- 这个查询会找出那些包含同时带有 "term":"paris" 和
- "term":"food" 的子对象的项,同时忽略
+ 这个查询会找出同时出现包含 "term":"paris" 的子对象和包含 "term":"food" 的子对象的项,同时忽略
tags 数组之外的任何此类键:
SELECT doc->'site_name' FROM websites
@@ -305,7 +302,7 @@ SELECT doc->'site_name' FROM websites
jsonb 索引
jsonb
- indexes on
+ 索引
@@ -313,7 +310,7 @@ SELECT doc->'site_name' FROM websites
或键/值对。提供了两种 GIN 操作符类
,它们在性能和灵活性
之间提供不同的权衡。
- 对于jsonb ,默认 GIN 操作符类支持使用顶层键存在操作符? , ?& 和?| 以及路径/值存在操作符@> 的查询。(这些操作符所实现语义的详情,参见 。)使用此操作符类创建索引的示例如下:
+ 对于jsonb ,默认 GIN 操作符类支持使用顶层键存在操作符? 、 ?& 和?| 以及路径/值存在操作符@> 的查询。(这些操作符所实现语义的详情,参见 。)使用此操作符类创建索引的示例如下:
CREATE INDEX idxgin ON api USING GIN (jdoc);
非默认的 GIN 操作符类jsonb_path_ops 仅支持为@> 操作符建立索引。使用此操作符类创建索引的示例如下:
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
@@ -344,14 +341,14 @@ CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
名为 jdoc 的 jsonb 列里。
如果在该列上创建了 GIN 索引,那么下面这样的查询就可以利用这个索引:
--- Find documents in which the key "company" has value "Magnafone"
+-- 查找键 "company" 的值为 "Magnafone" 的文档
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"company": "Magnafone"}';
但是,类似下面这样的查询就无法使用该索引,因为虽然操作符
? 可索引,但它并未直接应用到被索引的列
jdoc 上:
--- Find documents in which the key "tags" contains key or array element "qui"
+-- 查找键 "tags" 包含键或数组元素 "qui" 的文档
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc -> 'tags' ? 'qui';
不过,只要适当地使用表达式索引,上述查询也可以利用索引。如果经常查询
@@ -368,7 +365,7 @@ CREATE INDEX idxgintags ON api USING GIN ((jdoc -> 'tags'));
另一种查询方法是利用包含,例如:
--- Find documents in which the key "tags" contains array element "qui"
+-- 查找键 "tags" 包含数组元素 "qui" 的文档
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"tags": ["qui"]}';
jdoc 列上的简单 GIN 索引可以支持这个查询。
@@ -391,9 +388,9 @@ SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"tags": ["qu
基本上,每个 jsonb_path_ops 索引项都是该值连同
- 通向该值的键一起计算出的哈希。例如,要索引
+ 通向该值的键一起计算出的 hash。例如,要索引
{"foo": {"bar": "baz"}} ,会创建一个单独的索引项,
- 其哈希值中同时纳入 foo 、bar 和
+ 其 hash 值中同时纳入 foo 、bar 和
baz 这三者。因此,查找这一结构的包含查询会得到一次
非常精确的索引搜索;但完全没有办法据此找出 foo 是否
作为键出现。另一方面,jsonb_ops 索引会分别创建三个
@@ -413,11 +410,11 @@ SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"tags": ["qu
jsonb 也支持btree 和hash 索引。通常只有在需要检查完整 JSON 文档是否相等时,这些索引才有用。对于btree 排序,jsonb 数据的顺序很少值得关注,但为求完整,列出如下:
-Object > Array > Boolean > Number > String > Null
+对象 > 数组 > 布尔值 > 数字 > 字符串 > Null
-Object with n pairs > object with n - 1 pairs
+包含 n 个键值对的对象 > 包含 n - 1 个键值对的对象
-Array with n elements > array with n - 1 elements
+包含 n 个元素的数组 > 包含 n - 1 个元素的数组
键值对数量相等的对象按以下顺序比较:
键-1 , 值-1 , 键-2 ...
注意,对象键按其存储顺序比较;尤其是,较短的键存储在较长的键之前,因此可能产生不直观的结果,例如:
@@ -437,7 +434,7 @@ SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"tags": ["qu
PL/Perl 的扩展名为 jsonb_plperl 和
jsonb_plperlu 。如果使用它们,
- jsonb 值会按适当方式映射为 Perl 数组、哈希和标量。
+ jsonb 值会按适当方式映射为 Perl 数组、hash 和标量。
diff --git a/zh/11/libpq.sgml b/zh/11/libpq.sgml
index 3fbd4433..fd29f6b9 100644
--- a/zh/11/libpq.sgml
+++ b/zh/11/libpq.sgml
@@ -12,19 +12,19 @@
- libpq 是应用程序员使用PostgreSQL 的C 接口。libpq 是一个库函数的集合,它们允许客户端程序传递查询给PostgreSQL 后端服务器并且接收这些查询的结果。
+ libpq 是PostgreSQL 的C 应用程序编程接口。libpq 是一组库函数,客户端程序可用它们向PostgreSQL 后端服务器发送查询并接收查询结果。
- libpq 也是很多其他PostgreSQL 应用接口的底层引擎,包括为 C++、Perl、Python、Tcl 和 ECPG 编写的接口。如果你使用那些包,某些方面的libpq 行为将会对你很重要。特别是, 、 和 描述了任何使用libpq 的应用的用户可见的行为。
+ libpq 也是其他几个PostgreSQL 应用程序接口的底层引擎,包括为 C++、Perl、Python、Tcl 和ECPG 编写的接口。因此,对于这些包的用户,libpq 行为的某些方面也很重要。特别是, 、 和 描述了任何使用libpq 的应用程序的用户都能观察到的行为。
- 在本章的末尾( )包括了一些短程序来展示如何编写使用libpq 的应用。在源代码发布的src/test/examples 目录中还有一些完整的libpq 应用的示例。
+ 本章末尾( )包含一些简短程序,展示如何编写使用libpq 的程序。源代码发行包的src/test/examples 目录中还提供了几个完整的libpq 应用程序示例。
- 使用libpq 的客户端程序必须包括头文件libpq-fe.h libpq-fe.h 并必须与libpq 库链接在一起。
+ 使用libpq 的客户端程序必须包含头文件libpq-fe.h libpq-fe.h ,并且必须与libpq 库链接。
@@ -39,7 +39,7 @@
- 在 Unix 上,复制一个拥有打开 libpq 连接的进程可能导致不可预料的结果,因为父进程和子进程会共享相同的套接字和操作系统资源。出于这个原因,我们不推荐这样的用法,尽管从子进程执行一个exec 来载入新的可执行代码是安全的。
+ 在 Unix 上,对持有已打开 libpq 连接的进程执行 fork 操作可能导致不可预料的结果,因为父进程和子进程会共享相同的套接字和操作系统资源。出于这个原因,我们不推荐这样的用法,尽管从子进程执行一个exec 来载入新的可执行程序是安全的。
@@ -66,32 +66,32 @@ PGconn *PQconnectdbParams(const char * const *keywords,
- 被传递的数组可以为空,这样就会使用所有默认参数。
- 也可以只包含一个或几个参数设置。他们在长度上必须匹配。
- 对于参数数组的处理将会停止于keywords 数组中第一个NULL 元素。
- 而且,如果与非-NULL keywords 条目相关联的values 条目为NULL 或者空字符串,则忽略该项并继续处理下一对数组项。
+ 传入的数组可以为空,以使用所有默认参数,也可以包含一个或多个参数设置。
+ 两个数组的长度必须相同。处理会在 keywords 数组的第一个 NULL 元素处停止。
+ 如果某个非 NULL 的 keywords 元素所对应的
+ values 元素为 NULL 或空字符串,则忽略这一项,继续处理下一对数组元素。
- 当expand_dbname 为非零时,会检查第一个dbname 关键词的值以查看它是否为一个连接字符串 。
- 如果是,它被扩展
到从字符串中提取的单独的连接参数。
- 该值被认为是一个连接字符串,而不仅是一个数据库名称,如果它包含一个等号(= )或者它以URI模式标志符开头,
- (有关连接字符串格式的更多详情可见 。)
- 只有dbname 的第一次出现会按这种方式处理,任何后续dbname 值会被当做一个普通数据库名处理。
+ 当 expand_dbname 非零时,会检查第一个 dbname 关键词的值是否为
+ 连接字符串 。如果是,就将其展开
为从该字符串中提取的各个连接参数。
+ 如果该值包含等号(= ),或以 URI 方案标识符开头,就会将其视为连接字符串,而非单纯的数据库名。
+ (连接字符串格式的详细说明见 。)
+ 只有第一次出现的 dbname 会按这种方式处理;后续的 dbname 参数都作为普通数据库名处理。
- 通常,参数数组从开头到结尾进行处理。
- 当关键词有重复时,使用最后一个值(不是 NULL 或空)。
- 此规则特别适用于连接字符串中的关键字与一个出现在keywords 数组中的关键字冲突的情况。
- 因此,程序员可以决定数组条目是否能被覆盖或用连接字符串获取的值覆盖。
- 出现在扩展的dbname 条目之前的数组条目可以被连接字符串的字段所覆盖,反之,这些字段被dbname 之后出现的数组条目所覆盖。(但是,再有,只有在那些条目支持非空值时。)
+ 通常会从头到尾处理参数数组。如果某个关键词重复出现,则采用最后一个非 NULL 且非空的值。
+ 此规则也适用于连接字符串中的关键词与 keywords 数组中的关键词冲突的情况。
+ 因此,程序员可以决定数组元素是覆盖连接字符串中的值,还是被这些值覆盖。
+ 出现在要展开的 dbname 元素之前的数组元素,可以被连接字符串中的字段覆盖;
+ 而这些字段又会被出现在 dbname 之后的数组元素覆盖(同样,只有这些元素提供非空值时才会覆盖)。
- 在处理完所有数组条目和任何扩展的连接字符串后,所有未设置的连接参数都将使用默认值填充。
- 如果一个未设置参数的相关环境变量(参见 )被设置了,它的值会被使用。
- 如果环境变量未被设置,则使用参数的内置默认值。
+ 处理完所有数组元素及展开的连接字符串后,仍未设置的连接参数将填入默认值。
+ 如果某个未设置参数对应的环境变量(见 )已经设置,就使用该环境变量的值;
+ 否则使用该参数的内置默认值。
@@ -113,7 +113,7 @@ PGconn *PQconnectdb(const char *conninfo);
- 被传递的字符串可以为空,这样将会使用所有的默认参数。也可以包含由空格分隔的一个或多个参数设置,还可以包含一个URI 。详见 。
+ 被传递的字符串可以为空,这样将会使用所有的默认参数。也可以包含由空白分隔的一个或多个参数设置,还可以包含一个URI 。详见 。
@@ -135,9 +135,13 @@ PGconn *PQsetdbLogin(const char *pghost,
- 这是 PQconnectdb 的前身,使用固定的一组参数。除缺失参数始终采用默认值之外,功能相同。对于要使用默认值的任意固定参数,请传入 NULL 或空字符串。
+
+ 这是 PQconnectdb 的前身,使用固定的一组参数。除缺失参数始终采用默认值之外,功能相同。对于要使用默认值的任意固定参数,请传入 NULL 或空字符串。
+
- 如果 dbName 包含 = 符号,或具有有效的连接 URI 前缀,就会将其当作 conninfo 字符串处理,方式与将其传给 PQconnectdb 完全相同,然后按照 PQconnectdbParams 的规则应用其余参数。
+
+ 如果 dbName 包含 = 符号,或具有有效的连接 URI 前缀,就会将其当作 conninfo 字符串处理,方式与将其传给 PQconnectdb 完全相同,然后按照 PQconnectdbParams 的规则应用其余参数。
+
@@ -167,7 +171,7 @@ PGconn *PQsetdb(char *pghost,
PQconnectPoll PQconnectPoll
- nonblocking connection
+ 非阻塞连接
以非阻塞的方式建立一个到数据库服务器的连接。
@@ -200,7 +204,7 @@ PostgresPollingStatusType PQconnectPoll(PGconn *conn);
- 如果你调用PQtrace ,确保你追踪的该流对象不会阻塞。
+ 如果你调用PQtrace ,确保接收追踪输出的流对象不会阻塞。
@@ -213,7 +217,7 @@ PostgresPollingStatusType PQconnectPoll(PGconn *conn);
- 要开始无阻塞的连接请求,可调用PQconnectStart 或者PQconnectStartParams 。如果结果为空,则libpq 无法分配一个新的PGconn 结构体。否则,一个有效的PGconn 指针会被返回(不过还没有表示一个到数据库的有效连接)。接下来调用PQstatus(conn) 。如果结果是CONNECTION_BAD ,则连接尝试已经失败,通常是因为有无效的连接参数。
+ 要开始非阻塞连接请求,可调用PQconnectStart 或者PQconnectStartParams 。如果结果为空指针,则libpq 无法分配一个新的PGconn 结构体。否则,一个有效的PGconn 指针会被返回(不过还没有表示一个到数据库的有效连接)。接下来调用PQstatus(conn) 。如果结果是CONNECTION_BAD ,则连接尝试已经失败,通常是因为有无效的连接参数。
@@ -312,11 +316,11 @@ switch(PQstatus(conn))
- 在使用PQconnectPoll 时,连接参数connect_timeout 会被忽略:判断是否超时是应用的责任。否则,PQconnectStart 后面跟着PQconnectPoll 循环等效于PQconnectdb 。
+ 在使用PQconnectPoll 时,连接参数connect_timeout 会被忽略:判断是否超时是应用的责任。除此之外,PQconnectStart 后面跟着PQconnectPoll 循环等效于PQconnectdb 。
- 注意当PQconnectStart 或PQconnectStartParams 返回一个非空的指针时,你必须在用完它之后调用PQfinish 来处理那些结构体和任何相关的内存块。即使连接尝试失败或被放弃时也必须完成这些工作。
+ 注意当PQconnectStart 或PQconnectStartParams 返回一个非空的指针时,你必须在用完它之后调用PQfinish 来释放该结构体及其关联的所有内存块。即使连接尝试失败或被放弃时也必须完成这些工作。
@@ -332,21 +336,21 @@ PQconninfoOption *PQconndefaults(void);
typedef struct
{
char *keyword; /* 该选项的关键词 */
- char *envvar; /* 依赖的环境变量名 */
- char *compiled; /* 依赖的内置默认值 */
+ char *envvar; /* 后备环境变量名 */
+ char *compiled; /* 编译时设置的后备默认值 */
char *val; /* 选项的当前值,或者 NULL */
- char *label; /* 连接对话框中域的标签 */
- char *dispchar; /* 指示如何在一个连接对话框中显示这个域。值是:
+ char *label; /* 连接对话框中字段的标签 */
+ char *dispchar; /* 指示如何在连接对话框中显示此字段。可取值:
"" 显示输入的值
- "*" 密码域 - 隐藏值
+ "*" 密码字段 - 隐藏值
"D" 调试选项 - 默认不显示 */
- int dispsize; /* 用于对话框的以字符计的域尺寸 */
+ int dispsize; /* 对话框中的字段宽度,以字符计 */
} PQconninfoOption;
- 返回一个连接选项数组。这可以用来确定用于连接服务器的所有可能的PQconnectdb 选项和它们的当前缺省值。返回值指向一个PQconninfoOption 结构体的数组,该数组以一个包含空keyword 指针的条目结束。如果无法分配内存,则返回该空指针。注意当前缺省值(val 域)将依赖于环境变量和其他上下文。一个缺失或者无效的服务文件将会被无声地忽略掉。调用者必须把连接选项当作只读对待。
+ 返回一个连接选项数组。这可以用来确定用于连接服务器的所有可能的PQconnectdb 选项和它们的当前默认值。返回值指向一个PQconninfoOption 结构体的数组,该数组以一个包含空keyword 指针的条目结束。如果无法分配内存,则返回空指针。注意当前默认值(val 字段)将依赖于环境变量和其他上下文。一个缺失或者无效的服务文件将会被无声地忽略掉。调用者必须把连接选项当作只读对待。
@@ -366,7 +370,9 @@ PQconninfoOption *PQconninfo(PGconn *conn);
- 返回一个连接选项数组。可以用它确定所有可能的 PQconnectdb 选项,以及实际用于连接服务器的值。返回值指向一个 PQconninfoOption 结构体数组,该数组以 keyword 指针为空的条目结束。上文针对 PQconndefaults 的所有注意事项,也适用于 PQconninfo 的结果。
+
+ 返回一个连接选项数组。可以用它确定所有可能的 PQconnectdb 选项,以及实际用于连接服务器的值。返回值指向一个 PQconninfoOption 结构体数组,该数组以 keyword 指针为空的条目结束。上文针对 PQconndefaults 的所有注意事项,也适用于 PQconninfo 的结果。
+
@@ -392,7 +398,9 @@ PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);
- 如果errmsg 不是NULL ,那么成功时*errmsg 会被设置为NULL , 否则设置为被malloc 过的错误字符串以说明该问题(也可以将*errmsg 设置为NULL 并且函数返回NULL ,这表示一种内存耗尽的情况)。
+ 如果 errmsg 不是 NULL ,则成功时将 *errmsg 设为 NULL ;
+ 失败时将其设为由 malloc 分配的、用于说明问题的错误字符串。
+ (也可能出现 *errmsg 被设为 NULL ,同时函数返回 NULL 的情况;这表示内存不足。)
@@ -422,7 +430,7 @@ void PQfinish(PGconn *conn);
PQreset PQreset
- 重置与服务器的通讯通道。
+ 重置与服务器的通信通道。
void PQreset(PGconn *conn);
@@ -440,7 +448,7 @@ void PQreset(PGconn *conn);
PQresetPoll PQresetPoll
- 以非阻塞方式重置与服务器的通讯通道。
+ 以非阻塞方式重置与服务器的通信通道。
int PQresetStart(PGconn *conn);
@@ -451,7 +459,9 @@ PostgresPollingStatusType PQresetPoll(PGconn *conn);
这些函数会关闭与服务器的连接,并尝试使用与之前完全相同的参数建立新连接。如果原本可用的连接丢失,这可以用于错误恢复。它们与上文的 PQreset 不同之处在于采用非阻塞方式。它们受到与 PQconnectStartParams 、PQconnectStart 和 PQconnectPoll 相同的限制。
- 要开始重置连接,请调用 PQresetStart 。如果它返回 0,则重置失败。如果返回 1,则使用 PQresetPoll 轮询重置过程,其方式与使用 PQconnectPoll 创建连接完全相同。
+
+ 要开始重置连接,请调用 PQresetStart 。如果返回 0,表示重置失败。如果返回 1,则使用 PQresetPoll 轮询重置过程,方式与使用 PQconnectPoll 建立连接完全相同。
+
@@ -536,19 +546,19 @@ PGPing PQping(const char *conninfo);
几个libpq 函数解析用户指定的字符串以获取连接参数。
- 这些字符串有两种被接受的格式:普通的关键字/值字符串和URI。URI通常遵循
+ 这些字符串有两种被接受的格式:普通的关键词/值字符串和URI。URI通常遵循
RFC
- 3986 ,除了允许多主机连接字符串,如下面进一步描述的那样。
+ 3986,但也允许使用多主机连接字符串,详见下文。
关键词/值连接字符串
- 在关键词/值格式中,每一个参数设置的形式都是keyword = value ,在设置之间有空白。
- 设置的等号周围的空白是可选的。
- 要写一个空值或一个包含空白的值,将它用单引号包围,例如keyword = 'a value' 。
- 值里面的单引号和反斜线必须用一个反斜线转义,即\' 和\\ 。
+ 在关键词/值格式中,每一个参数设置的形式都是关键词 = 值 ,设置之间以空格分隔。
+ 设置的等号周围的空格是可选的。
+ 要写一个空值或一个包含空格的值,将它用单引号包围,例如keyword = 'a value' 。
+ 值里面的单引号和反斜杠必须用一个反斜杠转义,即\' 和\\ 。
@@ -571,22 +581,22 @@ host=localhost port=5432 dbname=mydb connect_timeout=10
postgresql://userspec @hostspec /dbname ?paramspec
-where userspec is:
+其中 userspec 为:
user :password
-and hostspec is:
+hostspec 为:
host :port ,...
-and paramspec is:
+paramspec 为:
name =value &...
- URI 模式标志符可以是postgresql:// 或postgres:// 。
+ URI 方案标识符可以是postgresql:// 或postgres:// 。
每一个剩下的URI 部分都是可选的。
下列示例展示了合法的URI 语法:
@@ -603,7 +613,7 @@ postgresql://host1:123,host2:456/somedb?target_session_attrs=any&application
postgresql:///mydb?host=localhost&port=5433
- 全部的命名参数必须匹配 中列出的关键词,除了与JDBC连接URI 兼容之外,ssl=true 的实例转换到sslmode=require 。
+ 所有命名参数都必须与 中列出的关键词匹配;唯一的例外是,为兼容 JDBC 连接 URI ,会将 ssl=true 转换为 sslmode=require 。
可以在 URI 的任意部分使用百分号编码来包含具有特殊含义的符号,例如将 = 替换为 %3D 。
@@ -619,7 +629,7 @@ postgresql://[2001:db8::1234]/database
主机组件会被按照参数 对应的描述来解释。
特别地,如果主机部分是空或看起来像一个绝对路径名称,将使用一个 Unix 域套接字连接,否则将启动一个 TCP/IP 连接。
不过要注意,斜线是 URI 层次部分中的一个保留字符。
- 因此,要指定一个非标准的 Unix 域套接字目录,要么忽略 URI 中的主机部分并且指定该主机为一个命名参数,要么在 URI 的主机部分用百分号编码路径:
+ 因此,要指定一个非标准的 Unix 域套接字目录,要么省略 URI 中的主机部分并且指定该主机为一个命名参数,要么在 URI 的主机部分用百分号编码路径:
postgresql:///dbname?host=/var/lib/postgresql
postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
@@ -629,7 +639,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
可以在一个URI中指定多个主机,每一个都有一个可选的端口。
一个形式为postgresql://host1:port1,host2:port2,host3:port3/ 的URI等效于host=host1,host2,host3 port=port1,port2,port3 形式的连接字符串。
- 如下所述,每一个主机都将被尝试,直到成功地建立一个连接。
+ 如下所述,每一个主机都将被依次尝试,直到成功地建立一个连接。
@@ -639,7 +649,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
可以指定多个要连接的主机,这样它们会按给定的顺序被尝试。
- 在键/值格式中,host 、hostaddr 和port 选项都接受逗号分隔的值列表。
+ 在关键词/值格式中,host 、hostaddr 和port 选项都接受逗号分隔的值列表。
在指定的每一个选项中都必须给出相同数量的元素,这样第一个hostaddr 对应于第一个主机名,第二个hostaddr 对应于第二个主机名,以此类推。
不过,如果仅指定一个port ,它将被应用于所有的主机。
@@ -649,11 +659,11 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 不管是哪一种格式,单一的主机名可以被翻译成多个网络地址。常见的示例是一个主机同时具有IPv4和IPv6地址。
+ 不管是哪一种格式,单一的主机名可以被解析成多个网络地址。常见的示例是一个主机同时具有IPv4和IPv6地址。
- 当多个主机被指定时或者单个主机名被翻译成多个地址时,所有的主机和地址都将按照顺序被尝试,直至遇到一个成功的。如果没有主机可以到达,则连接失败。如果成功地建立一个连接但是认证失败,也不会尝试列表中剩下的主机。
+ 当多个主机被指定时或者单个主机名被解析成多个地址时,所有的主机和地址都将按照顺序被尝试,直至遇到一个成功的。如果没有主机可以到达,则连接失败。如果成功地建立一个连接但是认证失败,也不会尝试列表中剩下的主机。
@@ -687,7 +697,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
如果指定了host 而没有指定hostaddr ,则会发生主机名查找。
(当使用PQconnectPoll 时,查找发生在PQconnectPoll 首次考虑此主机名时,
- 并且可能导致PQconnectPoll 阻塞一段时间。)
+ 并且可能导致PQconnectPoll 阻塞相当长的时间。)
@@ -699,11 +709,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 如果同时指定了host 和hostaddr ,
- 则hostaddr 的值给出服务器的网络地址。
- 除非认证方法需要,否则host 的值将被忽略,
- 在这种情况下,它将用作主机名。
-
+ 如果同时指定了 host 和 hostaddr ,则 hostaddr 的值给出服务器的网络地址。只有认证方法需要主机名时,才会将 host 的值用作主机名;否则忽略该值。
+
注意,以下情况很可能导致认证失败:host 不是位于网络地址hostaddr 的服务器名称。另外,同时指定host 和hostaddr 时,将使用host 来标识密码文件中的连接(参见 )。
@@ -747,8 +754,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- PostgreSQL 用户连接的用户名。
- 默认为运行应用程序的操作系统用户名相同。
+ 建立连接所用的 PostgreSQL 用户名。默认与运行应用程序的操作系统用户名相同。
@@ -758,7 +764,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 如果服务器要求密码认证,则使用密码。
+ 服务器要求密码认证时所使用的密码。
@@ -828,9 +834,9 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 指定 配置参数的回退值。
+ 指定 配置参数的后备值。
如果没有通过连接参数或PGAPPNAME 环境变量为application_name 指定值,
- 则将使用此值。在通用实用程序中指定回退名称很有用,该程序希望设置默认应用程序名称,
+ 则将使用此值。在通用实用程序中指定后备名称很有用,该程序希望设置默认应用程序名称,
但允许用户覆盖它。
@@ -841,9 +847,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 控制是否使用客户端TCP保持活动。默认值为1,表示开启,但如果不想要保持活动,可以将其更改为0,表示关闭。
- 对于通过Unix域套接字进行的连接,此参数将被忽略。
-
+ 控制是否使用客户端 TCP keepalive。默认值为 1,表示开启;如果不需要 keepalive,可以将其设为 0,表示关闭。对于通过 Unix 域套接字建立的连接,此参数会被忽略。
+
@@ -852,11 +857,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 控制在多少秒的不活动后,TCP应向服务器发送保持活动消息。值为零使用系统默认值。
- 对通过Unix域套接字进行的连接或禁用保持活动的连接,此参数将被忽略。
- 仅在支持TCP_KEEPIDLE 或等效套接字选项的系统以及Windows上支持;
- 在其他系统上,它没有任何效果。
-
+ 控制在多久没有活动后,TCP 应向服务器发送 keepalive 消息,以秒为单位。值为零时使用系统默认值。对于通过 Unix 域套接字建立的连接,或禁用 keepalive 时,此参数会被忽略。此参数仅在支持 TCP_KEEPIDLE 或等效套接字选项的系统以及 Windows 上受支持;在其他系统上无效。
+
@@ -865,11 +867,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 控制在服务器未确认的情况下重新传输TCP保持活动消息的秒数。值为零时使用系统默认值。
- 此参数在通过Unix域套接字进行连接或禁用保持活动时将被忽略。
- 仅在支持TCP_KEEPINTVL 或等效套接字选项的系统和Windows上支持;
- 在其他系统上,此参数无效。
-
+ 控制未被服务器确认收到的 TCP keepalive 消息在多少秒后应被重传。值为零时使用系统默认值。对于通过 Unix 域套接字建立的连接,或禁用 keepalive 时,此参数会被忽略。此参数仅在支持 TCP_KEEPINTVL 或等效套接字选项的系统以及 Windows 上受支持;在其他系统上无效。
+
@@ -878,11 +877,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 控制在客户端与服务器之间连接被视为断开之前可以丢失的TCP keepalive数量。
- 值为零时使用系统默认值。对通过Unix域套接字建立的连接或禁用keepalives的连接,此参数将被忽略。
- 仅在支持TCP_KEEPCNT 或等效套接字选项的系统上受支持;
- 在其他系统上,此参数无效。
-
+ 控制在客户端与服务器之间的连接被视为中断之前,可以丢失多少个 TCP keepalive 消息。值为零时使用系统默认值。对于通过 Unix 域套接字建立的连接,或禁用 keepalive 时,此参数会被忽略。此参数仅在支持 TCP_KEEPCNT 或等效套接字选项的系统上受支持;在其他系统上无效。
+
@@ -973,7 +969,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- prefer (默认)
+ prefer (默认)
首先尝试SSL 连接;如果失败,则尝试非SSL 连接
@@ -1013,13 +1009,13 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- sslmode 被忽略用于Unix域套接字通信。
- 如果PostgreSQL 没有SSL支持编译,
+ 在 Unix 域套接字通信中,sslmode 会被忽略。
+ 如果PostgreSQL 编译时未启用 SSL 支持,
使用选项require 、verify-ca 或
verify-full 会导致错误,而选项allow 和prefer
将被接受,但libpq 实际上不会尝试建立SSL
连接。SSL 使用libpq的SSL
+ sortas="libpq">在 libpq 中
@@ -1029,15 +1025,15 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
- 此选项已被sslmode 设置所取代。
-
+ 此选项已弃用,请改用 sslmode 设置。
+
如果设置为1,则需要与服务器建立SSL 连接(这相当于sslmode
require )。libpq 将拒绝连接,如果服务器不接受
SSL 连接。如果设置为0(默认值),
libpq 将与服务器协商连接类型(相当于sslmode
- prefer )。此选项仅在PostgreSQL 编译时启用SSL支持。
+ prefer )。此选项仅在 PostgreSQL 编译时启用了 SSL 支持的情况下可用。
@@ -1053,7 +1049,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
SSL 压缩现在被认为不安全,已不再建议使用。OpenSSL 1.1.0 默认禁用压缩,许多操作系统发行版也在更早的版本中禁用了压缩,因此,如果服务器不接受压缩,将此参数设为 on 不会产生效果。另一方面,OpenSSL 1.0.0 之前的版本不支持禁用压缩,因此这些版本会忽略此参数,是否使用压缩取决于服务器。
- 如果安全性不是主要考虑因素,压缩可以提高吞吐量,如果网络是瓶颈的话。如果CPU性能是限制因素,禁用压缩可以提高响应时间和吞吐量。
+ 如果安全性不是主要考虑因素,压缩可以提高吞吐量,如果网络是瓶颈的话。如果CPU性能是限制因素,禁用压缩可以缩短响应时间并提高吞吐量。
@@ -1077,7 +1073,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
这个参数指定了用于客户端证书的密钥的位置。它可以指定一个文件名,该文件名将被用来替代默认的
~/.postgresql/postgresql.key ,或者它可以指定一个从外部引擎
- (引擎是OpenSSL 可加载模块)获取的密钥。外部引擎规范应该包括一个由冒号分隔的引擎名称和
+ (引擎是OpenSSL 可加载模块)获取的密钥。外部引擎的指定形式应包含一个由冒号分隔的引擎名称和
一个引擎特定的密钥标识符。如果没有进行SSL连接,则此参数将被忽略。
@@ -1122,7 +1118,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
krbsrvname
- 用于使用GSSAPI进行认证时要使用的Kerberos服务名称。
+ 使用 GSSAPI 认证时所用的 Kerberos 服务名。
这必须与服务器配置中指定的Kerberos认证服务名称匹配,才能成功进行认证。
(另请参见 。)
@@ -1167,20 +1163,21 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
连接状态函数
- 这些函数可以被用来询问一个已有数据库连接对象的状态。
+ 这些函数可用于查询现有数据库连接对象的状态。
- libpq-fe.h
- libpq-int.h
- libpq 应用程序员应该小心地维护PGconn 抽象。使用下面描述的访问函数来理解PGconn 的内容。我们不推荐使用libpq-int.h 引用内部的PGconn 域,因为它们可能在未来改变。
-
+ libpq-fe.h
+ libpq-int.h
+ 编写 libpq 应用程序时,应注意维护 PGconn 的抽象。请使用下述访问函数获取 PGconn 的内容。不建议通过 libpq-int.h 引用 PGconn 的内部字段,因为这些字段将来可能改变。
+
- 以下函数返回建立连接时确定的参数值。这些值在连接存续期间保持不变。如果使用多主机连接字符串,以下函数的值:PQhost ,
- PQport 和PQpass 可能会在使用同一个PGconn 对象建立新连接时改变。其他值在以下对象的整个生命周期内保持不变:PGconn 对象。
+
+ 以下函数返回建立连接时确定的参数值。这些值在连接存续期间保持不变。如果使用多主机连接字符串,并使用同一个 PGconn 对象建立新连接,则 PQhost 、PQport 和 PQpass 的返回值可能改变。其他值在 PGconn 对象的整个生命周期内保持不变。
+
PQdb PQdb
@@ -1227,7 +1224,7 @@ char *PQpass(const PGconn *conn);
- 返回活跃连接的服务器主机名。可能是主机名、IP 地址或者一个目录路径(如果通过 Unix 套接字连接,路径的情况很容易区分,因为路径总是一个绝对路径,以/ 开始)。
+ 返回活动连接的服务器主机名。可能是主机名、IP 地址或者一个目录路径(如果通过 Unix 套接字连接,路径的情况很容易区分,因为路径总是一个绝对路径,以/ 开始)。
char *PQhost(const PGconn *conn);
@@ -1239,7 +1236,7 @@ char *PQhost(const PGconn *conn);
- 如果conn 参数是NULL ,则PQhost 返回NULL 。否则,如果在生成主机信息时发生错误(或许是连接没有被完全建立或者有什么错误),它会返回一个空字符串。
+ 如果 conn 参数为 NULL ,则 PQhost 返回 NULL 。否则,如果在生成主机信息时发生错误(例如连接尚未完全建立,或出现了错误),则返回空字符串。
@@ -1253,7 +1250,7 @@ char *PQhost(const PGconn *conn);
- 返回活跃连接的端口。
+ 返回活动连接的端口。
char *PQport(const PGconn *conn);
@@ -1265,7 +1262,7 @@ char *PQport(const PGconn *conn);
- 如果conn 参数是NULL ,则PQport 返回NULL 。否则,如果在生成端口信息时发生错误(或许是连接没有被完全建立或者有什么错误),它会返回一个空字符串。
+ 如果 conn 参数为 NULL ,则 PQport 返回 NULL 。否则,如果在生成端口信息时发生错误(例如连接尚未完全建立,或出现了错误),则返回空字符串。
@@ -1278,7 +1275,9 @@ char *PQport(const PGconn *conn);
PQtty PQtty
- 返回连接的调试TTY 。(此设置已过时,因为服务器不再理会TTY 设置,但为保持向后兼容,仍保留了此函数。)
+
+ 返回该连接用于调试的TTY 。(此功能已过时,因为服务器不再使用TTY 设置,但为保持向后兼容仍保留此函数。)
+
char *PQtty(const PGconn *conn);
@@ -1290,7 +1289,7 @@ char *PQtty(const PGconn *conn);
- 返回被传递给连接请求的命令行选项。
+ 返回连接请求中传递的命令行选项。
char *PQoptions(const PGconn *conn);
@@ -1298,9 +1297,11 @@ char *PQoptions(const PGconn *conn);
-
+
- 以下函数返回的状态数据可能在执行操作时发生变化,这些操作针对PGconn 对象。
+
+ 以下函数返回的状态数据,可能随着对 PGconn 对象执行操作而改变。
+
PQstatus PQstatus
@@ -1336,7 +1337,7 @@ ConnStatusType PQstatus(const PGconn *conn);
PGTransactionStatusType PQtransactionStatus(const PGconn *conn);
- 该状态可能是PQTRANS_IDLE (当前空闲)、PQTRANS_ACTIVE (一个命令运行中)、PQTRANS_INTRANS (空闲,处于一个合法的事务块中)或者PQTRANS_INERROR (空闲,处于一个失败的事务块中)。如果该连接损坏,将会报告PQTRANS_UNKNOWN 。只有当一个查询已经被发送给服务器并且还没有完成时,才会报告PQTRANS_ACTIVE 。
+ 该状态可能是PQTRANS_IDLE (当前空闲)、PQTRANS_ACTIVE (一个命令运行中)、PQTRANS_INTRANS (空闲,处于一个有效的事务块中)或者PQTRANS_INERROR (空闲,处于一个失败的事务块中)。如果该连接异常,将会报告PQTRANS_UNKNOWN 。只有当一个查询已经被发送给服务器并且还没有完成时,才会报告PQTRANS_ACTIVE 。
@@ -1378,9 +1379,12 @@ const char *PQparameterStatus(const PGconn *conn, const char *paramName);
PQprotocolVersion PQprotocolVersion
- 查询正在使用的前端/后端协议。
+
+ 查询正在使用的前端/后端协议。
+
int PQprotocolVersion(const PGconn *conn);
- 应用程序可以使用此函数判断是否支持某些特性。目前可能的值为 2(协议 2.0)、3(协议 3.0)或零(连接无效)。连接启动完成后,协议版本不会改变,但理论上可能在重置连接时改变。与PostgreSQL 7.4 或更新版本的服务器通信时,通常使用协议 3.0;7.4 之前的服务器仅支持协议 2.0。(协议 1.0 已过时,且不被以下库支持:libpq 。)
+
+应用程序可以使用此函数判断是否支持某些特性。目前,可能的值为 2(协议 2.0)、3(协议 3.0)或零(连接异常)。连接启动完成后,协议版本不会改变,但理论上可能在连接重置期间改变。通常,与 PostgreSQL 7.4 或更高版本的服务器通信时使用协议 3.0;7.4 之前的服务器仅支持协议 2.0。(协议 1.0 已过时,libpq 不支持它。)
@@ -1401,11 +1405,11 @@ int PQserverVersion(const PGconn *conn);
- 在主版本10之前,PostgreSQL 采用一种由三个部分组成的版本号,其中前两部分共同表示主版本。对于那些版本,PQserverVersion 为每个部分使用两个数字,例如版本9.1.5将被返回为90105,而版本9.2.0将被返回为90200。
+ 在主版本10之前,PostgreSQL 采用一种由三个部分组成的版本号,其中前两部分共同表示主版本。对于那些版本,PQserverVersion 为每个部分使用两位数字,例如版本9.1.5将被返回为90105,而版本9.2.0将被返回为90200。
- 因此,出于判断特性兼容性的目的,应用应该将PQserverVersion 的结果除以100而不是10000来判断逻辑的主版本号。在所有的发行序列中,只有最后两个数字在次发行(问题修正发行)之间不同。
+ 因此,出于判断特性兼容性的目的,应用应该将PQserverVersion 的结果除以100而不是10000来判断逻辑的主版本号。在所有主版本系列中,各次版本(缺陷修复版本)之间只有最后两位数字不同。
@@ -1424,9 +1428,7 @@ char *PQerrorMessage(const PGconn *conn);
- 几乎所有的libpq 函数在失败时都会为PQerrorMessage 设置一个消息。
- 注意按照libpq 习惯,一个非空PQerrorMessage 结果可能由多行构成,并且将包括一个尾部新行。
- 调用者不应该直接释放结果。当相关的PGconn 句柄被传递给PQfinish 时,它将被释放。在PGconn 结构体上的多个操作之间,不能指望结果字符串会保持不变。
+ 几乎所有 libpq 函数在失败时都会设置一条供 PQerrorMessage 返回的消息。注意,按照 libpq 的约定,非空的 PQerrorMessage 结果可能包含多行,并以换行符结尾。调用者不应直接释放该结果;当关联的 PGconn 句柄被传给 PQfinish 时,结果会被释放。不能假定在对 PGconn 结构体执行其他操作后,结果字符串仍保持不变。
@@ -1435,7 +1437,7 @@ char *PQerrorMessage(const PGconn *conn);
PQsocket PQsocket
- 获得到服务器连接套接字的文件描述符号。一个合法的描述符将会大于等于零。结果为 -1 表示当前没有打开服务器连接(在普通操作期间这将不会改变,但是在连接设置或重置期间可能改变)。
+ 获取与服务器相连的套接字的文件描述符编号。有效描述符大于或等于 0。结果为 -1 表示当前没有打开服务器连接(在普通操作期间这将不会改变,但是在连接设置或重置期间可能改变)。
int PQsocket(const PGconn *conn);
@@ -1452,7 +1454,7 @@ int PQsocket(const PGconn *conn);
返回处理这个连接的后端进程的进程ID (PID)。
PID
确定服务器进程的 PID
- in libpq
+ 在 libpq 中
@@ -1461,7 +1463,7 @@ int PQbackendPID(const PGconn *conn);
- 后端PID 有助于调试目的并且可用于与NOTIFY 消息(它包括发出提示的后端进程的PID )进行比较。注意PID 属于一个在数据库服务器主机上执行的进程,而不是本地主机进程!
+ 后端 PID 可用于调试,也可与 NOTIFY 消息进行比较(消息包含发出通知的后端进程的 PID )。注意,该 PID 属于在数据库服务器主机上运行的进程,而非本地主机上的进程!
@@ -1500,15 +1502,17 @@ int PQconnectionUsedPassword(const PGconn *conn);
-
+
- 以下函数返回与 SSL 相关的信息。这些信息通常在连接建立后不会改变。
+
+ 以下函数返回与 SSL 相关的信息。这些信息通常在连接建立后不会改变。
+
PQsslInUse PQsslInUse
- 返回true(1)如果连接使用SSL,返回false(0)如果不使用。
+ 如果连接使用 SSL,则返回真(1);否则返回假(0)。
int PQsslInUse(const PGconn *conn);
@@ -1527,10 +1531,10 @@ const char *PQsslAttribute(const PGconn *conn, const char *attribute_name);
- 可用属性列表因使用的SSL库和连接类型而异。如果连接不使用SSL或指定的属性名称对于所使用的库未定义,则返回NULL。
+ 可用属性列表因所使用的 SSL 库和连接类型而异。如果某个属性不可用,则返回 NULL。
- 通常可以取得以下属性:
+ 通常可以获取以下属性:
library
@@ -1595,12 +1599,14 @@ const char * const * PQsslAttributeNames(const PGconn *conn);
PQsslStruct PQsslStruct
- 返回一个指向描述连接的SSL实现特定对象的指针。如果连接未加密或SSL实现不提供连接的请求对象类型,则返回NULL。
+ 返回指向描述此连接的对象的指针,该对象的类型由 SSL 实现决定。
void *PQsslStruct(const PGconn *conn, const char *struct_name);
- 可用的结构体取决于所使用的 SSL 实现。对于 OpenSSL,有一个名为 "OpenSSL" 的结构体,取得它时会返回指向 OpenSSLSSL 结构体的指针。可以使用类似以下的代码来调用此函数:
+ 可用的结构体取决于所使用的 SSL 实现。对于 OpenSSL,可以通过名称 "OpenSSL" 获取一个结构体,函数返回指向 OpenSSL 的 SSL 结构体的指针。可以使用如下代码调用此函数:
+
#include
@@ -1642,7 +1648,7 @@ void *PQgetssl(const PGconn *conn);
-
+
@@ -1650,7 +1656,7 @@ void *PQgetssl(const PGconn *conn);
命令执行函数
- 一旦到一个数据库服务器的连接被成功建立,这里描述的函数可以被用来执行 SQL 查询和命令。
+ 与数据库服务器的连接成功建立后,此处描述的函数用于执行 SQL 查询和命令。
@@ -1671,11 +1677,8 @@ PGresult *PQexec(PGconn *conn, const char *command);
- 返回一个PGresult 指针或者可能是一个空指针。
- 除了内存不足的情况或者由于严重错误无法将命令发送给服务器之外,一般都会返回一个非空指针。
- PQresultStatus 函数应当被调用来检查返回值是否代表错误(包括空指针的值,它会返回PGRES_FATAL_ERROR )。
- 用PQerrorMessage 可得到关于那些错误的详细信息。
-
+ 返回一个 PGresult 指针,也可能返回空指针。除内存不足或无法向服务器发送命令等严重错误外,通常都会返回非空指针。应调用 PQresultStatus 函数检查返回值是否表示错误(也应检查空指针,此时该函数返回 PGRES_FATAL_ERROR )。使用 PQerrorMessage 获取此类错误的更多信息。
+
命令字符串可以包含多个 SQL 命令(以分号分隔)。在一次PQexec 调用中发送的多个查询会在同一个事务中处理,除非查询字符串中显式包含BEGIN /COMMIT 命令,将其划分为多个事务。(有关服务器如何处理多查询字符串的详细信息,请参见 。)但要注意,返回的PGresult 结构体只描述该字符串中最后执行的命令的结果。如果其中一条命令失败,就会在此处停止处理该字符串,返回的PGresult 则描述该错误。
@@ -1748,8 +1751,8 @@ PGresult *PQexecParams(PGconn *conn,
paramValues[]
- 指定参数的实际值。这个数组中的一个空指针表示对应的参数为空,否则该指针指向一个以零终止的文本字符串(用于文本格式)或者以服务器所期待格式的二进制数据(用于二进制格式)。
-
+ 指定参数的实际值。数组中的空指针表示对应参数为 null;否则,指针指向以零结尾的文本字符串(文本格式),或采用服务器所要求格式的二进制数据(二进制格式)。
+
@@ -1757,8 +1760,8 @@ PGresult *PQexecParams(PGconn *conn,
paramLengths[]
- 指定二进制格式参数的实际数据长度。它对空参数和文本格式参数被忽略。当没有二进制参数时,该数组指针可以为空。
-
+ 指定二进制格式参数的实际数据长度。对于 null 参数和文本格式参数,该值会被忽略。如果没有二进制参数,数组指针可以为空指针。
+
@@ -1766,11 +1769,11 @@ PGresult *PQexecParams(PGconn *conn,
paramFormats[]
- 指定参数是否为文本(在参数相应的数组项中放一个零)或二进制(在参数相应的数组项中放一个一)。如果该数组指针为空,那么所有参数都会被假定为文本串。
-
+ 指定参数采用文本格式(在对应数组元素中填入零)还是二进制格式(填入一)。如果数组指针为空指针,则将所有参数视为文本字符串。
+
- 以二进制格式传递的值要求后端所期待的内部表示形式的知识。例如,整数必须以网络字节序被传递。传递numeric 值要求关于服务器存储格式的知识,正如src/backend/utils/adt/numeric.c::numeric_send() 以及src/backend/utils/adt/numeric.c::numeric_recv() 中所实现的。
-
+ 以二进制格式传递值时,需要了解后端所要求的内部表示形式。例如,整数必须以网络字节序传递。传递 numeric 值时,需要了解服务器的存储格式,其实现见 src/backend/utils/adt/numeric.c::numeric_send() 和 src/backend/utils/adt/numeric.c::numeric_recv() 。
+
@@ -1778,8 +1781,8 @@ PGresult *PQexecParams(PGconn *conn,
resultFormat
- 指定零来得到文本格式的结果,或者指定一来得到二进制格式的结果(目前没有规定要求以不同格式得到不同的结果列,尽管在底层协议中这是可以实现的)。
-
+ 指定零以获取文本格式的结果,指定一以获取二进制格式的结果。(目前无法让不同结果列使用不同格式,尽管底层协议支持这样做。)
+
@@ -1789,7 +1792,9 @@ PGresult *PQexecParams(PGconn *conn,
- PQexecParams 相对于 PQexec 的主要优点是可以将参数值与命令字符串分开,从而避免繁琐且容易出错的加引号和转义工作。
+
+ PQexecParams 相对于 PQexec 的主要优点是可以将参数值与命令字符串分开,从而避免繁琐且容易出错的加引号和转义工作。
+
和PQexec 不同,PQexecParams 至多允许在给定串中出现一个 SQL 命令(其中可以有分号,但是不能有超过一个非空命令)。这是底层协议的一个限制,但是有助于抵抗 SQL 注入攻击。
@@ -1798,12 +1803,12 @@ PGresult *PQexecParams(PGconn *conn,
- 通过 OID 指定参数类型很罗嗦,特别是如果你不愿意将特定的 OID 值硬编码到你的程序中时。不过,即使服务器本身也无法确定参数的类型,你可以避免这样做,或者选择一种与你想要的不同的类型。在 SQL 命令文本中,附加一个显式类型转换给参数符号来表示你将发送什么样的数据类型。例如:
+ 通过 OID 指定参数类型较为繁琐,尤其是在不希望将具体 OID 值写死在程序中时。不过,即使服务器无法自行确定参数类型,或者推断出的类型与你所需的不同,也可以避免直接指定 OID。在 SQL 命令文本中,为参数符号添加显式类型转换,即可指定要发送的数据类型。例如:
SELECT * FROM mytable WHERE x = $1::bigint;
- 这强制参数$1 被当作bigint ,而默认情况下它将被赋予与x 相同的类型。当以二进制格式发送参数值时,我们强烈推荐以这种方式或通过指定一个数字类型的 OID 来强制参数类型决定。因为二进制格式比文本格式具有更少的冗余,并且因此服务器将不会有更多机会为你检测一个类型匹配错误。
-
+这会强制将参数 $1 当作 bigint ,而默认情况下会为它分配与 x 相同的类型。以二进制格式发送参数值时,强烈建议采用这种方式,或直接指定类型的数值 OID,来明确决定参数类型。因为二进制格式的冗余比文本格式更少,服务器发现类型不匹配错误的机会也更少。
+
@@ -1823,13 +1828,15 @@ PGresult *PQprepare(PGconn *conn,
- PQprepare 创建一个后面会由PQexecPrepared 执行的预备语句。 这个特性允许命令被反复执行而无需每次都进行解析和规划,详见 。 PQprepare 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
+
+ PQprepare 创建一个预备语句,供随后使用 PQexecPrepared 执行。 这个特性允许命令被反复执行而无需每次都进行解析和规划,详见 。 PQprepare 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
+
该函数从query 串创建一个名为stmtName 的预备语句,该串必须包含一个单一 SQL 命令。
stmtName 可以是"" 来创建一个未命名语句,在这种情况下任何已存在未命名语句将被自动替换。
否则,如果语句名称已经在当前会话中被定义,则是一种错误。如果使用了任何参数,它们在查询中以$1 、$2 等引用。
- nParams 是参数的个数,其类型在数组paramTypes[] 中被预先指定(当nParams 为零时,该数组指针可以是NULL )。
+ nParams 是在数组 paramTypes[] 中预先指定了类型的参数数量(当nParams 为零时,该数组指针可以是NULL )。
paramTypes[] 通过 OID 指定要赋予给参数符号的数据类型。
如果paramTypes 是NULL 或者该数组中任何特定元素为零,服务器会用对待未指定类型的字符串字面量的方式为参数符号推测一种数据类型。
还有,查询能够使用编号高于nParams 的参数符号,它们的数据类型也会被自动推测(找出推测出的数据类型的方法见PQdescribePrepared )。
@@ -1837,7 +1844,7 @@ PGresult *PQprepare(PGconn *conn,
正如PQexec 一样,结果通常是一个PGresult 对象,其内容代表服务器端成功或失败。
- 一个空结果表示内存不足或者根本无法发送命令。关于错误的更多信息请见PQerrorMessage 。
+ 返回空指针表示内存不足,或者根本无法发送命令。关于错误的更多信息请见PQerrorMessage 。
@@ -1862,7 +1869,7 @@ PGresult *PQexecPrepared(PGconn *conn,
- PQexecPrepared 类似于PQexecParams , 但要执行的命令是通过指定先前准备好的语句来指定,而不是提供查询字符串。 此功能允许重复使用的命令只被解析和计划一次,而不是每次执行时都要进行。 该语句必须在当前会话中先前准备好。 PQexecPrepared 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
+ PQexecPrepared 类似于PQexecParams , 但它通过已创建的预备语句的名称指定要执行的命令,而非提供查询字符串。 此功能使重复使用的命令只需解析和规划一次,而不必在每次执行时都进行这些工作。 该语句必须事先在当前会话中创建为预备语句。 PQexecPrepared 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
参数与PQexecParams 相同,只是给出了预备语句的名称而不是查询字符串,
@@ -1876,21 +1883,21 @@ PGresult *PQexecPrepared(PGconn *conn,
- 提交请求以获取有关指定准备好的语句的信息,并等待完成。
+ 提交请求以获取有关指定预备语句的信息,并等待完成。
PGresult *PQdescribePrepared(PGconn *conn, const char *stmtName);
- PQdescribePrepared 允许应用程序获取关于先前准备的语句的信息。 PQdescribePrepared 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
+ PQdescribePrepared 允许应用程序获取关于先前创建的预备语句的信息。 PQdescribePrepared 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
stmtName 可以是"" 或NULL 来引用
- 未命名的语句,否则必须是现有准备好的语句的名称。成功时,返回一个
+ 未命名的语句,否则必须是现有预备语句的名称。成功时,返回一个
状态为PGRES_COMMAND_OK 的PGresult 。
函数PQnparams 和
PQparamtype 可以应用于此
- PGresult 以获取有关准备语句参数的信息,
+ PGresult 以获取有关预备语句参数的信息,
函数PQnfields 、PQfname 、
PQftype 等提供有关语句的结果列(如果有)的信息。
@@ -1902,13 +1909,15 @@ PGresult *PQdescribePrepared(PGconn *conn, const char *stmtName);
- 提交请求以获取有关指定门户的信息,并等待完成。
+ 提交请求以获取有关指定 portal 的信息,并等待完成。
PGresult *PQdescribePortal(PGconn *conn, const char *portalName);
- PQdescribePortal 允许应用程序获取有关先前创建的 portal 的信息。 (libpq 不直接提供对 portal 的访问,但你可以使用此函数检查通过DECLARE CURSOR SQL 命令创建的游标的属性。) PQdescribePortal 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
+
+ PQdescribePortal 允许应用程序获取先前创建的 portal 的信息。(libpq 不提供对 portal 的直接访问,但可以用此函数检查通过 DECLARE CURSOR SQL 命令创建的游标的属性。) PQdescribePortal 仅支持使用协议 3.0 及更高版本的连接;使用协议 2.0 时会失败。
+
portalName 可以是"" 或NULL 来引用未命名的 portal,
@@ -1921,7 +1930,9 @@ PGresult *PQdescribePortal(PGconn *conn, const char *portalName);
- 该PGresult PGresult 结构体封装服务器返回的结果。libpq 应用程序的开发者应注意保持PGresult 的抽象性。请使用下面的访问函数获取PGresult 的内容。避免直接引用PGresult 结构体的字段,因为这些字段以后可能改变。
+
+ PGresult PGresult 结构体封装服务器返回的结果。编写 libpq 应用程序时,应注意维护 PGresult 的抽象。请使用下述访问函数获取 PGresult 的内容。避免直接引用 PGresult 结构体的字段,因为这些字段将来可能改变。
+
PQresultStatus PQresultStatus
@@ -2020,7 +2031,7 @@ ExecStatusType PQresultStatus(const PGresult *res);
PGRES_SINGLE_TUPLE
- PGresult 包含来自于当前命令的一个单一结果元组。这个状态只在查询选择了单一行模式时发生(见 )。
+ PGresult 包含来自于当前命令的一个单一结果元组。这个状态只在查询选择了单行模式时发生(见 )。
@@ -2037,10 +2048,12 @@ ExecStatusType PQresultStatus(const PGresult *res);
PQresStatus PQresStatus
- 将PQresultStatus 返回的枚举值转换为描述该状态码的字符串常量。调用者不应释放此结果。
+
+ 将 PQresultStatus 返回的枚举值转换为描述该状态码的字符串常量。调用者不应释放此结果。
+
char *PQresStatus(ExecStatusType status);
-
+
@@ -2048,10 +2061,13 @@ char *PQresStatus(ExecStatusType status);
PQresultErrorMessage PQresultErrorMessage
- 返回与命令关联的错误消息;如果没有错误,则返回空字符串。
+
+ 返回与命令关联的错误消息;如果没有错误,则返回空字符串。
+
char *PQresultErrorMessage(const PGresult *res);
- 如果发生了错误,返回的字符串会包含末尾换行符。调用者不应直接释放结果。在将关联的PGresult 句柄传给以下函数时,会释放该结果:PQclear 。
-
+
+如果发生了错误,返回的字符串会以换行符结尾。调用者不应直接释放结果;当关联的 PGresult 句柄被传给 PQclear 时,结果会被释放。
+
紧跟着一个PQexec 或 PQgetResult 调用,PQerrorMessage (在连接上)将返回与PQresultErrorMessage 相同的字符串(在结果上)。
@@ -2066,11 +2082,15 @@ char *PQresultErrorMessage(const PGresult *res);
PQresultVerboseErrorMessage PQresultVerboseErrorMessage
- 返回与PGresult 对象关联的错误消息的重新格式化版本。
+
+ 返回与 PGresult 对象关联的错误消息的重新格式化版本。
+
char *PQresultVerboseErrorMessage(const PGresult *res,
PGVerbosity verbosity,
PGContextVisibility show_context);
- 某些情况下,客户端可能希望取得之前报告的错误的更详细版本。PQresultVerboseErrorMessage 可以满足这一需求:它计算以下函数本应生成的消息:PQresultErrorMessage ,假设在生成给定的PGresult 时,连接已经采用指定的详细程度设置。如果PGresult 不是错误结果,则改为报告PGresult is not an error result
。返回的字符串包含末尾换行符。
+
+有时客户端希望获取先前报告过的错误的更详细版本。PQresultVerboseErrorMessage 可满足这一需求:它按指定的详细程度设置重新生成消息。假如在生成给定 PGresult 时,连接已经采用这些设置,那么 PQresultErrorMessage 返回的就会是这条消息。如果 PGresult 不是错误结果,则改为报告 PGresult is not an error result
。返回的字符串以换行符结尾。
+
和大部分从PGresult 中提取数据的其他函数不同,这个函数的结果是一个全新分配的字符串。调用者在不需要这个字符串以后,必须使用PQfreemem() 释放它。
@@ -2085,18 +2105,20 @@ char *PQresultVerboseErrorMessage(const PGresult *res,
PQresultErrorField PQresultErrorField
- 返回错误报告中的单个字段。
+
+ 返回错误报告中的单个字段。
+
char *PQresultErrorField(const PGresult *res, int fieldcode);
- fieldcode 是错误字段标识符,参见下文列出的符号。NULL 会在以下情况下返回:PGresult 不是错误或警告结果,或者不包含指定字段。字段值通常不含末尾换行符。调用者不应直接释放结果。在将关联的PGresult 句柄传给以下函数时,会释放该结果:PQclear 。
-
+fieldcode 是错误字段标识符,参见下文列出的符号。如果 PGresult 不是错误或警告结果,或者不包含指定字段,则返回 NULL 。字段值通常不含末尾换行符。调用者不应直接释放结果;当关联的 PGresult 句柄被传给 PQclear 时,结果会被释放。
+
可以使用以下字段代码:
PG_DIAG_SEVERITY
- 严重性。域的内容是ERROR 、FATAL 或PANIC (在一个错误消息中)。或者是WARNING 、NOTICE 、DEBUG 、INFO 或LOG (在一个提示消息中)。或者是其中之一的一个本地化翻译。总是存在。
+ 严重性。字段的内容是ERROR 、FATAL 或PANIC (在一个错误消息中)。或者是WARNING 、NOTICE 、DEBUG 、INFO 或LOG (在一个提示消息中)。或者是其中之一的一个本地化翻译。总是存在。
@@ -2105,16 +2127,16 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_SEVERITY_NONLOCALIZED
- 域的内容是ERROR 、FATAL 或PANIC (在一个错误消息中)。或者是WARNING 、NOTICE 、DEBUG 、INFO 或LOG (在一个提示消息中)。这和PG_DIAG_SEVERITY 域相同,不过内容不会被本地化。只存在于PostgreSQL 9.6 版本以后产生的报告中。
+ 严重性。字段的内容是ERROR 、FATAL 或PANIC (在一个错误消息中)。或者是WARNING 、NOTICE 、DEBUG 、INFO 或LOG (在一个提示消息中)。这和PG_DIAG_SEVERITY 字段相同,不过内容不会被本地化。只存在于PostgreSQL 9.6 及更高版本产生的报告中。
- PG_DIAG_SQLSTATE error codes libpq
+ PG_DIAG_SQLSTATE 错误码 libpq
- 用于错误的 SQLSTATE 代码。SQLSTATE 代码标识了已经发生的错误的类型,它可以被前端应用用来执行特定操作(例如错误处理)来响应一个特定数据库错误。一个可能的 SQLSTATE 代码列表可见 。这个域无法被本地化,并且总是存在。
+ 用于错误的 SQLSTATE 代码。SQLSTATE 代码标识了已经发生的错误的类型,它可以被前端应用用来执行特定操作(例如错误处理)来响应一个特定数据库错误。一个可能的 SQLSTATE 代码列表可见 。这个字段无法被本地化,并且总是存在。
@@ -2141,7 +2163,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_MESSAGE_HINT
- 提示:一个关于如何处理该问题的可选建议。它与细节的区别在于它提供了建议(可能不合适)而不是铁的事实。可能有多行。
+ 提示:一个关于如何处理该问题的可选建议。它与细节的区别在于它提供了建议(可能不合适)而不是确切事实。可能有多行。
@@ -2159,7 +2181,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_INTERNAL_POSITION
- 这被定义为与PG_DIAG_STATEMENT_POSITION 域相同,但是它被用在游标位置引用一个内部产生的命令而不是客户端提交的命令时。当这个域出现时,PG_DIAG_INTERNAL_QUERY 域将总是出现。
+ 这被定义为与PG_DIAG_STATEMENT_POSITION 字段相同,但是它被用在游标位置引用一个内部产生的命令而不是客户端提交的命令时。当这个字段出现时,PG_DIAG_INTERNAL_QUERY 字段将总是出现。
@@ -2177,7 +2199,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_CONTEXT
- 指示错误发生的环境。当前这包括活动过程语言函数的调用栈追踪以及内部生成的查询。追踪是每行一项,最近的排在最前面。
+ 指示错误发生的上下文。当前这包括活动过程语言函数的调用栈追踪以及内部生成的查询。追踪是每行一项,最近的排在最前面。
@@ -2195,7 +2217,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_TABLE_NAME
- 如果错误与某个特定表相关,这里是该表的名字(该表的模式参考模式名域)。
+ 如果错误与某个特定表相关,这里是该表的名字(该表的模式参考模式名字段)。
@@ -2204,7 +2226,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_COLUMN_NAME
- 如果错误与一个特定表列相关,这里是该表列的名字(参考模式和表名域来标识该表)。
+ 如果错误与一个特定表列相关,这里是该表列的名字(参考模式和表名字段来标识该表)。
@@ -2213,7 +2235,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_DATATYPE_NAME
- 如果错误与一个特定数据类型相关,这里是该数据了行的名字(该数据类型的模式名参考模式名域)。
+ 如果错误与一个特定数据类型相关,这里是该数据类型的名字(该数据类型的模式名参考模式名字段)。
@@ -2222,7 +2244,7 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PG_DIAG_CONSTRAINT_NAME
- 如果错误与一个特定约束相关,这里是该约束的名字。相关的表或域参考上面列出的域(为了这个目的,索引也被视作约束,即使它们不是用约束语法创建的)。
+ 如果错误与一个特定约束相关,这里是该约束的名字。相关的表或域参考上面列出的字段(为了这个目的,索引也被视作约束,即使它们不是用约束语法创建的)。
@@ -2258,12 +2280,12 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
- 用于模式名、表名、列名、数据类型名和约束名的域只提供给有限的错误类型,见 。不要假定任何这些域的存在保证另一个域的存在。核心错误源会遵守上面提到的内在联系,但是用户定义的函数可能以其他方式使用这些域。同样地,不要假定这些域代表当前数据库中同类的对象。
+ 用于模式名、表名、列名、数据类型名和约束名的字段只提供给有限的错误类型,见 。不要假定任何这些字段的存在保证另一个字段的存在。核心错误源会遵守上面提到的内在联系,但是用户定义的函数可能以其他方式使用这些字段。同样地,不要假定这些字段代表当前数据库中现存的对象。
- 客户端负责格式化显示信息来迎合它的需要,特别是根据需要打断长的行。出现在错误消息域中的新行字符应该被当作分段而不是换行。
+ 客户端负责按自身需要格式化所显示的信息,尤其应在需要时将长行折行。错误消息字段中的换行符应当视为段落分隔,而非行分隔。
libpq 内部产生的错误包含严重性和主要消息,但通常没有其他字段。使用 3.0 之前协议的服务器返回的错误包含严重性和主要消息,有时还包含详细消息,但没有其他字段。
@@ -2277,10 +2299,12 @@ char *PQresultErrorField(const PGresult *res, int fieldcode);
PQclear PQclear
- 释放与PGresult 关联的存储空间。每个命令结果都应通过PQclear 在不再需要结果时将其释放。
+
+ 释放与 PGresult 关联的存储空间。每个命令结果在不再需要时都应通过 PQclear 释放。
+
void PQclear(PGresult *res);
-
+
你可以在需要时一直保留PGresult 对象;它不会在你发出新命令时消失,甚至在关闭连接后也不会消失。要销毁它,你必须调用PQclear 。否则应用程序会发生内存泄漏。
@@ -2288,15 +2312,15 @@ void PQclear(PGresult *res);
-
+
检索查询结果信息
- 这些函数被用来从一个代表成功查询结果(也就是状态为PGRES_TUPLES_OK 或者PGRES_SINGLE_TUPLE )的PGresult 对象中抽取信息。它们也可以被用来从一个成功的 Describe 操作中抽取信息:一个 Describe 的结果具有和该查询被实际执行所提供的完全相同的列信息,但是它没有行。对于其他状态值的对象,这些函数会认为结果具有零行和零列。
-
+ 这些函数用于从表示成功查询结果的 PGresult 对象中提取信息,即状态为 PGRES_TUPLES_OK 或 PGRES_SINGLE_TUPLE 的对象。它们也可用于提取成功 Describe 操作的结果信息:Describe 结果包含的列信息与实际执行查询时相同,但行数为零。对于其他状态值的对象,这些函数会将结果视为零行、零列。
+
@@ -2321,7 +2345,7 @@ int PQntuples(const PGresult *res);
- 返回查询结果中每一行的列(域)数。
+ 返回查询结果中每一行的列(字段)数。
int PQnfields(const PGresult *res);
@@ -2334,7 +2358,8 @@ int PQnfields(const PGresult *res);
PQfname PQfname
- 返回给定列号对应的列名。列号从 0 开始。调用者不应直接释放结果。在将关联的PGresult 句柄传给以下函数时,会释放该结果:PQclear 。
+
+ 返回给定列号对应的列名。列号从 0 开始。调用者不应直接释放结果;当关联的 PGresult 句柄被传给 PQclear 时,结果会被释放。
char *PQfname(const PGresult *res,
int column_number);
@@ -2365,11 +2390,11 @@ int PQfnumber(const PGresult *res,
- 给定的名称被视作一个 SQL 命令中的一个标识符,也就是说,除非被双引号引用,它是小写形式的。例如,给定一个 SQL 命令:
+ 给定名称按 SQL 命令中的标识符处理,即除非用双引号引用,否则会转换为小写。例如,对于以下 SQL 命令生成的查询结果:
SELECT 1 AS FOO, 2 AS "BAR";
- 我们将得到结果:
+会得到以下结果:
PQfname(res, 0) foo
PQfname(res, 1) BAR
@@ -2387,7 +2412,7 @@ PQfnumber(res, "\"BAR\"") 1
- 返回给定列从中取出的表的 OID。列号从 0 开始。
+ 返回给定列所取自的表的 OID。列号从 0 开始。
Oid PQftable(const PGresult *res,
int column_number);
@@ -2396,7 +2421,9 @@ Oid PQftable(const PGresult *res,
如果列号超出范围、指定的列不是对表列的简单引用,或者使用 3.0 之前的协议,则返回 InvalidOid 。可以查询系统表 pg_class ,确定所引用的具体表。
- 包含 libpq 头文件后,将定义类型 Oid 和常量 InvalidOid 。它们都属于某种整数类型。
+
+ 包含 libpq 头文件后,将定义类型 Oid 和常量 InvalidOid 。它们都属于某种整数类型。
+
@@ -2405,7 +2432,7 @@ Oid PQftable(const PGresult *res,
- 返回构成指定查询结果列的列(在其表中)的列号。查询结果列号从 0 开始,但是表列具有非零编号。
+ 返回指定查询结果列所对应的表列在表中的列号。查询结果的列号从 0 开始,而表列的编号非零。
int PQftablecol(const PGresult *res,
int column_number);
@@ -2422,7 +2449,7 @@ int PQftablecol(const PGresult *res,
- 返回指示给定列格式的格式编码。列号从 0 开始。
+ 返回表示给定列格式的格式代码。列号从 0 开始。
int PQfformat(const PGresult *res,
int column_number);
@@ -2430,7 +2457,7 @@ int PQfformat(const PGresult *res,
- 格式代码零指示文本数据表示,而格式代码一表示二进制表示(其他代码被保留用于未来的定义)。
+ 格式代码零表示文本数据,格式代码一表示二进制数据。(其他代码保留供将来定义。)
@@ -2457,7 +2484,7 @@ Oid PQftype(const PGresult *res,
- 返回与给定列号相关联的列的修饰符类型。列号从 0 开始。
+ 返回与给定列号相关联的列的类型修饰符。列号从 0 开始。
int PQfmod(const PGresult *res,
int column_number);
@@ -2465,7 +2492,7 @@ int PQfmod(const PGresult *res,
- 修饰符值的解释是与类型相关的,它们通常指示精度或尺寸限制。值 -1 被用来指示没有信息可用
。大部分的数据类型不适用修饰符,在那种情况中值总是 -1。
+ 修饰符值的含义由数据类型决定,通常表示精度或大小限制。值 -1 表示没有可用信息
。大多数数据类型不使用修饰符,此时该值始终为 -1。
@@ -2475,7 +2502,7 @@ int PQfmod(const PGresult *res,
- 返回与给定列号相关的列的尺寸(以字节计)。列号从 0 开始。
+ 返回给定列号对应列的大小,以字节计。列号从 0 开始。
int PQfsize(const PGresult *res,
int column_number);
@@ -2483,7 +2510,7 @@ int PQfsize(const PGresult *res,
- PQfsize 返回在一个数据库行中为这个列分配的空间,换句话说是服务器对该数据类型的内部表示的尺寸(因此,它对客户端并不是真地非常有用)。一个负值指示该数据类型是变长的。
+ PQfsize 返回数据库行中为该列分配的空间,即服务器内部表示该数据类型所需的大小。(因此,它对客户端用处不大。)负值表示该数据类型是变长类型。
@@ -2500,8 +2527,7 @@ int PQbinaryTuples(const PGresult *res);
- 这个函数已经被废弃(除了与COPY 一起使用),因为一个单一PGresult 可以在某些列中包含文本数据而且在另一些列中包含二进制数据。
- PQfformat 要更好。只有结果的所有列是二进制(格式 1)时PQbinaryTuples 才返回 1。
+ 此函数已弃用(与 COPY 配合使用的情况除外),因为单个 PGresult 可能在部分列中包含文本数据,而在其他列中包含二进制数据。推荐使用 PQfformat 。只有结果中的所有列都采用二进制格式(格式 1)时,PQbinaryTuples 才返回 1。
@@ -2510,7 +2536,8 @@ int PQbinaryTuples(const PGresult *res);
PQgetvalue PQgetvalue
- 返回以下结果中某一行的一个字段值:PGresult 。行号和列号都从 0 开始。调用者不应直接释放结果。在将关联的PGresult 句柄传给以下函数时,会释放该结果:PQclear 。
+
+ 返回 PGresult 中某一行的单个字段值。行号和列号从 0 开始。调用者不应直接释放结果;当关联的 PGresult 句柄被传给 PQclear 时,结果会被释放。
char *PQgetvalue(const PGresult *res,
int row_number,
@@ -2518,24 +2545,26 @@ char *PQgetvalue(const PGresult *res,
- 对于文本格式的数据,PQgetvalue 返回字段值的字符串表示,以零字节结尾。对于二进制格式的数据,返回值采用该数据类型的 typsend 和 typreceive 函数所决定的二进制表示。(这种情况下,值后面实际上也有一个零字节,但通常没有用处,因为值本身很可能包含零字节。)
+
+ 对于文本格式的数据,PQgetvalue 返回字段值的字符串表示,以零字节结尾。对于二进制格式的数据,返回值采用该数据类型的 typsend 和 typreceive 函数所决定的二进制表示。(这种情况下,值后面实际上也有一个零字节,但通常没有用处,因为值本身很可能包含零字节。)
+
- 如果该域值为空,则返回一个空串。关于区分空值和空字符串值请见PQgetisnull 。
+ 如果字段值为 null,则返回空字符串。关于如何区分 null 值与空字符串值,参见 PQgetisnull 。
- PQgetvalue 返回的指针指向作为PGresult 结构体一部分的存储。我们不应该修改它指向的数据,并且如果要在超过PGresult 结构体本身的生命期之外使用它,我们必须显式地把该数据拷贝到其他存储中。
+ PQgetvalue 返回的指针指向属于 PGresult 结构体的存储空间。不应修改它所指向的数据;如果需要在 PGresult 结构体的生命周期结束后继续使用这些数据,就必须显式地将数据复制到其他存储空间。
- PQgetisnull PQgetisnull null value in libpq
+ PQgetisnull PQgetisnull null 值 libpq 中的
- 测试一个域是否为空值。行号和列号从 0 开始。
+ 检查字段是否为 null 值。行号和列号从 0 开始。
int PQgetisnull(const PGresult *res,
int row_number,
@@ -2544,7 +2573,7 @@ int PQgetisnull(const PGresult *res,
- 如果该域是空,这个函数返回 1。如果它包含一个非空值,则返回 0(注意PQgetvalue 将为一个空域返回一个空串,不是一个空指针)。
+ 如果字段为 null,此函数返回 1;如果包含非 null 值,则返回 0。(注意,对于 null 字段,PQgetvalue 返回空字符串,而非空指针。)
@@ -2554,7 +2583,7 @@ int PQgetisnull(const PGresult *res,
- 返回一个域值的真实长度,以字节计。行号和列号从 0 开始。
+ 返回字段值的实际长度,以字节计。行号和列号从 0 开始。
int PQgetlength(const PGresult *res,
int row_number,
@@ -2563,9 +2592,7 @@ int PQgetlength(const PGresult *res,
- 这是特定数据值的真实数据长度,也就是PQgetvalue 指向的对象的尺寸。
- 对于文本数据格式,这和strlen() 相同。对于二进制格式这是基本信息。
- 注意我们不 应该依赖于PQfsize 来得到实际的数据长度。
+ 这是该数据值的实际数据长度,即 PQgetvalue 所指对象的大小。对于文本格式的数据,它与 strlen() 的结果相同。对于二进制格式,这是必不可少的信息。注意,不应 依赖 PQfsize 来获取实际数据长度。
@@ -2610,29 +2637,29 @@ Oid PQparamtype(const PGresult *res, int param_number);
- 将所有的行打印到指定的输出流,以及有选择地将列名打印到指定的输出流。
+ 将所有行输出到指定的输出流,并可选择输出列名。
void PQprint(FILE *fout, /* 输出流 */
const PGresult *res,
const PQprintOpt *po);
typedef struct
{
- pqbool header; /* 打印输出域标题和行计数 */
- pqbool align; /* 填充对齐域 */
- pqbool standard; /* 旧的格式 */
+ pqbool header; /* 打印输出字段标题和行数 */
+ pqbool align; /* 填充并对齐字段 */
+ pqbool standard; /* 旧的简陋格式 */
pqbool html3; /* 输出 HTML 表格 */
- pqbool expanded; /* 扩展表格 */
- pqbool pager; /* 如果必要为输出使用页 */
- char *fieldSep; /* 域分隔符 */
+ pqbool expanded; /* 展开表格 */
+ pqbool pager; /* 需要时使用分页器输出 */
+ char *fieldSep; /* 字段分隔符 */
char *tableOpt; /* 用于 HTML 表格元素的属性 */
char *caption; /* HTML 表格标题 */
- char **fieldName; /* 替换域名称的空终止数组 */
+ char **fieldName; /* 以空指针结尾的替换字段名数组 */
} PQprintOpt;
- 这个函数以前被psql 用来打印查询结果,但是现在不是这样了。注意它假定所有的数据都是文本格式。
+ psql 以前用此函数打印查询结果,现在已不再使用。注意,此函数假定所有数据都是文本格式。
@@ -2675,7 +2702,9 @@ char *PQcmdTuples(PGresult *res);
- 此函数返回一个字符串,其中包含产生该 PGresult 的 SQL 语句所影响的行数。此函数只能在执行 SELECT 、CREATE TABLE AS 、INSERT 、UPDATE 、DELETE 、MOVE 、FETCH 或 COPY 语句之后使用,也可以在对包含 INSERT 、UPDATE 或 DELETE 语句的预备查询执行 EXECUTE 之后使用。如果产生 PGresult 的是其他命令,PQcmdTuples 将返回空字符串。调用者不应直接释放返回值;将关联的 PGresult 句柄传给 PQclear 时,它会被释放。
+
+ 此函数返回一个字符串,其中包含产生该 PGresult 的 SQL 语句所影响的行数。此函数只能在执行 SELECT 、CREATE TABLE AS 、INSERT 、UPDATE 、DELETE 、MOVE 、FETCH 或 COPY 语句之后使用,也可以在对包含 INSERT 、UPDATE 或 DELETE 语句的预备查询执行 EXECUTE 之后使用。如果产生 PGresult 的是其他命令,PQcmdTuples 将返回空字符串。调用者不应直接释放返回值;当关联的 PGresult 句柄被传给 PQclear 时,返回值会被释放。
+
@@ -2685,7 +2714,7 @@ char *PQcmdTuples(PGresult *res);
- 如果该SQL 命令是一个正好将一行插入到具有 OID 的表的INSERT ,或者是一个包含合适INSERT 语句的预备查询的EXECUTE ,这个函数返回被插入行的 OIDOID in libpq 。否则,这个函数返回InvalidOid 。如果被INSERT 语句影响的表不包含 OID,这个函数也将返回InvalidOid 。
+ 如果该SQL 命令是一个正好将一行插入到具有 OID 的表的INSERT ,或者是一个包含合适INSERT 语句的预备查询的EXECUTE ,这个函数返回被插入行的 OIDOID libpq 中的 。否则,这个函数返回InvalidOid 。如果被INSERT 语句影响的表不包含 OID,这个函数也将返回InvalidOid 。
Oid PQoidValue(const PGresult *res);
@@ -2697,7 +2726,9 @@ Oid PQoidValue(const PGresult *res);
PQoidStatus PQoidStatus
- 此函数已弃用,推荐使用PQoidValue ,且此函数不是线程安全的。它返回包含插入行 OID 的字符串,而PQoidValue 返回 OID 值。
+
+ 此函数不是线程安全的,现已弃用,推荐改用 PQoidValue 。它返回包含插入行 OID 的字符串,而 PQoidValue 返回 OID 值。
+
char *PQoidStatus(const PGresult *res);
@@ -2713,7 +2744,7 @@ char *PQoidStatus(const PGresult *res);
转义字符串
- in libpq
+ libpq 中的
@@ -2729,17 +2760,13 @@ char *PQescapeLiteral(PGconn *conn, const char *str, size_t length);
为了让一个字符串可用于 SQL 命令,PQescapeLiteral 会对它进行转义。
- 当在 SQL 命令中把数据值作为字符串字面量插入时,这个函数很有用。一些字符(例如引号和反斜线)必须经过转义,才不会被 SQL 解析器解释成特殊含义。
+ 当在 SQL 命令中把数据值作为字符串字面量插入时,这个函数很有用。一些字符(例如引号和反斜杠)必须经过转义,才不会被 SQL 解析器解释成特殊含义。
PQescapeLiteral 执行这种操作。
- PQescapeLiteral 返回一个str 参数的已被转义版本,该版本被放在用malloc() 分配的内存中。
- 当该结果不再被需要时,这个内存应该用PQfreemem() 释放。
- 一个终止的零字节不是必须的,并且不应该被计入length (如果在length 字节被处理之前找到一个终止字节,PQescapeLiteral 会停止在零,该行为更像strncpy )。
- 返回字符串中的所有特殊字符都会被替换,这样它们就能被PostgreSQL 字符串字面量解析器正确处理。
- 结果中也会附加一个终止零字节,并包含包围PostgreSQL 字符串字面量所需的单引号。
-
+ PQescapeLiteral 返回 str 参数的转义版本,存放在通过 malloc() 分配的内存中。结果不再需要时,应使用 PQfreemem() 释放该内存。输入不必以零字节结尾,末尾零字节也不应计入 length 。(如果在处理完 length 个字节之前遇到末尾零字节,PQescapeLiteral 会在该字节处停止;这一行为类似于 strncpy 。)返回字符串中的所有特殊字符均已替换,以便 PostgreSQL 字符串字面量解析器正确处理。还会添加一个末尾零字节。包围 PostgreSQL 字符串字面量所需的单引号包含在结果字符串中。
+
发生错误时,PQescapeLiteral 返回NULL 并且一个合适的消息会被存储在conn 对象中。
@@ -2753,7 +2780,7 @@ char *PQescapeLiteral(PGconn *conn, const char *str, size_t length);
- 注意,当一个数据值被作为PQexecParams 或其兄弟例程中的一个独立参数传递时,没有必要做转义而且做转义也不正确。
+ 注意,当一个数据值被作为PQexecParams 或相关例程中的一个独立参数传递时,没有必要做转义而且做转义也不正确。
@@ -2768,14 +2795,13 @@ char *PQescapeIdentifier(PGconn *conn, const char *str, size_t length);
- PQescapeIdentifier 对字符串进行转义,使其可用作 SQL 标识符,例如表名、列名或函数名。当用户提供的标识符可能包含未经转义就不会被 SQL 解析器视为标识符一部分的特殊字符,或包含需要保留大小写的大写字符时,此函数很有用。
+
+ PQescapeIdentifier 对字符串进行转义,使其可用作 SQL 标识符,例如表名、列名或函数名。当用户提供的标识符可能包含未经转义就不会被 SQL 解析器视为标识符一部分的特殊字符,或包含需要保留大小写的大写字符时,此函数很有用。
+
- PQescapeIdentifier 返回一个str 参数的已被转义为 SQL 标识符的版本,该版本被放在用malloc() 分配的内存中。
- 当该结果不再被需要时,这个内存必须用PQfreemem() 释放。
- 一个终止的零字节不是必须的,并且不应该被计入length (如果在length 字节被处理之前找到一个终止字节,PQescapeIdentifier 会停止在零,该行为更像strncpy )。
- 返回串中的所有特殊字符都被替换掉,这样它们能被作为一个 SQL 标识符正确地处理。还会加上一个终止零字节。返回串也将被双引号包围。
-
+ PQescapeIdentifier 返回 str 参数作为 SQL 标识符的转义版本,存放在通过 malloc() 分配的内存中。结果不再需要时,必须使用 PQfreemem() 释放该内存。输入不必以零字节结尾,末尾零字节也不应计入 length 。(如果在处理完 length 个字节之前遇到末尾零字节,PQescapeIdentifier 会在该字节处停止;这一行为类似于 strncpy 。)返回字符串中的所有特殊字符均已替换,以便正确地作为 SQL 标识符处理。还会添加一个末尾零字节,并用双引号包围返回的字符串。
+
发生错误时,PQescapeIdentifier 返回NULL 并且一个合适的消息会被存储在conn 对象中。
@@ -2784,7 +2810,7 @@ char *PQescapeIdentifier(PGconn *conn, const char *str, size_t length);
- 与字符串一样,要阻止 SQL 注入攻击,当从一个不可信的来源接收到 SQL 标识符时,它们必须被转义。
+ 与字符串字面量一样,为防止 SQL 注入攻击,从不可信来源接收到的 SQL 标识符必须经过转义。
@@ -2803,18 +2829,12 @@ size_t PQescapeStringConn(PGconn *conn,
- PQescapeStringConn 转义字符串,它很像PQescapeLiteral 。
- 与PQescapeLiteral 不一样的是,调用者负责提供一个合适尺寸的缓冲区。
- 此外,PQescapeStringConn 不产生必须包围PostgreSQL 字符串的单引号。
- 它们应该在结果要插入的 SQL 命令中提供。参数from 指向要被转义的串的第一个字符,并且length 参数给出了这个串中的字节数。
- 一个终止的零字节不是必须的,并且不应该被计入length (如果在length 字节被处理之前找到一个终止字节,PQescapeStringConn 会停止在零,该行为更像strncpy )。
- to 应当指向一个缓冲区,它至少能容纳length 值的两倍再加一个字节,否则该行为是未被定义的。
- 如果to 和from 串重叠,行为也是未被定义的。
-
+ PQescapeStringConn 对字符串字面量进行转义,与 PQescapeLiteral 类似。与 PQescapeLiteral 不同,调用者需要提供大小合适的缓冲区。此外,PQescapeStringConn 不会生成包围 PostgreSQL 字符串字面量所需的单引号;应在包含转义结果的 SQL 命令中提供这些引号。from 参数指向待转义字符串的首字符,length 参数给出该字符串的字节数。输入不必以零字节结尾,末尾零字节也不应计入 length 。(如果在处理完 length 个字节之前遇到末尾零字节,PQescapeStringConn 会在该字节处停止;这一行为类似于 strncpy 。)to 必须指向一个缓冲区,其容量至少为 length 的两倍加一个字节,否则行为未定义。如果 to 与 from 字符串重叠,行为同样未定义。
+
- 如果error 参数不是NULL ,那么成功时*error 被设置为零,错误时设置为非零。当前唯一可能的错误情况涉及源串中非法的多字节编码。错误时仍然会产生输出串,但是可以预期服务器将认为它是畸形的并且拒绝它。在发生错误时,一个合适的消息被存储在conn 对象中,不管error 是不是NULL 。
-
+ 如果 error 参数不是 NULL ,则成功时将 *error 设为零,出错时设为非零。目前唯一可能的错误是源字符串中存在无效的多字节编码。出错时仍会生成输出字符串,但预计服务器会因其格式错误而拒绝它。发生错误时,无论 error 是否为 NULL ,都会在 conn 对象中保存相应消息。
+
PQescapeStringConn 返回写到to 的字节数,不包括终止的零字节。
@@ -2827,15 +2847,19 @@ size_t PQescapeStringConn(PGconn *conn,
- PQescapeString 是以下函数的旧版本,现已弃用:PQescapeStringConn 。
+ PQescapeString 是 PQescapeStringConn 的旧版本,现已弃用。
size_t PQescapeString (char *to, const char *from, size_t length);
-
+
- 与 PQescapeStringConn 唯一的区别是,PQescapeString 不接受 PGconn 或 error 参数。因此,它无法根据连接属性(例如字符编码)调整行为,可能给出错误的结果 。此外,它也无法报告错误情况。
+
+ 与 PQescapeStringConn 唯一的区别是,PQescapeString 不接受 PGconn 或 error 参数。因此,它无法根据连接属性(例如字符编码)调整行为,可能给出错误的结果 。此外,它也无法报告错误情况。
+
- PQescapeString 可以在同一时刻仅使用一个 PostgreSQL 连接的客户端程序中安全使用(在这种情况下,它能够在内部
取得所需信息)。在其他情形下,它存在安全隐患,应改用 PQescapeStringConn 。
+
+ PQescapeString 可以在同一时刻仅使用一个 PostgreSQL 连接的客户端程序中安全使用(在这种情况下,它能够在内部
取得所需信息)。在其他情形下,它存在安全隐患,应改用 PQescapeStringConn 。
+
@@ -2843,7 +2867,9 @@ size_t PQescapeString (char *to, const char *from, size_t length);
PQescapeByteaConn PQescapeByteaConn
- 对二进制数据进行转义,使其能够在 SQL 命令中用作以下类型的值:bytea 。与PQescapeStringConn 一样,这仅用于将数据直接插入 SQL 命令字符串的情况。
+
+ 对二进制数据进行转义,使其能够在 SQL 命令中用作 bytea 类型的值。与 PQescapeStringConn 一样,这仅用于将数据直接插入 SQL 命令字符串的情况。
+
unsigned char *PQescapeByteaConn(PGconn *conn,
const unsigned char *from,
size_t from_length,
@@ -2857,10 +2883,12 @@ unsigned char *PQescapeByteaConn(PGconn *conn,
- from 参数指向要被转义的串的第一个字节,并且from_length 参数给出这个二进制串中的字节数(一个终止的零字节是不需要的也是不被计算的)。to_length 参数指向一个将保持生成的已转义串长度的变量。这个结果串长度包括结果的终止零字节。
+ from 参数指向待转义字符串的首字节,from_length 参数给出该二进制字符串的字节数。(末尾零字节既不需要,也不计入长度。)to_length 参数指向用于保存转义后字符串长度的变量。该结果字符串长度包含结果末尾的零字节。
- PQescapeByteaConn 返回 from 参数所指二进制字符串的转义版本,存放在通过 malloc() 分配的内存中。结果不再需要时,应使用 PQfreemem() 释放该内存。返回字符串中的所有特殊字符都已替换,以便 PostgreSQL 字符串字面量解析器和 bytea 输入函数正确处理。还会添加一个末尾零字节。包围 PostgreSQL 字符串字面量所需的单引号不包含在结果字符串中。
+
+ PQescapeByteaConn 返回 from 参数所指二进制字符串的转义版本,存放在通过 malloc() 分配的内存中。结果不再需要时,应使用 PQfreemem() 释放该内存。返回字符串中的所有特殊字符都已替换,以便 PostgreSQL 字符串字面量解析器和 bytea 输入函数正确处理。还会添加一个末尾零字节。包围 PostgreSQL 字符串字面量所需的单引号不包含在结果字符串中。
+
在发生错误时,将返回一个空指针,并且一个合适的错误消息被存储在conn 对象中。当前,唯一可能的错误是没有足够的内存用于结果串。
@@ -2873,7 +2901,7 @@ unsigned char *PQescapeByteaConn(PGconn *conn,
- PQescapeBytea 是以下函数的旧版本,现已弃用:PQescapeByteaConn 。
+ PQescapeBytea 是 PQescapeByteaConn 的旧版本,现已弃用。
unsigned char *PQescapeBytea(const unsigned char *from,
size_t from_length,
@@ -2882,9 +2910,7 @@ unsigned char *PQescapeBytea(const unsigned char *from,
- 与PQescapeByteaConn 的唯一区别是PQescapeBytea 不用一个PGconn 参数。
- 正因为这样,PQescapeBytea 只能在一次只使用一个PostgreSQL 连接的客户端程序中安全地使用(在这种情况下它可以在内部
找出它需要知道的东西)。
- 如果在有多个数据库连接的程序中使用,它可能给出错误的结果 (在那种情况下使用PQescapeByteaConn )。
+ 与 PQescapeByteaConn 唯一的区别是,PQescapeBytea 不接受 PGconn 参数。因此,PQescapeBytea 只能在同一时刻仅使用一个 PostgreSQL 连接的客户端程序中安全使用(在这种情况下,它能够在内部
取得所需信息)。如果在使用多个数据库连接的程序中使用,它可能给出错误的结果 (此时应使用 PQescapeByteaConn )。
@@ -2950,26 +2976,26 @@ unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length);
- PQexec 总是收集命令的整个结果,把它缓存在一个单一的PGresult 中。虽然这简化了应用的错误处理逻辑,它对于包含很多行的结果并不现实。
-
+ PQexec 总是收集命令的完整结果,并将其缓存在单个 PGresult 中。这简化了应用程序的错误处理逻辑,但对于包含大量行的结果,可能不切实际。
+
- 如果应用程序不希望受到这些限制,可以改用构成PQexec 的底层函数:PQsendQuery 和PQgetResult 。此外,还有PQsendQueryParams ,
- PQsendPrepare ,
- PQsendQueryPrepared ,
- PQsendDescribePrepared ,以及PQsendDescribePortal ,它们可以与PQgetResult 配合使用,分别实现以下函数的功能:PQexecParams ,
- PQprepare ,
- PQexecPrepared ,
- PQdescribePrepared ,以及PQdescribePortal 。
+
+ 如果应用程序不希望受到这些限制,可以改用构成 PQexec 的底层函数:PQsendQuery 和 PQgetResult 。此外,PQsendQueryParams 、PQsendPrepare 、PQsendQueryPrepared 、PQsendDescribePrepared 、PQsendDescribePortal 可以与 PQgetResult 配合使用,分别实现 PQexecParams 、PQprepare 、PQexecPrepared 、PQdescribePrepared 、PQdescribePortal 的功能。
+
PQsendQuery PQsendQuery
- 向服务器提交命令,不等待结果。命令发送成功时返回 1,否则返回 0(此时可以使用PQerrorMessage 取得更多失败信息)。
+
+ 向服务器提交命令,不等待结果。命令发送成功时返回 1,否则返回 0(此时可使用 PQerrorMessage 获取更多失败信息)。
+
int PQsendQuery(PGconn *conn, const char *command);
- 成功调用PQsendQuery 之后,应调用PQgetResult 一次或多次来取得结果。PQsendQuery 在同一连接上不能再次调用,直到PQgetResult 返回空指针,表明命令已经完成。
+
+成功调用 PQsendQuery 后,应调用 PQgetResult 一次或多次来获取结果。在 PQgetResult 返回空指针、表明命令已完成之前,不得在同一连接上再次调用 PQsendQuery 。
+
@@ -2977,7 +3003,9 @@ int PQsendQuery(PGconn *conn, const char *command);
PQsendQueryParams PQsendQueryParams
- 向服务器提交命令及独立指定的参数,不等待结果。
+
+ 向服务器提交命令及独立指定的参数,不等待结果。
+
int PQsendQueryParams(PGconn *conn,
const char *command,
int nParams,
@@ -2986,7 +3014,9 @@ int PQsendQueryParams(PGconn *conn,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
- 该函数等价于PQsendQuery ,但查询参数可以与查询字符串分开指定。函数参数的处理方式与PQexecParams 相同。与PQexecParams 一样,它不能用于协议 2.0 的连接,并且查询字符串中只允许包含一条命令。
+
+该函数等价于 PQsendQuery ,但查询参数可以与查询字符串分开指定。函数参数的处理方式与 PQexecParams 相同。与 PQexecParams 一样,它不能用于协议 2.0 的连接,并且查询字符串中只允许包含一条命令。
+
@@ -2994,13 +3024,17 @@ int PQsendQueryParams(PGconn *conn,
PQsendPrepare PQsendPrepare
- 发送按给定参数创建预备语句的请求,不等待完成。
+
+ 发送按给定参数创建预备语句的请求,不等待完成。
+
int PQsendPrepare(PGconn *conn,
const char *stmtName,
const char *query,
int nParams,
const Oid *paramTypes);
- 这是PQprepare 的异步版本:请求发送成功时返回 1,否则返回 0。调用成功后,再调用PQgetResult ,确定服务器是否成功创建了预备语句。函数参数的处理方式与PQprepare 相同。与PQprepare 一样,它不能用于协议 2.0 的连接。
+
+这是 PQprepare 的异步版本:请求发送成功时返回 1,否则返回 0。调用成功后,再调用 PQgetResult ,确定服务器是否成功创建了预备语句。函数参数的处理方式与 PQprepare 相同。与 PQprepare 一样,它不能用于协议 2.0 的连接。
+
@@ -3008,7 +3042,9 @@ int PQsendPrepare(PGconn *conn,
PQsendQueryPrepared PQsendQueryPrepared
- 发送使用给定参数执行预备语句的请求,不等待结果。
+
+ 发送使用给定参数执行预备语句的请求,不等待结果。
+
int PQsendQueryPrepared(PGconn *conn,
const char *stmtName,
int nParams,
@@ -3016,7 +3052,9 @@ int PQsendQueryPrepared(PGconn *conn,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
- 该函数类似于PQsendQueryParams ,但通过指定先前已准备好的语句的名称来确定要执行的命令,而不是提供查询字符串。函数参数的处理方式与PQexecPrepared 相同。与PQexecPrepared 一样,它不能用于协议 2.0 的连接。
+
+该函数类似于 PQsendQueryParams ,但通过已创建的预备语句的名称指定要执行的命令,而非提供查询字符串。函数参数的处理方式与 PQexecPrepared 相同。与 PQexecPrepared 一样,它不能用于协议 2.0 的连接。
+
@@ -3053,7 +3091,9 @@ PGresult *PQgetResult(PGconn *conn);
- 必须反复调用 PQgetResult ,直到它返回空指针,表明命令已经完成。(如果当前没有正在执行的命令,调用 PQgetResult 会立即返回空指针。)对于 PQgetResult 返回的每个非空结果,都应使用前文介绍的 PGresult 访问函数处理。使用完毕后,不要忘记调用 PQclear 释放每个结果对象。注意,只有存在正在执行的命令,且所需响应数据尚未被 PQconsumeInput 读取时,PQgetResult 才会阻塞。
+
+ 必须反复调用 PQgetResult ,直到它返回空指针,表明命令已经完成。(如果当前没有正在执行的命令,调用 PQgetResult 会立即返回空指针。)对于 PQgetResult 返回的非空指针,应使用前文介绍的 PGresult 访问函数处理相应结果。使用完毕后,不要忘记调用 PQclear 释放每个结果对象。注意,只有存在正在执行的命令,且所需响应数据尚未被 PQconsumeInput 读取时,PQgetResult 才会阻塞。
+
@@ -3064,37 +3104,36 @@ PGresult *PQgetResult(PGconn *conn);
-
+
- 使用PQsendQuery 和PQgetResult 解决了PQexec 的一个问题:如果一个命令字符串包含多个SQL 命令,这些命令的结果可以被个别地获得(顺便说一句:这样就允许一种简单的重叠处理形式, 客户端可以处理一个命令的结果,而同时服务器可以继续处理同一命令字符串中后面的查询)。
-
+ 使用 PQsendQuery 和 PQgetResult 可以解决 PQexec 的一个问题:如果命令字符串包含多个 SQL 命令,就能分别获取这些命令的结果。(这也支持一种简单的重叠处理方式:客户端可以处理某条命令的结果,同时服务器继续处理同一命令字符串中后面的查询。)
+
- 可以被PQsendQuery 和PQgetResult 获得的另一种常常想要的特性是一次从大型结果中检索一行。这会在 中讨论。
-
+ 使用 PQsendQuery 和 PQgetResult 还可以实现另一项常见需求:从大型查询结果中一次读取一行。详见 。
+
- 仅仅调用PQgetResult 仍会使客户端阻塞,直到服务器完成下一条SQL 命令。可以通过正确使用另外两个函数来避免这种情况:
+
+ 仅仅调用 PQgetResult 仍会使客户端阻塞,直到服务器完成下一条 SQL 命令。可以通过正确使用另外两个函数来避免这种情况:
+
PQconsumeInput PQconsumeInput
- 如果有来自服务器的输入可用,则使用之。
+ 如果服务器有可读取的输入,则读取这些输入。
int PQconsumeInput(PGconn *conn);
- PQconsumeInput 通常返回 1 表明没有错误
,而返回 0 表明有某种麻烦发生(此时可以用PQerrorMessage )。
- 注意该结果并不表明是否真正收集了任何输入数据。在调用PQconsumeInput 之后,应用可以检查PQisBusy 和/或PQnotifies 来看看它们的状态是否改变。
+ PQconsumeInput 通常返回 1,表示没有错误
;发生问题时则返回 0(此时可查看 PQerrorMessage )。注意,返回值并不说明是否实际读取了输入数据。调用 PQconsumeInput 后,应用程序可以检查 PQisBusy 和/或 PQnotifies ,以确定其状态是否发生变化。
- 即使应用还不准备处理一个结果或通知,PQconsumeInput 也可以被调用。
- 这个函数将读取可用的数据并且把它保存在一个缓冲区中,从而导致一个select() 的读准备好指示消失。
- 因此应用可以使用PQconsumeInput 立即清除select() 条件,并且在空闲时再检查结果。
+ 即使应用程序尚未准备好处理结果或通知,也可以调用 PQconsumeInput 。此函数会读取可用数据并将其保存在缓冲区中,从而清除 select() 的可读就绪指示。因此,应用程序可以用 PQconsumeInput 立即清除 select() 的就绪条件,随后在合适的时候检查结果。
@@ -3114,22 +3153,20 @@ int PQisBusy(PGconn *conn);
-
+
- 一个使用这些函数的典型应用将有一个主循环,在主循环中会使用select() 或poll() 等待所有它必须响应的情况。
- 其中之一将是来自服务器的输入可用,对select() 来说意味着PQsocket 标识的文件描述符上有可读的数据。
- 当主循环检测到输入准备好时,它将调用PQconsumeInput 读取输入。
- 然后它可以调用PQisBusy ,如果PQisBusy 返回假(0)则接着调用PQgetResult 。
- 它还可以调用PQnotifies 检测NOTIFY 消息(见 )。
-
+ 使用这些函数的典型应用程序会在主循环中通过 select() 或 poll() 等待需要响应的各种条件。其中一个条件是服务器有可读取的输入;对于 select() ,这意味着 PQsocket 标识的文件描述符上有可读数据。主循环检测到输入就绪时,应调用 PQconsumeInput 读取输入,然后调用 PQisBusy 。如果 PQisBusy 返回假(0),就可以接着调用 PQgetResult 。还可以调用 PQnotifies 检测 NOTIFY 消息(见 )。
+
一个使用PQsendQuery /PQgetResult 的客户端也可以尝试取消一个正在被服务器处理的命令,见 。
但是,不管PQcancel 的返回值是什么,应用都必须继续使用PQgetResult 进行正常的结果读取序列。一次成功的取消只会导致命令比不取消时更快终止。
- 使用上述函数可以避免在等待数据库服务器输入时阻塞。不过,应用程序仍可能在等待向服务器发送输出时阻塞。这种情况较少见,但发送很长的 SQL 命令或数据值时可能发生。(如果应用程序通过COPY IN 发送数据,发生的可能性则大得多。)为了防止这种情况,实现完全非阻塞的数据库操作,可以使用以下附加函数。
+
+ 使用上述函数可以避免在等待数据库服务器输入时阻塞。不过,应用程序仍可能在等待向服务器发送输出时阻塞。这种情况较少见,但发送很长的 SQL 命令或数据值时可能发生。(如果应用程序通过 COPY IN 发送数据,发生的可能性则大得多。)为了防止这种情况,实现完全非阻塞的数据库操作,可以使用以下附加函数。
+
PQsetnonblocking PQsetnonblocking
@@ -3176,9 +3213,7 @@ int PQisnonblocking(const PGconn *conn);
- 尝试将任何排队的输出数据刷新到服务器。如果成功(或发送队列为空),则返回0;
- 如果由于某种原因失败,则返回-1;如果尚未能够发送发送队列中的所有数据(只有在连接为非阻塞时才会发生此情况),
- 则返回1。
+ 尝试将发送队列中的输出数据发送到服务器。成功(或发送队列为空)时返回 0;因某种原因失败时返回 -1;如果尚未能发送队列中的全部数据,则返回 1(这种情况只可能发生在非阻塞连接上)。
int PQflush(PGconn *conn);
@@ -3186,15 +3221,11 @@ int PQflush(PGconn *conn);
-
+
- 在一个非阻塞连接上发送任何命令或者数据之后,要调用PQflush 。
- 如果它返回 1,就要等待套接字变成读准备好或写准备好。如果它变为写准备好,应再次调用PQflush 。
- 如果它变为读准备好,则应先调用PQconsumeInput ,然后再调用PQflush 。
- 一直重复直到PQflush 返回 0(有必要检查读准备好并且用PQconsumeInput 耗尽输入,因为服务器可能阻塞给我们发送数据的尝试,例如 NOTICE 消息,并且在我们读它的数据之前它都不会读我们的数据)。
- 一旦PQflush 返回 0,应等待套接字变成读准备好并且接着按照上文所述读取响应。
-
+ 在非阻塞连接上发送命令或数据后,应调用 PQflush 。如果返回 1,就等待套接字变为可读或可写。套接字可写时,再次调用 PQflush ;可读时,先调用 PQconsumeInput ,再调用 PQflush 。重复上述步骤,直到 PQflush 返回 0。(必须检查套接字是否可读,并用 PQconsumeInput 读完输入,因为服务器可能在尝试向客户端发送数据时阻塞,例如发送 NOTICE 消息;在客户端读取这些数据之前,服务器不会读取客户端发送的数据。)当 PQflush 返回 0 后,等待套接字变为可读,再按前述方法读取响应。
+
@@ -3322,7 +3353,7 @@ int PQrequestCancel(PGconn *conn);
快速路径接口
- fast path
+ 快速路径
@@ -3358,24 +3389,22 @@ typedef struct
- fnid 参数是要被执行的函数的 OID。args 和nargs 定义了要传递给函数的参数;它们必须匹配已声明的函数参数列表。当一个参数结构体的isint 域为真时,u.integer 值被以指定长度(必须是 2 或 4 字节)整数的形式发送给服务器;这时候会发生恰当的字节交换。当isint 为假时,*u.ptr 中指定数量的字节将不做任何处理被发送出去;这些数据必须是服务器 预期的用于该函数参数数据类型的二进制传输的格式(由于历史原因u.ptr 被声明为类型int * ,其实把它考虑成void * 会更好)。result_buf 是放置该函数返回值的缓冲区。调用者必须已经分配了足够的空间来存储返回值(这里没有检查!)。实际的结果长度将被放在result_len 指向的整数中返回。如果预期结果是 2 或 4 字节整数,把result_is_int 设为 1;否则设为 0。把result_is_int 设为 1 导致libpq 在必要时对值进行交换字节,这样它就作为对客户端机器正确的int 值被传输,注意对任一种允许的结果大小都会传递一个 4 字节整数到*result_buf 。当result_is_int 是 0 时,服务器发送的二进制格式字节将不做修改直接返回(在这种情况下,把result_buf 考虑为类型void * 更好)。
-
+ fnid 参数是要执行函数的 OID。args 和 nargs 指定传给函数的参数,必须与函数声明中的参数列表匹配。参数结构体的 isint 字段为真时,u.integer 值会以指定长度的整数发送到服务器,该长度必须是 2 或 4 字节,并会进行适当的字节序转换。isint 为假时,位于 *u.ptr 的指定数量字节会原样发送;数据必须符合服务器对该函数参数数据类型的二进制传输格式要求。(将 u.ptr 声明为 int * 是历史原因;将其视为 void * 更合适。)result_buf 指向用于存放函数返回值的缓冲区。调用者必须事先分配足够空间来保存返回值,这里不会检查!实际结果长度以字节为单位,返回到 result_len 指向的整数中。如果预期结果是 2 或 4 字节整数,将 result_is_int 设为 1,否则设为 0。将 result_is_int 设为 1 后,libpq 会按需转换字节序,使结果成为适合客户端机器的 int 值;注意,无论是哪种允许的结果大小,传入 *result_buf 的都是 4 字节整数。result_is_int 为 0 时,服务器发送的二进制格式字节串会原样返回。(此时,将 result_buf 视为 void * 更合适。)
+
- PQfn 总是返回一个有效的PGresult 指针,成功时状态为PGRES_COMMAND_OK ,遇到问题时为PGRES_FATAL_ERROR 。
- 在使用结果之前应该检查结果状态。
- 当结果不再使用后,调用者有义务使用PQclear 释放PGresult 。
-
+ PQfn 总是返回有效的 PGresult 指针:成功时状态为 PGRES_COMMAND_OK ,遇到问题时为 PGRES_FATAL_ERROR 。使用结果前应检查其状态。不再需要结果时,调用者负责使用 PQclear 释放 PGresult 。
+
- 要传递NULL参数到函数,将参数结构体的len 字段设置为-1 ;isint 和 u 字段就不相关了。(但这仅适用于使用协议 3.0 及更高版本的连接。)
+ 要向函数传入 NULL 参数,将该参数结构体的 len 字段设为 -1 ;此时,isint 和 u 字段便不再相关。(但这仅适用于使用协议 3.0 及更高版本的连接。)
+
如果函数返回 NULL,则将 *result_len 设为 -1 ,而不修改 *result_buf 。(这仅适用于使用协议 3.0 及更高版本的连接;在协议 2.0 中,既不修改 *result_len ,也不修改 *result_buf 。)
- 注意在使用此接口时,不能够处理集-值结果。
- 此外,函数必须是一个普通函数,而不是聚合、窗口函数或过程。
-
+ 注意,使用此接口时无法处理集合值结果。此外,函数必须是普通函数,不能是聚合函数、窗口函数或过程。
+
@@ -3384,7 +3413,7 @@ typedef struct
NOTIFY
- in libpq
+ 在 libpq 中
@@ -3393,32 +3422,36 @@ typedef struct
libpq 应用把LISTEN 、UNLISTEN 和NOTIFY 命令作为普通 SQL 命令提交。
- 随后通过调用PQnotifies .PQnotifies 来检测NOTIFY 消息的到达。
+ 随后通过调用PQnotifies PQnotifies 来检测NOTIFY 消息的到达。
- 函数PQnotifies 从已收到但尚未处理的服务器通知消息列表中返回下一条通知。如果没有待处理的通知,则返回空指针。一旦通知由PQnotifies 返回,就被视为已处理,并从通知列表中移除。
+
+ 函数 PQnotifies 从已收到但尚未处理的服务器通知消息列表中返回下一条通知。没有待处理通知时返回空指针。一旦 PQnotifies 返回一条通知,该通知就被视为已处理,并从通知列表中移除。
+
PGnotify *PQnotifies(PGconn *conn);
typedef struct pgNotify
{
- char *relname; /* notification channel name */
- int be_pid; /* process ID of notifying server process */
- char *extra; /* notification payload string */
+ char *relname; /* 通知通道名称 */
+ int be_pid; /* 发送通知的服务器进程 ID */
+ char *extra; /* 通知载荷字符串 */
} PGnotify;
- 处理完一个PGnotify 对象(由PQnotifies 返回)后,一定要用PQfreemem 释放它。只需释放PGnotify 指针;relname 和extra 字段并非独立分配。(这些字段名称是历史遗留的;尤其是,通道名称与关系名称不必有任何关联。)
+
+处理完 PQnotifies 返回的 PGnotify 对象后,务必使用 PQfreemem 释放它。只需释放 PGnotify 指针;relname 和 extra 字段并非独立分配。(这些字段名称是历史遗留的;尤其是,通道名称与关系名称不必有任何关联。)
+
给出了一个示例程序展示异步通知的使用。
- PQnotifies 实际上并不从服务器读取数据;它只是返回之前已被其他libpq 函数吸收的消息。
+ PQnotifies 实际上并不从服务器读取数据;它只是返回之前已被其他libpq 函数读取的消息。
在较早版本的libpq 中,及时收到NOTIFY 消息的唯一方法是不断提交命令,哪怕是空命令,然后在每次PQexec 后检查PQnotifies 。
- 虽然这种方法仍然有效,但由于效率过低,现已废弃。
+ 虽然这种方法仍然有效,但由于浪费处理能力,现已弃用。
- 当你没有可用的命令提交时,一种更好的检查NOTIFY 消息的方法是调用PQconsumeInput ,然后检查PQnotifies 。
+ 当没有需要执行的实际命令时,一种更好的检查NOTIFY 消息的方法是调用PQconsumeInput ,然后检查PQnotifies 。
你可以使用select() 等待服务器数据到达,这样在无事可做时就不会浪费CPU 资源(参见PQsocket 以获得可传给select() 的文件描述符)。
注意不管是用PQsendQuery /PQgetResult 提交命令还是简单地使用PQexec ,这种方法都能正常工作。
不过,你应该记住在每次PQgetResult 或 PQexec 之后检查PQnotifies ,看看在命令的处理过程中是否有通知到达。
@@ -3431,20 +3464,16 @@ typedef struct pgNotify
COPY
- with libpq
+ 使用 libpq
- PostgreSQL 中的COPY 命令有用于libpq 的对网络连接读出或者写入的选项。这一节描述的函数允许应用通过提供或者消耗已拷贝的数据来充分利用这个功能。
-
+ PostgreSQL 的 COPY 命令提供了选项,可以通过 libpq 使用的网络连接读取或写入数据。本节介绍的函数允许应用程序通过提供或接收复制数据来使用这一能力。
+
- 整个处理是应用首先通过PQexec 或者一个等效的函数发出 SQL COPY 命令。
- 对这个命令的响应(如果命令无误)将是一个状态代码是PGRES_COPY_OUT 或 者PGRES_COPY_IN (取决于指定的拷贝方向)的PGresult 对象。
- 应用然后就应该使用这一节的函数接收或者传送数据行。在数据传输结束之后,另外一个PGresult 对象会被返回以表明传输的成功或者失败。
- 它的状态将是:PGRES_COMMAND_OK 表示成功,PGRES_FATAL_ERROR 表示发生了一些问题。
- 此时我们可以通过PQexec 发出进一步的 SQL 命令(在COPY 操作的处理过程中,不能用同一个连接执行其它 SQL 命令)。
-
+ 整体流程如下:应用程序先通过 PQexec 或等效函数发出 SQL COPY 命令。如果命令没有错误,响应就是一个 PGresult 对象,其状态码为 PGRES_COPY_OUT 或 PGRES_COPY_IN ,取决于指定的复制方向。应用程序随后应使用本节函数接收或发送数据行。数据传输完成后,会返回另一个 PGresult 对象,表示传输成功或失败:成功时状态为 PGRES_COMMAND_OK ,出现问题时为 PGRES_FATAL_ERROR 。此时可以通过 PQexec 继续发出 SQL 命令。(COPY 操作进行期间,不能在同一连接上执行其他 SQL 命令。)
+
如果一个COPY 命令是通过PQexec 在一个可能包含额外命令的字符串中发出的,那么应用在完成COPY 序列之后必须继续用PQgetResult 取得结果。
@@ -3452,12 +3481,14 @@ typedef struct pgNotify
- 这一节的函数应该只在从PQexec 或 PQgetResult 获得了PGRES_COPY_OUT 或PGRES_COPY_IN 结果状态后执行。
-
+ 只有从 PQexec 或 PQgetResult 获得 PGRES_COPY_OUT 或 PGRES_COPY_IN 结果状态后,才应调用本节函数。
+
- 一个PGresult 对象若带有上述某个状态值,还会携带关于即将开始的COPY 操作的附加数据。这些数据可以通过下列函数取得,这些函数也用于查询结果:
+
+ 带有上述某个状态值的 PGresult 对象,还会携带关于即将开始的 COPY 操作的附加数据。这些数据可以通过下列函数获取,这些函数也用于查询结果:
+
- PQnfields PQnfields with COPY
+ PQnfields PQnfields 用于 COPY
@@ -3467,7 +3498,7 @@ typedef struct pgNotify
- PQbinaryTuples PQbinaryTuples with COPY
+ PQbinaryTuples PQbinaryTuples 用于 COPY
@@ -3478,7 +3509,7 @@ typedef struct pgNotify
- PQfformat PQfformat with COPY
+ PQfformat PQfformat 用于 COPY
@@ -3490,7 +3521,7 @@ typedef struct pgNotify
-
+
这些附加数据值仅在使用协议 3.0 时可用。使用协议 2.0 时,这些函数都返回 0。
@@ -3500,8 +3531,8 @@ typedef struct pgNotify
用于发送COPY 数据的函数
- 这些函数用于在COPY FROM STDIN 期间发送数据。如果在连接不是COPY_IN 状态,调用它们会失败。
-
+ 这些函数用于在 COPY FROM STDIN 期间发送数据。如果连接不处于 COPY_IN 状态,调用它们会失败。
+
@@ -3518,12 +3549,11 @@ int PQputCopyData(PGconn *conn,
- 传输指定buffer 中长度为nbytes 的COPY 数据到服务器。
- 如果数据被放在队列中,结果是 1;如果因为缓冲区满而无法被放在队列中(只可能发生在连接是非阻塞模式时),那么结果是零;如果发生错误,结果为 -1(如果返回值为 -1,那么使用PQerrorMessage 检索细节。如果值是零,那么等待写准备好然后重试)。
+ 将指定 buffer 中长度为 nbytes 的 COPY 数据传输到服务器。数据成功加入队列时返回 1;因缓冲区已满而无法加入队列时返回零(仅可能发生在非阻塞模式下);发生错误时返回 -1。(返回 -1 时,可用 PQerrorMessage 获取详细信息。返回零时,应等待可写就绪后重试。)
- 应用可以把COPY 数据流划分成任意方便的大小放到缓冲区中。在发送时,缓冲区载荷的边界没有什么语意。数据流的内容必须匹配COPY 命令预期的数据格式;详见 。
+ 应用程序可以将 COPY 数据流分成任意方便大小的数据块,逐块装入缓冲区。发送时,这些数据块的边界没有语义含义。数据流内容必须符合 COPY 命令预期的数据格式;详见 。
@@ -3540,13 +3570,16 @@ int PQputCopyEnd(PGconn *conn,
- 如果 errormsg 为 NULL ,则成功结束 COPY_IN 操作。如果 errormsg 不为 NULL ,则强制 COPY 失败,并将 errormsg 指向的字符串用作错误消息。(但不应假定服务器一定会返回这条完全相同的错误消息,因为服务器可能已经因自身原因使 COPY 失败。还要注意,在使用 3.0 之前协议的连接上,强制失败选项不起作用。)
+
+ 如果 errormsg 为 NULL ,则成功结束 COPY_IN 操作。如果 errormsg 不为 NULL ,则强制 COPY 失败,并将 errormsg 指向的字符串用作错误消息。(但不应假定服务器一定会返回这条完全相同的错误消息,因为服务器可能已经因自身原因使 COPY 失败。还要注意,在使用 3.0 之前协议的连接上,强制失败选项不起作用。)
+
- 如果终止消息被发送,则结果为 1;在非阻塞模式中,结果为 1 也可能只表示终止消息被成功地放在了发送队列中 (在非阻塞模式中,要确认数据确实被发送出去,你应该接着等待写准备好并且调用PQflush ,重复这些直到返回零)。 零表示该函数由于缓冲区满而无法将该终止消息放在队列中,这只会发生在非阻塞模式中(在这种情况下,等待写准备好并且再次尝试PQputCopyEnd 调用)。 如果发生系统错误,则返回 -1,可以使用PQerrorMessage 检索详情。
+
+ 终止消息已发送时返回 1;在非阻塞模式下,返回 1 也可能仅表示该消息已成功加入发送队列。(在非阻塞模式下,要确认数据已经发送,应接着等待可写就绪并调用 PQflush ,反复执行直到返回零。)返回零表示缓冲区已满,无法将终止消息加入队列;这种情况仅可能发生在非阻塞模式下。(此时,应等待可写就绪,再次调用 PQputCopyEnd 。)发生严重错误时返回 -1,可用 PQerrorMessage 获取详细信息。
+
- 在成功调用PQputCopyEnd 之后,调用PQgetResult 获取COPY 命令的最终结果状态。
- 我们可以用平常的方法来等待这个结果可用。然后返回到正常的操作。
+ 成功调用 PQputCopyEnd 后,调用 PQgetResult 获取 COPY 命令的最终结果状态。可以按通常方式等待该结果就绪,然后恢复正常操作。
@@ -3576,24 +3609,19 @@ int PQgetCopyData(PGconn *conn,
- 在一个COPY 期间尝试从服务器获取另外一行数据。数据总是以每次一个数据行的方式被返回;如果只有一个部分行可用,那么它不会被返回。
- 成功返回一个数据行涉及到分配一块内存来保存该数据。buffer 参数必须为非NULL 。
- *buffer 被设置为指向分配到的内存的指针,或者是在没有返回缓冲区的情况下指向NULL 。
- 一个非NULL 的结果缓冲区在不需要时必须用PQfreemem 释放。
+ 在 COPY 期间尝试从服务器获取下一行数据。每次总是返回一个完整数据行;如果只有部分行可用,则不返回。成功返回数据行时,会分配一块内存保存数据。buffer 参数必须为非 NULL 。*buffer 会被设置为指向所分配的内存;如果没有返回缓冲区,则设为 NULL 。非 NULL 的结果缓冲区在不再需要时应使用 PQfreemem 释放。
- 在成功返回一行之后,返回的值就是该数据行里数据的字节数(将是大于零)。
- 被返回的字符串总是以零字节结尾,虽然这可能只是对文本COPY 有用。
- 一个零结果表示该COPY 仍然在处理中,但是还没有可用的行(只在async 为真时才可能)。
- 一个 -1 结果表示COPY 已经完成。-2 结果表示发生了错误(参考PQerrorMessage 获取原因)。
+ 成功返回一行时,返回值是该行的数据字节数,始终大于零。返回的字符串总是以零字节结尾,不过这可能仅对文本 COPY 有用。返回零表示 COPY 仍在进行,但尚无可用行(仅在 async 为真时可能发生)。返回 -1 表示 COPY 已完成;返回 -2 表示发生了错误(可用 PQerrorMessage 查看原因)。
- 当 async 为真(非零)时,PQgetCopyData 不会阻塞等待输入;如果 COPY 仍在进行,但没有完整的行可用,则返回零。(这种情况下,应等待读就绪,随后先调用 PQconsumeInput ,再调用 PQgetCopyData 。)当 async 为假(零)时,PQgetCopyData 会阻塞,直到有数据可用或操作完成。
+
+ 当 async 为真(非零)时,PQgetCopyData 不会阻塞等待输入;如果 COPY 仍在进行,但没有完整行可用,则返回零。(此时,应等待读就绪,先调用 PQconsumeInput ,再调用 PQgetCopyData 。)当 async 为假(零)时,PQgetCopyData 会阻塞,直到数据可用或操作完成。
+
- 在PQgetCopyData 返回 -1 之后,调用PQgetResult 获取COPY 命令的最后结果状态。
- 我们可以用平常的方法来等待这个结果可用。然后返回到正常的操作。
+ 在 PQgetCopyData 返回 -1 后,调用 PQgetResult 获取 COPY 命令的最终结果状态。可以按通常方式等待该结果就绪,然后恢复正常操作。
@@ -3602,11 +3630,11 @@ int PQgetCopyData(PGconn *conn,
- 用于COPY 的废弃函数
+ 用于COPY 的过时函数
- 这些函数代表了以前的处理COPY 的方法。尽管它们还能用,但是现在已经被废弃,因为它们的错误处理很糟糕、检测结束数据的方法也不方便,并且缺少对二进制或非阻塞传输的支持。
-
+ 这些函数使用较旧的方式处理 COPY 。虽然仍然可用,但由于错误处理欠佳、检测数据结束的方式不便,而且缺少对二进制或非阻塞传输的支持,已被弃用。
+
@@ -3614,7 +3642,7 @@ int PQgetCopyData(PGconn *conn,
- 读取一个以新行终止的字符行到(由服务器传输) 到一个长度为length 的字符串缓冲区。
+ 将服务器传来的、以换行符结尾的一行字符读入大小为 length 的字符串缓冲区。
int PQgetline(PGconn *conn,
char *buffer,
@@ -3623,11 +3651,10 @@ int PQgetline(PGconn *conn,
- 这个函数拷贝最多length -1 个字符到该缓冲区中,并且把终止的新行转换成一个零字节。
- PQgetline 在输入结束时返回EOF ,如果整行都被读取则返回 0,如果缓冲区填满了而还没有遇到结束的新行则返回 1。
-
+ 此函数最多将 length -1 个字符复制到缓冲区,并将末尾的换行符转换为零字节。PQgetline 在输入结束时返回 EOF ,读完一整行时返回 0,缓冲区已满但尚未读到末尾换行符时返回 1。
+
- 注意,应用必须检查是否一个新行包含两个字符\. ,这表明服务器 已经完成了COPY 命令的结果发送。如果应用可能收到超过length -1 字符长的行, 我们就应该确保正确识别\. 行(例如,不要把一个长数据行的结束当作一个终止行)。
+ 注意,应用程序必须检查新读入的一行是否仅由 \. 两个字符组成,这表示服务器已发送完 COPY 命令的结果。如果可能收到长度超过 length -1 个字符的行,必须确保正确识别 \. 行,例如不能把长数据行的末尾误当作终止行。
@@ -3637,7 +3664,7 @@ int PQgetline(PGconn *conn,
- 不阻塞地读取一行COPY 数据(由服务器传输)到一个缓冲区中。
+ 以非阻塞方式将服务器传来的一行 COPY 数据读入缓冲区。
int PQgetlineAsync(PGconn *conn,
char *buffer,
@@ -3646,22 +3673,18 @@ int PQgetlineAsync(PGconn *conn,
- 这个函数类似于PQgetline ,但是可以被用于那些必须异步读取COPY 数据的应用, 也就是不阻塞的应用。
- 在发出了COPY 命令并得到了PGRES_COPY_OUT 响应之后,
- 应用应该调用PQconsumeInput 和 PQgetlineAsync 直到检测到结束数据的信号。
-
+ 此函数类似于 PQgetline ,但可用于必须异步读取 COPY 数据的应用程序,即读取时不阻塞。发出 COPY 命令并收到 PGRES_COPY_OUT 响应后,应用程序应调用 PQconsumeInput 和 PQgetlineAsync ,直到检测到数据结束信号。
+
- 不像PQgetline ,这个函数负责检测结束数据。
+ 与 PQgetline 不同,此函数会负责检测数据结束。
- 在每次调用时,如果libpq 的输入缓冲区中有一个完整的数据行可用,PQgetlineAsync 都将返回数据。
- 否则,在剩余行到达之前不会返回数据。如果识别到拷贝数据结束的标志,此函数返回 -1;如果没有可用数据则返回 0;
- 或者返回一个正数,表示返回的数据字节数。如果返回 -1,调用者下一步必须调用PQendcopy ,然后回到正常处理。
+ 每次调用时,如果 libpq 的输入缓冲区中有完整数据行,PQgetlineAsync 就会返回数据;否则,要等该行剩余部分到达后才返回数据。识别到复制数据结束标记时返回 -1,没有可用数据时返回 0,否则返回正数,表示返回的数据字节数。返回 -1 后,调用者必须接着调用 PQendcopy ,然后恢复正常处理。
- 返回的数据将不超过一个数据行的范围。如果可能,每次将返回一个完整行。但如果调用者提供的缓冲区太小不足以容下服务器发送的行,那么将返回部分行。对于文本数据,这可以通过测试返回的最后一个字节是否\n 来检测(在二进制COPY 中, 需要对COPY 数据格式进行实际的分析,以便做相同的判断)。被返回的字符串不是空结尾的(如果你想增加一个终止空,确保传递一个比实际可用空间少一字节的bufsize )。
+ 返回的数据不会跨越数据行边界。只要可能,每次就返回一整行;但如果调用者提供的缓冲区太小,容不下服务器发送的一行,则只返回部分行。对于文本数据,可检查最后返回的字节是否为 \n ,以判断是否返回了完整行。(对于二进制 COPY ,则必须实际解析 COPY 数据格式才能作出相同判断。)返回的字符串不以零字节结尾。(如果要自行添加末尾的零字节,务必将传入的 bufsize 设置为比实际可用空间少一字节。)
@@ -3671,7 +3694,7 @@ int PQgetlineAsync(PGconn *conn,
- 向服务器发送一个空终止的字符串。如果 OK 则返回 0;如果不能发送字符串则返回EOF 。
+ 向服务器发送以零字节结尾的字符串。成功时返回 0,无法发送字符串时返回 EOF 。
int PQputline(PGconn *conn,
const char *string);
@@ -3679,16 +3702,13 @@ int PQputline(PGconn *conn,
- 一系列PQputline 调用发送的COPY 数据流和PQgetlineAsync 返回的数据具有相同的格式,
- 只是应用不需要每次PQputline 调用中发送刚好一个数据行;在每次调用中发送多行或者部分行都是可以的。
+ 连续调用 PQputline 发送的 COPY 数据流,与 PQgetlineAsync 返回的数据格式相同。不过,应用程序不必在每次 PQputline 调用中恰好发送一个数据行;每次发送部分行或多行也可以。
- 在PostgreSQL 协议 3.0 之前,应用必须显式地发送两个字符\. 作为最后一行来告知服务器应用程序已完成发送COPY 数据。
- 虽然这么做仍然有效,但是它已经被废弃并且\. 的特殊含义可能在将来的版本中删除。
- 在发送完实际数据之后, 调用PQendcopy 就足够了。
-
+ 在 PostgreSQL 协议 3.0 之前,应用程序必须显式发送由 \. 两个字符组成的最后一行,告知服务器应用程序已发送完 COPY 数据。虽然这种方式仍然有效,但已被弃用,\. 的特殊含义预计会在未来版本中移除。发送完实际数据后,调用 PQendcopy 即可。
+
@@ -3698,7 +3718,7 @@ int PQputline(PGconn *conn,
- 向服务器发送一个非空终止的字符串。如果 OK 则返回 0,如果不能发送字符串则返回EOF 。
+ 向服务器发送不以零字节结尾的字符串。成功时返回 0,无法发送字符串时返回 EOF 。
int PQputnbytes(PGconn *conn,
const char *buffer,
@@ -3707,7 +3727,7 @@ int PQputnbytes(PGconn *conn,
- 这个函数类似PQputline ,除了数据缓冲区不需要以零字节结尾,因为要发送的字节数是直接指定的。在发送二进制数据时使用这个函数。
+ 此函数与 PQputline 完全相同,只是直接指定了要发送的字节数,因此数据缓冲区不必以零字节结尾。发送二进制数据时可使用此函数。
@@ -3716,15 +3736,16 @@ int PQputnbytes(PGconn *conn,
PQendcopy PQendcopy
- 与服务器同步。
+
+ 与服务器同步。
+
int PQendcopy(PGconn *conn);
- 此函数会等待服务器完成复制。调用时机应为:使用PQputline 向服务器发送最后一个字符串后,或者使用PQgetline 从服务器收到最后一个字符串后。必须调用此函数,否则服务器与客户端将会不同步
。此函数返回后,服务器便准备好接收下一条 SQL 命令。成功完成时返回 0,否则返回非零值。(若返回非零值,可使用PQerrorMessage 取得详细信息。)
+
+此函数会等待服务器完成复制。应在使用 PQputline 向服务器发送最后一个字符串后,或使用 PQgetline 从服务器接收最后一个字符串后调用它。必须调用此函数,否则服务器与客户端会失去同步
。函数返回后,服务器便准备好接收下一条 SQL 命令。成功完成时返回 0,否则返回非零值。(返回非零值时,可用 PQerrorMessage 获取详细信息。)
+
- 在使用PQgetResult 时,应用应该通过反复调用PQgetline 并且在看到终止行后调用PQendcopy 来响应PGRES_COPY_OUT 结果。
- 然后它应该返回到PQgetResult 循环直到PQgetResult 返回一个空指针。
- 类似地,PGRES_COPY_IN 结果会用一系列PQputline 加上之后的PQendcopy 来处理,然后返回到PQgetResult 循环。
- 这样的安排将保证嵌入到一系列SQL 命令中的COPY 命令将被正确执行。
+ 使用 PQgetResult 时,收到 PGRES_COPY_OUT 结果后,应用程序应反复调用 PQgetline ,并在看到终止行后调用 PQendcopy 。随后应回到 PQgetResult 循环,直到 PQgetResult 返回空指针。类似地,收到 PGRES_COPY_IN 结果后,应连续调用 PQputline ,再调用 PQendcopy ,然后回到 PQgetResult 循环。这样可以保证嵌在一系列 SQL 命令中的 COPY 命令正确执行。
@@ -3743,8 +3764,8 @@ int PQendcopy(PGconn *conn);
控制函数
- 这些函数控制libpq 行为各种各样的细节。
-
+ 这些函数控制 libpq 行为的各种细节。
+
@@ -3753,17 +3774,15 @@ int PQendcopy(PGconn *conn);
- 返回客户端编码。
+ 返回客户端编码。
int PQclientEncoding(const PGconn *conn );
-
- 请注意,它返回的是编码 ID,而不是一个符号串字符串,如EUC_JP 。如果不成功,它会返回 -1。要把一个编码 ID 转换为为一个编码名称,可以用:
-
+注意,返回的是编码 ID,而不是 EUC_JP 这样的符号字符串。失败时返回 -1。要将编码 ID 转换为编码名称,可以使用:
char *pg_encoding_to_char(int encoding_id );
-
+
@@ -3825,16 +3844,16 @@ PGContextVisibility PQsetErrorContextVisibility(PGconn *conn, PGContextVisibilit
- 启用对客户端/服务器通讯的跟踪,把跟踪信息输出到一个调试文件流中。
+ 启用客户端/服务器通信跟踪,将跟踪信息写入调试文件流。
void PQtrace(PGconn *conn, FILE *stream);
-
+
- 在 Windows上,如果libpq 库和应用使用了不同的标志编译,那么这个函数调用会导致应用崩溃,因为FILE 指针的内部表达是不一样的。特别是多线程/单线程、发布/调试 以及静态/动态标志应该是库和所有使用库的应用都一致。
+ 在 Windows 上,如果 libpq 库与应用程序使用不同的标志编译,调用此函数会导致应用程序崩溃,因为 FILE 指针的内部表示不同。具体而言,库与所有使用它的应用程序都应使用相同的多线程/单线程、发布/调试和静态/动态标志。
@@ -3845,11 +3864,12 @@ void PQtrace(PGconn *conn, FILE *stream);
PQuntrace PQuntrace
- 禁用以下函数启动的跟踪:PQtrace 。
+
+ 禁用由 PQtrace 启动的跟踪。
void PQuntrace(PGconn *conn);
-
+
@@ -3876,11 +3896,8 @@ void PQfreemem(void *ptr);
- 释放libpq 分配的内存,尤其是PQescapeByteaConn ,PQescapeBytea ,PQunescapeBytea ,和PQnotifies 分配的内存。
- 特别重要的是,在微软 Windows 上使用这个函数,而不是free() 。
- 这是因为只有 当 DLL 和应用的多线程/单线程、发布/调试以及静态/动态标志相同时,才能在一个 DLL 中分配内存并且在应用中释放它。
- 在非微软 Windows 平台上,这个函数与标准库函数free() 相同。
-
+ 释放 libpq 分配的内存,特别是 PQescapeByteaConn 、PQescapeBytea 、PQunescapeBytea 和 PQnotifies 分配的内存。在 Microsoft Windows 上,务必使用此函数,而不是 free() 。这是因为只有 DLL 与应用程序使用相同的多线程/单线程、发布/调试和静态/动态标志,才能在 DLL 中分配内存并在应用程序中释放它。在 Microsoft Windows 以外的平台上,此函数与标准库函数 free() 相同。
+
@@ -3888,7 +3905,8 @@ void PQfreemem(void *ptr);
PQconninfoFree PQconninfoFree
- 释放以下函数分配的数据结构:PQconndefaults 或PQconninfoParse 。
+
+ 释放PQconndefaults 或 PQconninfoParse 分配的数据结构。
void PQconninfoFree(PQconninfoOption *connOptions);
@@ -3932,10 +3950,13 @@ char *PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user,
PQencryptPassword PQencryptPassword
- 准备经过 md5 加密的PostgreSQL 密码。
+
+ 准备一个PostgreSQL 密码的md5加密形式。
+
char *PQencryptPassword(const char *passwd, const char *user);
- PQencryptPassword 是以下函数的旧版本,现已弃用:PQencryptPasswordConn 。区别在于PQencryptPassword 不需要连接对象,并且md5 始终用作加密算法。
+ PQencryptPassword 是PQencryptPasswordConn 的旧版本,现已弃用。其差别是PQencryptPassword 不需要连接对象,并且总是用md5 作为加密算法。
+
@@ -3954,8 +3975,8 @@ PGresult *PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);
这是libpq 内部用于分配并初始化一个空PGresult 对象的函数。
如果无法分配内存,此函数返回NULL 。
将它导出供外部调用,是因为一些应用需要自行生成结果对象,特别是带有错误状态的对象。
- 如果conn 非空,并且status 表示错误,指定连接的当前错误消息会被复制到PGresult 中。
- 此外,如果conn 非空,连接中注册的所有事件过程也会被复制到PGresult 中。
+ 如果conn 不为 null,并且status 表示错误,指定连接的当前错误消息会被复制到PGresult 中。
+ 此外,如果conn 不为 null,连接中注册的所有事件过程也会被复制到PGresult 中。
(这些过程不会收到PGEVT_RESULTCREATE 调用,但可参见PQfireResultCreateEvents 。)
注意,最终应对该对象调用PQclear ,就像处理libpq 自身返回的PGresult 一样。
@@ -3974,16 +3995,16 @@ int PQfireResultCreateEvents(PGconn *conn, PGresult *res);
- conn 参数被传送给事件过程,但不会被直接使用。如果事件过程不使用它,则会返回NULL 。
-
+ conn 参数会传递给事件过程,但此函数不会直接使用它。如果事件过程不使用此参数,则可以传入 NULL 。
+
已经接收到这个对象的PGEVT_RESULTCREATE 或PGEVT_RESULTCOPY 事件的事件过程不会被再次触发。
- 这个函数与PQmakeEmptyPGresult 分开的主要原因是在调用事件过程之前创建一个PGresult 并且填充它常常是合适的。
-
+ 此函数与 PQmakeEmptyPGresult 分开的主要原因是,通常适合先创建 PGresult 并填充数据,然后再调用事件过程。
+
@@ -3991,10 +4012,12 @@ int PQfireResultCreateEvents(PGconn *conn, PGresult *res);
PQcopyResult PQcopyResult
- 创建一个PGresult 对象的副本。副本与源结果没有任何关联,并且PQclear 必须在不再需要该副本时调用。如果函数失败,会返回NULL 。
+
+ 创建 PGresult 对象的副本。副本与源结果没有任何关联,不再需要副本时必须调用 PQclear 。函数失败时返回 NULL 。
+
PGresult *PQcopyResult(const PGresult *src, int flags);
-
+
这不是为了制作一个精确的副本。返回的结果总是放在PGRES_TUPLES_OK 状态中,并且不复制源中的任何错误消息。 (但是会复制命令状态字符串。)flags 参数确定要复制的其他内容。它是几个标志的按位或。 PG_COPYRES_ATTRS 指定复制源结果的属性(列定义)。 PG_COPYRES_TUPLES 指定复制源结果的元组。(这也意味着复制属性。) PG_COPYRES_NOTICEHOOKS 指定复制源结果的通知钩子。 PG_COPYRES_EVENTS 指定复制源结果的事件。(但不复制与源相关的任何实例数据。)
@@ -4023,18 +4046,15 @@ int PQsetResultAttrs(PGresult *res, int numAttributes, PGresAttDesc *attDescs);
- 设置一个PGresult 对象的一个元组域值。
+ 设置 PGresult 对象中某个元组的字段值。
int PQsetvalue(PGresult *res, int tup_num, int field_num, char *value, int len);
-
+
- 这个函数将自动按需增加结果的内部元组数组。但是,tup_num 参数必须小于等于PQntuples ,意味着这个函数对元组数组一次只能增加一个元组。
- 但已存在的任意元组中的任意域可以以任意顺序进行调整。如果field_num 的一个值已经存在,它会被覆盖。
- 如果len 是 -1,或value 是NULL , 该域值会被设置为一个 SQL 空值。
- value 会被复制到结果的私有存储中,因此函数返回后就不再需要了。如果函数失败,返回值是 0。如果函数成功,返回值会是非 0。
-
+ 此函数会根据需要自动扩展结果内部的元组数组。不过,tup_num 参数必须小于或等于 PQntuples ,也就是说,每次只能向元组数组增加一个元组。已有元组的任何字段都可以按任意顺序修改。如果 field_num 指定的位置已有值,该值会被覆盖。如果 len 为 -1 或 value 为 NULL ,则将该字段设置为 SQL null 值。value 会被复制到结果的私有存储中,因此函数返回后就不再需要它。函数失败时返回零,成功时返回非零值。
+
@@ -4051,8 +4071,8 @@ void *PQresultAlloc(PGresult *res, size_t nBytes);
- 当res 被清除时,这个函数分配的内存也会被释放掉。如果函数失败,返回值是NULL 。结果被保证为按照数据的任意类型充分地对齐,正如malloc 所作的。
-
+ 使用此函数分配的所有内存都会在清除 res 时释放。函数失败时返回 NULL 。与 malloc 一样,返回的内存保证满足任意数据类型的对齐要求。
+
@@ -4068,28 +4088,25 @@ int PQlibVersion(void);
- 在运行时,这个函数的结果可以被用来决定在当前已载入的 libpq 版本中特定的功能是否可用。
- 例如,这个函数可以被用来决定哪些选项可以被用于PQconnectdb 。
-
+ 可在运行时根据此函数的结果,判断当前已加载的 libpq 版本是否具有特定功能。例如,可用它判断 PQconnectdb 支持哪些连接选项。
+
- 结果通过将库的主版本号乘以10000再加上次版本号形成。例如,版本10.1将被返回为100001,而版本11.0将被返回为110000。
-
+ 返回值等于库的主版本号乘以 10000 再加上次版本号。例如,版本 10.1 返回 100001,版本 11.0 返回 110000。
+
- 在主版本10之前,PostgreSQL 采用一种由三个部分组成的版本号,其中前两部分共同表示主版本。
- 对于那些版本,PQlibVersion 为每个部分使用两个数字,例如版本9.1.5将被返回为90105,而版本9.2.0将被返回为90200。
-
+ 在主版本 10 之前,PostgreSQL 使用由三个部分组成的版本号,前两个部分共同表示主版本。对于这些版本,PQlibVersion 用两位数字表示每个部分;例如,版本 9.1.5 返回 90105,版本 9.2.0 返回 90200。
+
- 因此,出于判断特性兼容性的目的,应用应该将PQlibVersion 的结果除以100而不是10000来判断逻辑的主版本号。
- 在所有的发行序列中,只有最后两个数字在次发行(问题修正发行)之间不同。
-
+ 因此,为了判断功能兼容性,应用程序应将 PQlibVersion 的结果除以 100 而非 10000,得到逻辑上的主版本号。在所有版本系列中,次版本(错误修复版本)之间只有最后两位数字不同。
+
- 这个函数出现于PostgreSQL 版本 9.1,因此它不能被用来在早期的版本中检测所需的功能,因为调用它将会创建一个对版本9.1及其后版本的链接依赖。
+ 此函数从 PostgreSQL 9.1 起提供,因而不能用它检测更早版本是否具有所需功能:调用它会建立对 9.1 或更高版本的链接依赖。
@@ -4103,13 +4120,13 @@ int PQlibVersion(void);
通知处理
- notice processing
- in libpq
+ 通知处理
+ 在 libpq 中
- 服务器产生的通知和警告消息不会被查询执行函数返回,因为它们不代表查询失败。它们可以被传递给一个通知处理函数,并且在处理者返回后执行会继续正常进行。默认的处理函数会把消息打印在stderr 上,但是应用可以通过提供它自己的处理函数来重载这种行为。
-
+ 服务器生成的通知和警告消息不由查询执行函数返回,因为它们并不表示查询失败。这些消息会传递给通知处理函数,处理函数返回后,执行正常继续。默认通知处理函数将消息打印到 stderr ,应用程序也可以提供自己的处理函数来替换这一行为。
+
由于历史原因,通知处理有两个级别,称为通知接收器和通知处理器。通知接收器的默认行为是格式化通知并且将一个字符串传递给通知处理器来打印。不过,如果一个应用选择提供自己的通知接收器,它通常会忽略通知处理器层并且在通知接收器中完成所有工作。
@@ -4117,10 +4134,10 @@ int PQlibVersion(void);
函数PQsetNoticeReceiver
- notice receiver
+ 通知接收器
PQsetNoticeReceiver 为一个连接对象设置或者检查当前的通知接收器。
相似地,PQsetNoticeProcessor
- notice processor
+ 通知处理器
PQsetNoticeProcessor 设置或检查当前的通知处理器。
@@ -4143,19 +4160,16 @@ PQsetNoticeProcessor(PGconn *conn,
- 当接收到一个服务器产生的或者libpq 内部产生的通知或警告消息,通知接收器函数会被调用。
- 该函数会以一种PGRES_NONFATAL_ERROR PGresult 的形式接收该消息
- (这允许接收器使用PQresultErrorField 抽取个别的域,或者使用PQresultErrorMessage 或者PQresultVerboseErrorMessage 得到一个完整的预格式化的消息)。
- 被传递给PQsetNoticeReceiver 的同一个 void 指针也被传递(必要时,这个指针可以被用来访问应用相关的状态)。
-
+ 从服务器收到通知或警告消息,或者 libpq 内部生成这类消息时,便会调用通知接收器函数。消息以状态为 PGRES_NONFATAL_ERROR 的 PGresult 对象传给该函数。(接收器可使用 PQresultErrorField 提取单个字段,也可使用 PQresultErrorMessage 或 PQresultVerboseErrorMessage 获取完整的预格式化消息。)传给 PQsetNoticeReceiver 的同一个 void 指针也会传入。(必要时,可通过该指针访问应用程序特有的状态。)
+
默认的通知接收器会简单地抽取消息(使用PQresultErrorMessage )并且将它传递给通知处理器。
- 通知处理器负责处理一个以文本形式给出的通知或警告消息。该消息的字符串文本(包括一个收尾的新行)被传递给通知处理器,外加一个同时被传递给PQsetNoticeProcessor 的空指针(必要时,这个指针可以被用来访问应用相关的状态)。
-
+ 通知处理器负责处理以文本形式提供的通知或警告消息。传给它的参数包括消息字符串(含末尾的换行符),以及先前传给 PQsetNoticeProcessor 的同一个 void 指针。(必要时,可通过该指针访问应用程序特有的状态。)
+
默认的通知处理器很简单:
@@ -4169,9 +4183,8 @@ defaultNoticeProcessor(void *arg, const char *message)
- 一旦你设定了一个通知接收器或处理器,你应该期待只要PGconn 对象或者从它构造出的PGresult 对象存在,该函数就可能被调用。
- 在一个PGresult 创建时,PGconn 的当前通知处理指针被复制到PGresult 中,以备类似PQgetvalue 的函数使用。
-
+ 设置通知接收器或处理器后,应当预期:只要 PGconn 对象或由它生成的 PGresult 对象仍存在,就可能调用该函数。创建 PGresult 时,会将 PGconn 当前的通知处理指针复制到 PGresult 中,供 PQgetvalue 等函数在需要时使用。
+
@@ -4179,10 +4192,10 @@ defaultNoticeProcessor(void *arg, const char *message)
事件系统
- libpq 的事件系统被设计为通知已注册的事件处理器它感兴趣的libpq 事件,例如PGconn 以及PGresult 对象的创建和毁灭。一种主要的使用情况是这允许应用将自己的数据与一个PGconn 或者PGresult 关联在一起,并且确保那些数据在适当的时候被释放。
+ libpq 的事件系统被设计为通知已注册的事件处理器它感兴趣的libpq 事件,例如PGconn 以及PGresult 对象的创建和销毁。一个主要用途是允许应用将自己的数据与一个PGconn 或者PGresult 关联在一起,并且确保那些数据在适当的时候被释放。
- 每个注册的事件处理程序都与两个数据相关联,libpq 仅将其视为不透明的void * 指针。 有一个透传 指针,当事件处理程序与PGconn 注册时,应用程序提供。 透传指针在PGconn 及其生成的所有PGresult 的生命周期内永远不会更改; 因此,如果使用,它必须指向长期存在的数据。 此外,还有一个实例数据 指针,在每个PGconn 和PGresult 中一开始都是NULL 。 可以使用PQinstanceData 、PQsetInstanceData 、 PQresultInstanceData 和PQsetResultInstanceData 函数来操作此指针。 请注意,与透传指针不同,PGconn 的实例数据不会自动继承到从中创建的PGresult 。 libpq 不知道透传和实例数据指针指向的内容(如果有的话),也永远不会尝试释放它们 —— 这是事件处理程序的责任。
+ 每个注册的事件处理程序都与两项数据相关联,libpq 仅将其视为不透明的void * 指针。 有一个透传 指针,由应用程序在向 PGconn 注册事件处理程序时提供。 透传指针在PGconn 及其生成的所有PGresult 的生命周期内永远不会更改; 因此,如果使用,它必须指向长期存在的数据。 此外,还有一个实例数据 指针,在每个PGconn 和PGresult 中一开始都是NULL 。 可以使用PQinstanceData 、PQsetInstanceData 、 PQresultInstanceData 和PQresultSetInstanceData 函数来操作此指针。 请注意,与透传指针不同,PGconn 的实例数据不会自动继承到从中创建的PGresult 。 libpq 不知道透传和实例数据指针指向的内容(如果有的话),也永远不会尝试释放它们 — 这是事件处理程序的责任。
事件类型
@@ -4195,7 +4208,7 @@ defaultNoticeProcessor(void *arg, const char *message)
PGEVT_REGISTER
- 注册事件在PQregisterEventProc 被调用时触发。此时最适合初始化事件处理函数可能需要的instanceData 。每个连接中的每个事件处理函数只会触发一次注册事件。如果事件处理函数失败,则中止注册。
+ 注册事件在PQregisterEventProc 被调用时触发。此时最适合初始化事件过程可能需要的instanceData 。每个连接中的每个事件过程只会触发一次注册事件。如果事件过程失败,则中止注册。
typedef struct
{
PGconn *conn;
@@ -4207,26 +4220,26 @@ typedef struct
PGEVT_CONNRESET
- 连接重置事件会在完成以下调用时触发:PQreset 或PQresetPoll 。在这两种情况下,只有重置成功才会触发该事件。如果事件处理函数失败,整个连接重置就会失败;PGconn 会被置于CONNECTION_BAD 状态,并且PQresetPoll 将返回PGRES_POLLING_FAILED 。
+ 连接重置事件会在完成以下调用时触发:PQreset 或PQresetPoll 。在这两种情况下,只有重置成功才会触发该事件。如果事件过程失败,整个连接重置就会失败;PGconn 会被置于CONNECTION_BAD 状态,并且PQresetPoll 将返回PGRES_POLLING_FAILED 。
typedef struct
{
PGconn *conn;
} PGEventConnReset;
- 收到PGEVT_CONNRESET 事件时,应将evtInfo 指针强制转换为PGEventConnReset * 。虽然其中的PGconn 刚刚被重置,但所有事件数据都保持不变。应利用此事件重置、重新加载或重新查询相关联的instanceData 。注意,即使事件处理函数未能处理PGEVT_CONNRESET ,它仍会在连接关闭时收到PGEVT_CONNDESTROY 事件。
+ 收到PGEVT_CONNRESET 事件时,应将evtInfo 指针强制转换为PGEventConnReset * 。虽然其中的PGconn 刚刚被重置,但所有事件数据都保持不变。应利用此事件重置、重新加载或重新查询相关联的instanceData 。注意,即使事件过程未能处理PGEVT_CONNRESET ,它仍会在连接关闭时收到PGEVT_CONNDESTROY 事件。
PGEVT_CONNDESTROY
- 连接销毁事件由以下调用触发:PQfinish 。事件处理函数负责正确清理其事件数据,因为 libpq 无法管理这部分内存。如果不清理,就会造成内存泄漏。
+ 连接销毁事件由以下调用触发:PQfinish 。事件过程负责正确清理其事件数据,因为 libpq 无法管理这部分内存。如果不清理,就会造成内存泄漏。
typedef struct
{
PGconn *conn;
} PGEventConnDestroy;
- 收到PGEVT_CONNDESTROY 事件时,应将evtInfo 指针强制转换为PGEventConnDestroy * 。该事件触发于以下函数执行任何其他清理工作之前:PQfinish 。事件处理函数的返回值会被忽略,因为无法通过以下函数报告失败:PQfinish 。此外,事件处理函数失败不应中止清理不再使用的内存的过程。
+ 收到PGEVT_CONNDESTROY 事件时,应将evtInfo 指针强制转换为PGEventConnDestroy * 。该事件触发于以下函数执行任何其他清理工作之前:PQfinish 。事件过程的返回值会被忽略,因为无法通过以下函数报告失败:PQfinish 。此外,事件过程失败不应中止清理不再使用的内存的过程。
@@ -4258,32 +4271,32 @@ typedef struct
PGEVT_RESULTCOPY
- 结果复制事件会在调用PQcopyResult 时触发。只有复制完成后才会触发该事件。只有为源结果成功处理过PGEVT_RESULTCREATE 或PGEVT_RESULTCOPY 事件的事件处理函数,才会收到PGEVT_RESULTCOPY 事件。
+ 结果复制事件会在调用PQcopyResult 时触发。只有复制完成后才会触发该事件。只有为源结果成功处理过PGEVT_RESULTCREATE 或PGEVT_RESULTCOPY 事件的事件过程,才会收到PGEVT_RESULTCOPY 事件。
typedef struct
{
const PGresult *src;
PGresult *dest;
} PGEventResultCopy;
- 收到PGEVT_RESULTCOPY 事件时,应将evtInfo 指针强制转换为PGEventResultCopy * 。其中,src 结果是复制源,而dest 结果是复制目标。可以利用此事件对instanceData 进行深复制,因为PQcopyResult 无法完成这项工作。如果事件处理函数失败,整个复制操作就会失败,并且dest 结果将被清除。返回失败代码时,必须完成所有清理工作,因为不会为目标结果发送PGEVT_RESULTDESTROY 事件。
+ 收到PGEVT_RESULTCOPY 事件时,应将evtInfo 指针强制转换为PGEventResultCopy * 。其中,src 结果是复制源,而dest 结果是复制目标。可以利用此事件对instanceData 进行深复制,因为PQcopyResult 无法完成这项工作。如果事件过程失败,整个复制操作就会失败,并且dest 结果将被清除。返回失败代码时,必须完成所有清理工作,因为不会为目标结果发送PGEVT_RESULTDESTROY 事件。
PGEVT_RESULTDESTROY
- 结果销毁事件由以下调用触发:PQclear 。事件处理函数负责正确清理其事件数据,因为 libpq 无法管理这部分内存。如果不清理,就会造成内存泄漏。
+ 结果销毁事件由以下调用触发:PQclear 。事件过程负责正确清理其事件数据,因为 libpq 无法管理这部分内存。如果不清理,就会造成内存泄漏。
typedef struct
{
PGresult *result;
} PGEventResultDestroy;
- 收到PGEVT_RESULTDESTROY 事件时,应将evtInfo 指针强制转换为PGEventResultDestroy * 。该事件触发于以下函数执行任何其他清理工作之前:PQclear 。事件处理函数的返回值会被忽略,因为无法通过以下函数报告失败:PQclear 。此外,事件处理函数失败不应中止清理不再使用的内存的过程。
+ 收到PGEVT_RESULTDESTROY 事件时,应将evtInfo 指针强制转换为PGEventResultDestroy * 。该事件触发于以下函数执行任何其他清理工作之前:PQclear 。事件过程的返回值会被忽略,因为无法通过以下函数报告失败:PQclear 。此外,事件过程失败不应中止清理不再使用的内存的过程。
- 事件回调函数
+ 事件回调过程
@@ -4291,9 +4304,12 @@ typedef struct
- PGEventProc 是通过 typedef 定义的事件处理函数指针类型,也就是接收 libpq 事件的用户回调函数的指针类型。事件处理函数的签名必须为
+ PGEventProc 是通过 typedef 定义的事件过程指针类型,也就是接收 libpq 事件的用户回调函数的指针类型。事件过程的签名必须为:
+
int eventproc(PGEventId evtId, void *evtInfo, void *passThrough)
- 其中,evtId 参数指示发生了哪一种PGEVT 事件。必须将evtInfo 指针强制转换为适当的结构体类型,以获取关于该事件的更多信息。passThrough 参数是在注册事件处理函数时传给以下函数的指针:PQregisterEventProc 。函数应在成功时返回非零值,在失败时返回零。
+
+evtId 参数指示发生了哪一种 PGEVT 事件。必须将 evtInfo 指针强制转换为适当的结构体类型,以获取关于该事件的更多信息。passThrough 参数是在注册事件过程时传给 PQregisterEventProc 的指针。函数应在成功时返回非零值,在失败时返回零。
+
在任何一个PGconn 中,一个特定事件过程只能被注册一次。这是因为该过程的地址被用作查找键来标识相关的实例数据。
@@ -4302,8 +4318,8 @@ int eventproc(PGEventId evtId, void *evtInfo, void *passThrough)
- 在 Windows 上,函数能够有两个不同的地址:一个对 DLL 之外可见而另一个对 DLL 之内可见。我们应当小心只有其中之一会被用于libpq 的事件过程函数,否则将会产生混淆。编写代码的最简单规则是将所有的事件过程声明为static 。如果过程的地址必须对它自己的源代码文件之外可见,提供一个单独的函数来返回该地址。
-
+ 在 Windows 上,函数可能有两个不同的地址:一个在 DLL 外部可见,另一个在 DLL 内部可见。使用 libpq 的事件过程函数时,务必始终使用其中同一个地址,否则会产生混淆。确保代码正常工作的最简单做法,是将事件过程声明为 static 。如果需要在过程所在的源文件之外取得其地址,应提供一个单独的函数来返回该地址。
+
@@ -4329,7 +4345,7 @@ int PQregisterEventProc(PGconn *conn, PGEventProc proc,
- 在每一个你想要接收事件的PGconn 上必须注册一个事件过程。和内存不同,没有限制说一个连接上能注册多少个事件过程。如果该函数成功,它会返回一个非零值。如果它失败,则会返回零。
+ 对于希望接收其事件的每个 PGconn ,都必须注册一次事件过程。一个连接可注册的事件过程数量只受内存限制。函数成功时返回非零值,失败时返回零。
@@ -4369,7 +4385,9 @@ void *PQinstanceData(const PGconn *conn, PGEventProc proc);
PQresultSetInstanceData PQresultSetInstanceData
- 将结果的instanceData (针对proc )设置为data 。成功时返回非零,失败时返回零。(只有当proc 未在结果中正确注册时,才可能失败。)
+
+ 将结果中针对 proc 的 instanceData 设置为 data 。成功时返回非零值,失败时返回零。(只有当 proc 未在结果中正确注册时,才可能失败。)
+
int PQresultSetInstanceData(PGresult *res, PGEventProc proc, void *data);
@@ -4393,18 +4411,18 @@ void *PQresultInstanceData(const PGresult *res, PGEventProc proc);
- 事件实例
+ 事件示例
- 这里是一个管理与 libpq 连接和结果相关的私有数据的示例的框架。
-
+ 下面给出一个示例框架,用于管理与 libpq 连接和结果关联的私有数据。
+
-/* The instanceData */
+/* instanceData 数据 */
typedef struct
{
int n;
@@ -4430,8 +4448,8 @@ main(void)
return 1;
}
- /* called once on any connection that should receive events.
- * Sends a PGEVT_REGISTER to myEventProc.
+ /* 在每个需要接收事件的连接上调用一次。
+ * 向 myEventProc 发送 PGEVT_REGISTER 事件。
*/
if (!PQregisterEventProc(conn, myEventProc, "mydata_proc", NULL))
{
@@ -4440,28 +4458,28 @@ main(void)
return 1;
}
- /* conn instanceData is available */
+ /* 可以取得 conn 的 instanceData */
data = PQinstanceData(conn, myEventProc);
- /* Sends a PGEVT_RESULTCREATE to myEventProc */
+ /* 向 myEventProc 发送 PGEVT_RESULTCREATE 事件 */
res = PQexec(conn, "SELECT 1 + 1");
- /* result instanceData is available */
+ /* 可以取得结果的 instanceData */
data = PQresultInstanceData(res, myEventProc);
- /* If PG_COPYRES_EVENTS is used, sends a PGEVT_RESULTCOPY to myEventProc */
+ /* 使用 PG_COPYRES_EVENTS 时,向 myEventProc 发送 PGEVT_RESULTCOPY 事件 */
res_copy = PQcopyResult(res, PG_COPYRES_TUPLES | PG_COPYRES_EVENTS);
- /* result instanceData is available if PG_COPYRES_EVENTS was
- * used during the PQcopyResult call.
+ /* 如果调用 PQcopyResult 时使用了 PG_COPYRES_EVENTS,
+ * 就可以取得结果的 instanceData。
*/
data = PQresultInstanceData(res_copy, myEventProc);
- /* Both clears send a PGEVT_RESULTDESTROY to myEventProc */
+ /* 两次清除操作都会向 myEventProc 发送 PGEVT_RESULTDESTROY 事件 */
PQclear(res);
PQclear(res_copy);
- /* Sends a PGEVT_CONNDESTROY to myEventProc */
+ /* 向 myEventProc 发送 PGEVT_CONNDESTROY 事件 */
PQfinish(conn);
return 0;
@@ -4477,7 +4495,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGEventRegister *e = (PGEventRegister *)evtInfo;
mydata *data = get_mydata(e->conn);
- /* associate app specific data with connection */
+ /* 将应用程序特有的数据与连接关联 */
PQsetInstanceData(e->conn, myEventProc, data);
break;
}
@@ -4497,7 +4515,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGEventConnDestroy *e = (PGEventConnDestroy *)evtInfo;
mydata *data = PQinstanceData(e->conn, myEventProc);
- /* free instance data because the conn is being destroyed */
+ /* 连接正在销毁,因此释放实例数据 */
if (data)
free_mydata(data);
break;
@@ -4509,8 +4527,8 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
mydata *conn_data = PQinstanceData(e->conn, myEventProc);
mydata *res_data = dup_mydata(conn_data);
- /* associate app specific data with result (copy it from conn) */
- PQsetResultInstanceData(e->result, myEventProc, res_data);
+ /* 将应用程序特有的数据与结果关联(从 conn 复制) */
+ PQresultSetInstanceData(e->result, myEventProc, res_data);
break;
}
@@ -4520,8 +4538,8 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
mydata *src_data = PQresultInstanceData(e->src, myEventProc);
mydata *dest_data = dup_mydata(src_data);
- /* associate app specific data with result (copy it from a result) */
- PQsetResultInstanceData(e->dest, myEventProc, dest_data);
+ /* 将应用程序特有的数据与结果关联(从另一个结果复制) */
+ PQresultSetInstanceData(e->dest, myEventProc, dest_data);
break;
}
@@ -4530,18 +4548,18 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGEventResultDestroy *e = (PGEventResultDestroy *)evtInfo;
mydata *data = PQresultInstanceData(e->result, myEventProc);
- /* free instance data because the result is being destroyed */
+ /* 结果正在销毁,因此释放实例数据 */
if (data)
free_mydata(data);
break;
}
- /* unknown event ID, just return true. */
+ /* 未知的事件 ID,直接返回 true。 */
default:
break;
}
- return true; /* event processing succeeded */
+ return true; /* 事件处理成功 */
}
]]>
@@ -4555,7 +4573,9 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
环境变量
- 以下环境变量可用于选择连接参数的默认值,供以下函数使用:PQconnectdb , PQsetdbLogin 和PQsetdb ,前提是调用代码没有直接指定这些参数的值。例如,这样可以避免在简单的客户端应用程序中硬编码数据库连接信息。
+
+ 以下环境变量可用于选择连接参数的默认值,供 PQconnectdb 、PQsetdbLogin 和 PQsetdb 在调用代码未直接指定参数值时使用。例如,这样可以避免在简单的客户端应用程序中硬编码数据库连接信息。
+
@@ -4652,9 +4672,8 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGSERVICEFILE
- PGSERVICEFILE 指定每个用户的连接服务文件的名称
- (参见 )。
- 默认为~/.pg_service.conf ,或者在Microsoft Windows上为%APPDATA%\postgresql\.pg_service.conf 。
+ PGSERVICEFILE 指定每个用户的连接服务文件的名称(参见 )。
+ 默认为~/.pg_service.conf ,或者在 Microsoft Windows 上为%APPDATA%\postgresql\.pg_service.conf 。
@@ -4699,7 +4718,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGREQUIRESSL 的行为与 连接参数相同。
- 这个环境变量已被弃用,推荐使用PGSSLMODE 变量;设置这两个变量会抑制这个变量的效果。
+ 这个环境变量已被弃用,推荐使用PGSSLMODE 变量;同时设置这两个变量时,前者不再生效。
@@ -4826,7 +4845,9 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
- 以下环境变量可用于指定每个PostgreSQL 会话的默认行为。(也可参见 和 命令,了解按用户或按数据库设置默认行为的方法。)
+
+ 以下环境变量可用于指定每个 PostgreSQL 会话的默认行为。(也可参见 和 命令,了解按用户或按数据库设置默认行为的方法。)
+
@@ -4853,7 +4874,9 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
PGGEQO 为遗传查询优化器设置默认模式(等同于SET geqo TO ... )。
- 有关这些环境变量的正确取值,请参见SQL 命令 。
+
+有关这些环境变量的正确取值,请参见 SQL 命令 。
+
下面的环境变量决定libpq 的内部行为,它们会覆盖编译在程序中的默认值。
@@ -4901,7 +4924,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
(可以复制上面这一行,并在行首加上# ,在文件中加入提示注释。)前四个字段中的每一个都可以是字面值,或者是* ,后者可以匹配任何内容。将使用与当前连接参数匹配的第一行中的密码字段。(因此,使用通配符时,应将更具体的条目放在前面。)如果条目需要包含: 或\ ,请使用\ 转义该字符。主机名字段首先匹配已指定的host 连接参数;否则匹配已指定的hostaddr 参数。如果两者都未指定,则查找主机名localhost 。在以下情况下也会查找主机名localhost :连接使用 Unix 域套接字,且host 参数与libpq 的默认套接字目录路径匹配。在备库中,数据库字段为replication 时,匹配连接到主库的流复制连接。除此之外,数据库字段的用途有限,因为同一用户在同一数据库集簇的所有数据库中使用相同的密码。
- 在 Unix 系统上,密码文件上的权限必须不允许所有人或组内访问,可以用chmod 0600 ~/.pgpass 这样的命令实现。如果权限没有这么严格,该文件将被忽略。在微软 Windows 上,该文件被假定存储在一个安全的目录中,因此不会进行特别的权限检查。
+ 在 Unix 系统上,密码文件的权限必须禁止所属组及其他用户的任何访问;可以用 chmod 0600 ~/.pgpass 这样的命令实现。如果权限没有这么严格,该文件将被忽略。在 Microsoft Windows 上,假定该文件存储在安全的目录中,因此不进行特殊的权限检查。
@@ -4923,10 +4946,7 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
- 连接服务文件允许 libpq 连接参数与一个单一服务名称关联。
- 那个服务名称可以在一个 libpq 连接字符串里面指定,与其相关的设置将被使用。
- 这允许在不重新编译使用 libpq 的应用的前提下修改连接参数。
- 服务名称也可以被使用PGSERVICE 环境变量来指定。
+ 连接服务文件允许将 libpq 连接参数与单个服务名称关联。随后可以在 libpq 连接字符串中指定该服务名称,从而使用关联的设置。这样便可以修改连接参数,而无需重新编译使用 libpq 的应用程序。也可以使用 PGSERVICE 环境变量指定服务名称。
@@ -4942,23 +4962,19 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
- 或者服务文件使用一种INI 文件
格式,其中小节名是服务名并且参数是连接参数。
- 列表见 。例如:
+ 两种服务文件均使用 INI 文件
格式,其中配置段名称是服务名称,参数是连接参数;参数列表见 。例如:
-# comment
+# 注释
[mydb]
host=somehost
port=5433
user=admin
- 在PostgreSQL 安装的share/pg_service.conf.sample 中提供了一个示例文件。
+PostgreSQL 安装目录中的 share/pg_service.conf.sample 提供了一个示例文件。
- 从服务文件中获取的连接参数与从其他来源获取的参数相结合。
- 服务文件设置覆盖相应的环境变量,然后反过来可以由连接字符串中直接给出的值覆盖。
- 例如,使用上面的服务文件,连接字符串service=mydb port=5434 将使用主机somehost ,端口5434 ,
- 用户admin ,以及由环境变量或内置默认所设置的其他参数。
+ 从服务文件中获取的连接参数会与其他来源的参数合并。服务文件中的设置会覆盖相应的环境变量,而连接字符串中直接给出的值又会覆盖服务文件中的设置。例如,使用上述服务文件时,连接字符串 service=mydb port=5434 将使用主机 somehost 、端口 5434 、用户 admin ,以及由环境变量或内置默认值设置的其他参数。
@@ -5001,7 +5017,7 @@ ldap://ldap.mycompany.com/dc=mycompany,dc=com?description?one?(cn=mydatabase)
你也可以将常规的服务文件条目和 LDAP 查找混合。pg_service.conf 中一节的完整示例:
-# 只有主机和端口存储在LDAP中,显式指定dbname和user。
+# 仅 host 和 port 存储在 LDAP 中;显式指定 dbname 和 user
[customerdb]
dbname=customer
user=appuser
@@ -5026,13 +5042,13 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
- 服务器证书的客户端验证
+ 客户端对服务器证书的验证
- 默认情况下,PostgreSQL 将不会执行服务器证书的任何验证。这意味着可以在不被客户端知晓的情况下伪造服务器身份(例如通过修改一个 DNS 记录或者接管服务器的 IP 地址)。为了阻止哄骗,客户端必须能够通过一条信任链验证服务器的身份。信任链可以这样建立:在一台计算机上放置一个根(自签名的)证书机构(CA )的证书并且在另一台计算机上放置一个由根证书签发 的叶子证书。还可以使用一种中间
证书,它由根证书签发并且可以签发叶子证书。
+ 默认情况下,PostgreSQL 不会对服务器证书执行任何验证。这意味着可以在客户端不知情的情况下伪造服务器身份,例如修改 DNS 记录或接管服务器的 IP 地址。要防止身份伪造,客户端必须能够通过信任链验证服务器身份。建立信任链的方法是:在一台计算机上放置根证书机构(CA )的自签名证书,在另一台计算机上放置由根证书签发 的叶证书。也可以使用由根证书签发、又用于签发叶证书的中间
证书。
- 要让客户端验证服务器的身份,请在客户端放置根证书,并在服务器上放置由该根证书签名的叶证书。要让服务器验证客户端的身份,请在服务器上放置根证书,并在客户端放置由该根证书签名的叶证书。也可以使用一个或多个中间证书(通常与叶证书存储在一起),将叶证书链接到根证书。
+ 要让客户端验证服务器的身份,请在客户端放置根证书,并在服务器上放置由该根证书签发的叶证书。要让服务器验证客户端的身份,请在服务器上放置根证书,并在客户端放置由该根证书签发的叶证书。也可以使用一个或多个中间证书(通常与叶证书存储在一起),将叶证书链接到根证书。
建立信任链后,客户端可以通过两种方式验证服务器发送的叶证书。如果参数 sslmode 设为 verify-ca ,libpq 会沿证书链检查到存储在客户端上的根证书,以验证服务器是否可信。如果 sslmode 设为 verify-full ,libpq 还会 验证服务器主机名是否与服务器证书中存储的名称匹配。如果无法验证服务器证书,SSL 连接将失败。在大多数对安全敏感的环境中,建议使用 verify-full 。
@@ -5051,8 +5067,8 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
- 为了与 PostgreSQL 的早期版本达到向后兼容,如果存在一个根 CA 文件,sslmode =require 的行为将与verify-ca 相同,即服务器证书根据 CA 验证。我们鼓励依赖这种行为,并且需要证书验证的应用应该总是使用verify-ca 或者verify-full 。
-
+ 为与 PostgreSQL 的早期版本向后兼容,如果存在根 CA 文件,sslmode =require 的行为将与 verify-ca 相同,即根据 CA 验证服务器证书。不建议依赖这种行为;需要证书验证的应用程序应始终使用 verify-ca 或 verify-full 。
+
@@ -5060,40 +5076,28 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
客户端证书
- 如果服务器尝试通过请求客户端的叶证书来验证客户端的身份,
- libpq 将发送存储在文件
- ~/.postgresql/postgresql.crt 中的证书,该文件位于用户的主目录中。
- 证书必须链到服务器信任的根证书。匹配的
- 私钥文件~/.postgresql/postgresql.key 也必须存在。
- 在Microsoft Windows上,这些文件的名称分别为
- %APPDATA%\postgresql\postgresql.crt 和
- %APPDATA%\postgresql\postgresql.key 。
- 证书和密钥文件的位置可以通过连接参数
- sslcert 和sslkey ,
- 或通过环境变量PGSSLCERT 和PGSSLKEY 来覆盖。
-
+ 如果服务器请求客户端的叶证书以验证客户端身份,libpq 将发送用户主目录下 ~/.postgresql/postgresql.crt 文件中存储的证书。这些证书必须通过证书链连接到服务器信任的根证书。还必须存在匹配的私钥文件 ~/.postgresql/postgresql.key 。在 Microsoft Windows 上,这两个文件分别名为 %APPDATA%\postgresql\postgresql.crt 和 %APPDATA%\postgresql\postgresql.key 。可以通过连接参数 sslcert 和 sslkey ,或环境变量 PGSSLCERT 和 PGSSLKEY ,覆盖证书和密钥文件的位置。
+
- 在Unix系统上,私钥文件的权限必须禁止任何对世界或组的访问;可以通过类似以下命令来实现:
- chmod 0600 ~/.postgresql/postgresql.key 。
- 或者,该文件可以由root拥有并具有组读取权限(即0640 权限)。
- 该设置适用于由操作系统管理证书和密钥文件的安装。然后,libpq 的用户应该成为具有对这些证书和密钥文件访问权限的组的成员。
- (在Microsoft Windows上,没有文件权限检查,因为假定%APPDATA%\postgresql 目录是安全的。)
-
+ 在 Unix 系统上,私钥文件的权限必须禁止所属组及其他用户的任何访问;可以用 chmod 0600 ~/.postgresql/postgresql.key 这样的命令实现。另一种做法是使文件归 root 所有,并允许组用户读取(即 0640 权限)。这种设置适用于由操作系统管理证书和密钥文件的安装环境。此时,应将 libpq 用户加入有权访问这些证书和密钥文件的组。(在 Microsoft Windows 上,不检查文件权限,因为假定 %APPDATA%\postgresql 目录是安全的。)
+
postgresql.crt 中的第一个证书必须是客户端的证书,因为它必须匹配客户端的私钥。可以选择将中间
证书追加到该文件 — 这样做避免了在服务器上存放中间证书的要求( )。
- 创建证书的指令请参考 。
+ 有关创建证书的说明,请参见 。
不同模式中提供的保护
- 为sslmode 参数选择不同的值可以提供不同程度的保护。SSL 可以防范三类攻击:
+
+ sslmode 参数的不同值提供不同级别的保护。SSL 可以防范三类攻击:
+
窃听
@@ -5105,31 +5109,33 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
中间人(MITM )
- 如果一个第三方能对客户端和服务器之间传送的数据进行修改,它就能假装是服务器并且因此能看见并且修改数据,即使这些数据已被加密 。然后第三方可以将连接信息和数据转送给原来的服务器,使得它不可能检测到攻击。这样做的通常途径包括 DNS 污染和地址劫持,借此客户端被重定向到一个不同的服务器。还有几种其他的攻击方式能够完成这种攻击。SSL 使用证书验证让客户端认证服务器,就可以阻止这种攻击。
-
+
+ 如果第三方能修改客户端与服务器之间传输的数据,就可以冒充服务器,进而查看和修改数据,即使数据已经加密 。随后,第三方可以将连接信息和数据转发给原来的服务器,使攻击无法被察觉。常见的手段包括 DNS 污染和地址劫持,从而将客户端引向预期之外的服务器。还有其他几种攻击手段可以达到同样的目的。SSL 使用证书验证,让客户端认证服务器身份,以防范这种攻击。
+
- 模仿
+ 冒充
- 如果一个第三方能假装是一个授权的客户端,它能够简单地访问它本不能访问的数据。通常这可以由不安全的密码管理所致。SSL 使用客户端证书来确保只有持有合法证书的客户端才能访问服务器,这样就能阻止这种攻击。
-
+
+ 如果第三方能冒充获授权的客户端,就能直接访问其无权访问的数据。这通常可能由不安全的密码管理导致。SSL 使用客户端证书,确保只有持有有效证书的客户端才能访问服务器,以防范这种攻击。
+
- 对于一个已知受 SSL 保护的连接,在连接建立之前,必须在客户端和服务器 两端都配置 SSL。如果只在服务器端配置,客户端在得知服务器要求高安全性之前,可能就已经开始发送敏感信息(例如密码)。在 libpq 中,要确保连接安全,可以把sslmode 参数设置为verify-full 或verify-ca ,并为系统提供一个用于验证的根证书。这类似于使用https URL 浏览加密网页。
+ 要确保连接安全,必须在建立连接之前,在客户端和服务器两端 配置 SSL。如果仅在服务器上配置,客户端可能在得知服务器要求高安全性之前就已发送敏感信息(例如密码)。在 libpq 中,可以将 sslmode 参数设为 verify-full 或 verify-ca ,并向系统提供用于验证的根证书,以确保连接安全。这类似于使用 https URL 进行加密的网页浏览。
- 一旦服务器已经被认证,客户端可以传递敏感数据。这意味着直到这一点,客户端都不需要知道是否证书将被用于认证,这样只需要在服务器配置中指定就比较安全。
+ 服务器通过身份认证后,客户端便可以传送敏感数据。这意味着,在此之前,客户端无需知道是否会使用证书进行认证,因此可以安全地仅在服务器配置中指定这一点。
- 所有SSL 选项都带来了加密和密钥交换的负荷,因此必须在性能和安全性之间做出平衡。 不同sslmode 值所保护的风险,以及它们是怎样看待安全性和负荷的。
+ 所有 SSL 选项都会产生加密和密钥交换的开销,因此必须在性能与安全性之间作出权衡。 说明了不同 sslmode 值所能防范的风险,以及它们所表达的对安全性和开销的取舍。
@@ -5150,7 +5156,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
disable
否
否
- 我不关心安全性,并且我不想为加密增加负荷。
+ 我不关心安全性,并且我不想为加密增加开销。
@@ -5158,7 +5164,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
allow
可能
否
- 我不关心安全性,但如果服务器坚持,我将承担加密带来的负荷。
+ 我不关心安全性,但如果服务器坚持,我将承担加密带来的开销。
@@ -5166,7 +5172,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
prefer
可能
否
- 我不关心安全性,但如果服务器支持,我希望承担加密带来的负荷。
+ 我不关心加密,但如果服务器支持,我希望承担加密带来的开销。
@@ -5174,7 +5180,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
require
是
否
- 我想要对数据加密,并且我接受因此带来的负荷。我信任该网络会保证我总是连接到想要连接的服务器。
+ 我想要对数据加密,并且我接受因此带来的开销。我信任该网络会保证我总是连接到想要连接的服务器。
@@ -5182,7 +5188,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
verify-ca
是
取决于 CA 策略
- 我想要对数据加密,并且我接受因此带来的负荷。我想要确保我连接到的是我信任的服务器。
+ 我想要对数据加密,并且我接受因此带来的开销。我想要确保我连接到的是我信任的服务器。
@@ -5190,7 +5196,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
verify-full
是
是
- 我想要对数据加密,并且我接受因此带来的负荷。我想要确保我连接到的是我信任的服务器,并且就是我指定的那一个。
+ 我想要对数据加密,并且我接受因此带来的开销。我想要确保我连接到的是我信任的服务器,并且就是我指定的那一个。
@@ -5203,7 +5209,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
- sslmode 的默认值是prefer 。如表中所示,这在安全性的角度来说没有意义,并且它只承诺可能的性能负荷。提供它作为默认值只是为了向后兼容,并且我们不推荐在安全部署中使用它。
+ sslmode 的默认值是 prefer 。如表所示,从安全角度看,这一设置没有意义;它只会在可能时带来性能开销。将其作为默认值仅出于向后兼容的考虑,不建议在有安全要求的部署中使用。
@@ -5245,8 +5251,8 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
~/.postgresql/root.crt
- 可信的证书机构
- 检查服务器证书是由一个可信的证书机构签发
+ 受信任的证书机构
+ 检查服务器证书是由一个受信任的证书机构签发
@@ -5264,9 +5270,9 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
SSL 库初始化
- 如果您的应用程序初始化libssl 和/或libcrypto 库,并且libpq
- 构建时带有SSL 支持,您应该调用PQinitOpenSSL 告诉libpq
- libssl 和/或libcrypto 库已被您的应用程序初始化,以便
+ 如果你的应用程序初始化libssl 和/或libcrypto 库,并且libpq
+ 构建时带有SSL 支持,你应该调用PQinitOpenSSL 告诉libpq
+ libssl 和/或libcrypto 库已被你的应用程序初始化,以便
libpq 不会再初始化这些库。
但是,当使用OpenSSL 版本1.1.0或更高版本时,无需这样做,因为重复初始化不再成问题。
@@ -5278,7 +5284,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)
- 允许应用选择要初始化哪个安全性库。
+ 允许应用程序选择要初始化的安全库。
void PQinitOpenSSL(int do_ssl, int do_crypto);
@@ -5303,7 +5309,7 @@ void PQinitOpenSSL(int do_ssl, int do_crypto);
- 允许应用选择要初始化哪个安全性库。
+ 允许应用程序选择要初始化的安全库。
void PQinitSSL(int do_ssl);
@@ -5328,7 +5334,7 @@ void PQinitSSL(int do_ssl);
- 在线程化程序中的行为
+ 多线程程序中的行为
线程
@@ -5362,7 +5368,9 @@ int PQisthreadsafe();
PGresult 对象在创建后通常是只读的,因此可以在线程之间自由传递。不过,如果你使用 或 中描述的任何会修改PGresult 的函数,则需要自行避免对同一个PGresult 执行并发操作。
- 已弃用的 PQrequestCancel 和 PQoidStatus 函数不是线程安全的,不应在多线程程序中使用。可以用 PQcancel 替代 PQrequestCancel ,用 PQoidValue 替代 PQoidStatus 。
+
+ 已弃用的函数 PQrequestCancel 和 PQoidStatus 不是线程安全的,不应在多线程程序中使用。PQrequestCancel 可以用 PQcancel 替代;PQoidStatus 可以用 PQoidValue 替代。
+
如果你在应用程序中使用 Kerberos(除了libpq 内部之外),则需要在 Kerberos 调用周围加锁,因为 Kerberos 函数不是线程安全的。可参考libpq 源代码中的PQregisterThreadLock 函数,它提供了一种在libpq 与应用程序之间协作加锁的方法。
@@ -5372,7 +5380,7 @@ int PQisthreadsafe();
- 编译 libpq 程序
+ 构建 libpq 程序
编译
@@ -5380,16 +5388,16 @@ int PQisthreadsafe();
- 要编译(即编译并且链接)一个使用libpq 的程序,你需要做下列所有的事情:
+ 要构建(即编译和链接)一个使用 libpq 的程序,需要完成以下所有步骤:
- 包括libpq-fe.h 头文件:
+ 包含 libpq-fe.h 头文件:
#include <libpq-fe.h>
- 如果你无法这样做,那么你通常会从你的编译器得到像这样的错误消息:
+如果没有这样做,编译器通常会给出类似以下内容的错误消息:
foo.c: In function `main':
foo.c:34: `PGconn' undeclared (first use in this function)
@@ -5398,24 +5406,24 @@ foo.c:54: `CONNECTION_BAD' undeclared (first use in this function)
foo.c:68: `PGRES_COMMAND_OK' undeclared (first use in this function)
foo.c:95: `PGRES_TUPLES_OK' undeclared (first use in this function)
-
+
- 通过为你的编译器提供-Idirectory 选项,向你的编译器指出PostgreSQL 头文件安装在哪里(在某些情况下编译器默认将查看该目录,因此你可以忽略这个选项)。例如你的编译命令行可能看起来像:
+ 向编译器提供 -Idirectory 选项,指定 PostgreSQL 头文件的安装目录。(某些情况下,编译器默认会搜索该目录,此时可以省略这个选项。)例如,编译命令行可以是:
cc -c -I/usr/local/pgsql/include testprog.c
- 如果你在使用 makefile,那么把该选项加到CPPFLAGS 变量中:
+如果使用 makefile,请将该选项添加到 CPPFLAGS 变量中:
CPPFLAGS += -I/usr/local/pgsql/include
-
+
如果你的程序可能由其他用户编译,那么你不应该像那样硬编码目录位置。你可以运行工具pg_config pg_config with libpq 在本地系统上找出头文件在哪里:
+ sortas="libpq">用于 libpq在本地系统上找出头文件在哪里:
$ pg_config --includedir
/usr/local/include
@@ -5423,8 +5431,7 @@ CPPFLAGS += -I/usr/local/pgsql/include
- 如果你安装了pkg-config pkg-config with
- libpq ,你可以运行:
+ 如果你安装了pkg-config pkg-config 用于 libpq ,你可以运行:
$ pkg-config --cflags libpq
-I/usr/local/include
@@ -5433,20 +5440,20 @@ CPPFLAGS += -I/usr/local/pgsql/include
- 无法为编译器指定正确的选项将导致一个错误消息,例如:
+ 未向编译器指定正确的选项将导致类似以下内容的错误消息:
testlibpq.c:8:22: libpq-fe.h: No such file or directory
-
+
- 当链接最终的程序时,指定选项-lpq ,这样libpq 库会被编译进去,也可以用选项-Ldirectory 向编译器指出libpq 库所在的位置(再次,编译器将默认搜索某些目录)。为了最大的可移植性,将-L 选项放在-lpq 选项前面。例如:
+ 链接最终程序时,指定 -lpq 选项以链接 libpq 库,同时指定 -Ldirectory 选项,告知编译器 libpq 库所在的目录。(同样,编译器默认会搜索某些目录。)为获得最大的可移植性,请将 -L 选项放在 -lpq 选项之前。例如:
cc -o testprog testprog1.o testprog2.o -L/usr/local/pgsql/lib -lpq
-
+
你也可以使用pg_config 找出库目录:
@@ -5473,7 +5480,7 @@ testlibpq.o(.text+0x60): undefined reference to `PQsetdbLogin'
testlibpq.o(.text+0x71): undefined reference to `PQstatus'
testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'
- 这意味着你忘了 -lpq .
+ 这意味着你忘记了 -lpq 。
/usr/bin/ld: cannot find -lpq
@@ -5490,7 +5497,7 @@ testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'
示例程序
- 这些示例和其他示例可以在源代码发布的src/test/examples 目录中找到。
+ 这些示例和其他示例可在源代码发行包的src/test/examples 目录中找到。
@@ -5504,7 +5511,7 @@ testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'
*
* testlibpq.c
*
- * Test the C version of libpq, the PostgreSQL frontend library.
+ * 测试 PostgreSQL 前端库 libpq 的 C 语言版本。
*/
#include
#include
@@ -5528,19 +5535,18 @@ main(int argc, char **argv)
j;
/*
- * If the user supplies a parameter on the command line, use it as the
- * conninfo string; otherwise default to setting dbname=postgres and using
- * environment variables or defaults for all other connection parameters.
+ * 如果用户在命令行上提供了一个参数,就将其用作 conninfo 字符串;
+ * 否则默认设置 dbname=postgres,并对所有其他连接参数使用环境变量或默认值。
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
- /* Make a connection to the database */
+ /* 连接数据库 */
conn = PQconnectdb(conninfo);
- /* Check to see that the backend connection was successfully made */
+ /* 检查是否已成功建立到后端的连接 */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
@@ -5548,7 +5554,7 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* Set always-secure search path, so malicious users can't take control. */
+ /* 设置始终安全的搜索路径,防止恶意用户取得控制权。 */
res = PQexec(conn,
"SELECT pg_catalog.set_config('search_path', '', false)");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
@@ -5559,19 +5565,17 @@ main(int argc, char **argv)
}
/*
- * Should PQclear PGresult whenever it is no longer needed to avoid memory
- * leaks
+ * 不再需要 PGresult 时,应调用 PQclear 将其释放,以避免内存泄漏。
*/
PQclear(res);
/*
- * Our test case here involves using a cursor, for which we must be inside
- * a transaction block. We could do the whole thing with a single
- * PQexec() of "select * from pg_database", but that's too trivial to make
- * a good example.
+ * 这里的测试用例使用游标,因此必须处于事务块内。
+ * 只需调用一次 PQexec() 执行 "select * from pg_database" 就能完成全部操作,
+ * 但这太简单了,不足以作为一个好的示例。
*/
- /* Start a transaction block */
+ /* 开始一个事务块 */
res = PQexec(conn, "BEGIN");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
@@ -5582,7 +5586,7 @@ main(int argc, char **argv)
PQclear(res);
/*
- * Fetch rows from pg_database, the system catalog of databases
+ * 从数据库系统目录 pg_database 中获取行
*/
res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
@@ -5601,13 +5605,13 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* first, print out the attribute names */
+ /* 首先,打印属性名 */
nFields = PQnfields(res);
for (i = 0; i < nFields; i++)
printf("%-15s", PQfname(res, i));
printf("\n\n");
- /* next, print out the rows */
+ /* 接着,打印各行 */
for (i = 0; i < PQntuples(res); i++)
{
for (j = 0; j < nFields; j++)
@@ -5617,15 +5621,15 @@ main(int argc, char **argv)
PQclear(res);
- /* close the portal ... we don't bother to check for errors ... */
+ /* 关闭 portal……这里不再检查错误…… */
res = PQexec(conn, "CLOSE myportal");
PQclear(res);
- /* end the transaction */
+ /* 结束事务 */
res = PQexec(conn, "END");
PQclear(res);
- /* close the connection to the database and cleanup */
+ /* 关闭数据库连接并清理 */
PQfinish(conn);
return 0;
@@ -5644,15 +5648,15 @@ main(int argc, char **argv)
*
*
* testlibpq2.c
- * Test of the asynchronous notification interface
+ * 测试异步通知接口
*
- * Start this program, then from psql in another window do
+ * 启动此程序,然后在另一个窗口中通过 psql 执行
* NOTIFY TBL2;
- * Repeat four times to get this program to exit.
+ * 重复四次后,此程序便会退出。
*
- * Or, if you want to get fancy, try this:
- * populate a database with the following commands
- * (provided in src/test/examples/testlibpq2.sql):
+ * 或者,可以尝试更复杂的示例:
+ * 使用以下命令填充数据库
+ * (这些命令位于 src/test/examples/testlibpq2.sql 中):
*
* CREATE SCHEMA TESTLIBPQ2;
* SET search_path = TESTLIBPQ2;
@@ -5661,7 +5665,7 @@ main(int argc, char **argv)
* CREATE RULE r1 AS ON INSERT TO TBL1 DO
* (INSERT INTO TBL2 VALUES (new.i); NOTIFY TBL2);
*
- * Start this program, then from psql do this four times:
+ * 启动此程序,然后通过 psql 将以下命令执行四次:
*
* INSERT INTO TESTLIBPQ2.TBL1 VALUES (10);
*/
@@ -5698,19 +5702,18 @@ main(int argc, char **argv)
int nnotifies;
/*
- * If the user supplies a parameter on the command line, use it as the
- * conninfo string; otherwise default to setting dbname=postgres and using
- * environment variables or defaults for all other connection parameters.
+ * 如果用户在命令行上提供了一个参数,就将其用作 conninfo 字符串;
+ * 否则默认设置 dbname=postgres,并对所有其他连接参数使用环境变量或默认值。
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
- /* Make a connection to the database */
+ /* 连接数据库 */
conn = PQconnectdb(conninfo);
- /* Check to see that the backend connection was successfully made */
+ /* 检查是否已成功建立到后端的连接 */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
@@ -5718,7 +5721,7 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* Set always-secure search path, so malicious users can't take control. */
+ /* 设置始终安全的搜索路径,防止恶意用户取得控制权。 */
res = PQexec(conn,
"SELECT pg_catalog.set_config('search_path', '', false)");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
@@ -5729,13 +5732,12 @@ main(int argc, char **argv)
}
/*
- * Should PQclear PGresult whenever it is no longer needed to avoid memory
- * leaks
+ * 不再需要 PGresult 时,应调用 PQclear 将其释放,以避免内存泄漏。
*/
PQclear(res);
/*
- * Issue LISTEN command to enable notifications from the rule's NOTIFY.
+ * 发出 LISTEN 命令,以接收规则中的 NOTIFY 发出的通知。
*/
res = PQexec(conn, "LISTEN TBL2");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
@@ -5746,14 +5748,13 @@ main(int argc, char **argv)
}
PQclear(res);
- /* Quit after four notifies are received. */
+ /* 收到四次通知后退出。 */
nnotifies = 0;
while (nnotifies < 4)
{
/*
- * Sleep until something happens on the connection. We use select(2)
- * to wait for input, but you could also use poll() or similar
- * facilities.
+ * 休眠,直到连接上有事件发生。这里使用 select(2) 等待输入,
+ * 也可以使用 poll() 或类似机制。
*/
int sock;
fd_set input_mask;
@@ -5761,7 +5762,7 @@ main(int argc, char **argv)
sock = PQsocket(conn);
if (sock < 0)
- break; /* shouldn't happen */
+ break; /* 不应发生 */
FD_ZERO(&input_mask);
FD_SET(sock, &input_mask);
@@ -5772,7 +5773,7 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* Now check for input */
+ /* 现在检查是否有输入 */
PQconsumeInput(conn);
while ((notify = PQnotifies(conn)) != NULL)
{
@@ -5787,7 +5788,7 @@ main(int argc, char **argv)
fprintf(stderr, "Done.\n");
- /* close the connection to the database and cleanup */
+ /* 关闭数据库连接并清理 */
PQfinish(conn);
return 0;
@@ -5806,10 +5807,10 @@ main(int argc, char **argv)
*
*
* testlibpq3.c
- * Test out-of-line parameters and binary I/O.
+ * 测试在 SQL 命令文本之外独立传递的参数和二进制 I/O。
*
- * Before running this, populate a database with the following commands
- * (provided in src/test/examples/testlibpq3.sql):
+ * 运行前,使用以下命令填充数据库
+ * (这些命令位于 src/test/examples/testlibpq3.sql 中):
*
* CREATE SCHEMA testlibpq3;
* SET search_path = testlibpq3;
@@ -5817,7 +5818,7 @@ main(int argc, char **argv)
* INSERT INTO test1 values (1, 'joe''s place', '\\000\\001\\002\\003\\004');
* INSERT INTO test1 values (2, 'ho there', '\\004\\003\\002\\001\\000');
*
- * The expected output is:
+ * 预期输出为:
*
* tuple 0: got
* i = (4 bytes) 1
@@ -5841,7 +5842,7 @@ main(int argc, char **argv)
#include
#include "libpq-fe.h"
-/* for ntohl/htonl */
+/* 用于 ntohl/htonl */
#include
#include
@@ -5854,9 +5855,8 @@ exit_nicely(PGconn *conn)
}
/*
- * This function prints a query result that is a binary-format fetch from
- * a table defined as in the comment above. We split it out because the
- * main() function uses it twice.
+ * 此函数打印从上面注释所定义的表中以二进制格式获取的查询结果。
+ * 由于 main() 会使用它两次,因此将它单独提取成一个函数。
*/
static void
show_binary_results(PGresult *res)
@@ -5867,7 +5867,7 @@ show_binary_results(PGresult *res)
t_fnum,
b_fnum;
- /* Use PQfnumber to avoid assumptions about field order in result */
+ /* 使用 PQfnumber,以避免对结果中的字段顺序作出假设 */
i_fnum = PQfnumber(res, "i");
t_fnum = PQfnumber(res, "t");
b_fnum = PQfnumber(res, "b");
@@ -5880,24 +5880,22 @@ show_binary_results(PGresult *res)
int blen;
int ival;
- /* Get the field values (we ignore possibility they are null!) */
+ /* 获取字段值(这里忽略它们可能为 null 的情况!) */
iptr = PQgetvalue(res, i, i_fnum);
tptr = PQgetvalue(res, i, t_fnum);
bptr = PQgetvalue(res, i, b_fnum);
/*
- * The binary representation of INT4 is in network byte order, which
- * we'd better coerce to the local byte order.
+ * INT4 的二进制表示采用网络字节序,最好将其转换为本机字节序。
*/
ival = ntohl(*((uint32_t *) iptr));
/*
- * The binary representation of TEXT is, well, text, and since libpq
- * was nice enough to append a zero byte to it, it'll work just fine
- * as a C string.
+ * TEXT 的二进制表示就是文本,而 libpq 会在其后追加一个零字节,
+ * 因此可以直接将其用作 C 字符串。
*
- * The binary representation of BYTEA is a bunch of bytes, which could
- * include embedded nulls so we have to pay attention to field length.
+ * BYTEA 的二进制表示是一组字节,其中可能嵌有零字节,
+ * 因此必须注意字段长度。
*/
blen = PQgetlength(res, i, b_fnum);
@@ -5925,19 +5923,18 @@ main(int argc, char **argv)
uint32_t binaryIntVal;
/*
- * If the user supplies a parameter on the command line, use it as the
- * conninfo string; otherwise default to setting dbname=postgres and using
- * environment variables or defaults for all other connection parameters.
+ * 如果用户在命令行上提供了一个参数,就将其用作 conninfo 字符串;
+ * 否则默认设置 dbname=postgres,并对所有其他连接参数使用环境变量或默认值。
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
- /* Make a connection to the database */
+ /* 连接数据库 */
conn = PQconnectdb(conninfo);
- /* Check to see that the backend connection was successfully made */
+ /* 检查是否已成功建立到后端的连接 */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
@@ -5945,7 +5942,7 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* Set always-secure search path, so malicious users can't take control. */
+ /* 设置始终安全的搜索路径,防止恶意用户取得控制权。 */
res = PQexec(conn, "SET search_path = testlibpq3");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
@@ -5956,27 +5953,25 @@ main(int argc, char **argv)
PQclear(res);
/*
- * The point of this program is to illustrate use of PQexecParams() with
- * out-of-line parameters, as well as binary transmission of data.
+ * 此程序旨在演示如何使用 PQexecParams() 在 SQL 命令文本之外独立传递参数,
+ * 以及如何以二进制方式传输数据。
*
- * This first example transmits the parameters as text, but receives the
- * results in binary format. By using out-of-line parameters we can avoid
- * a lot of tedious mucking about with quoting and escaping, even though
- * the data is text. Notice how we don't have to do anything special with
- * the quote mark in the parameter value.
+ * 第一个示例以文本形式传输参数,但以二进制格式接收结果。
+ * 通过在 SQL 命令文本之外独立传递参数,即使数据是文本,也可以避免
+ * 许多繁琐的引号和转义处理。注意,参数值中的引号无需任何特殊处理。
*/
- /* Here is our out-of-line parameter value */
+ /* 这是在 SQL 命令文本之外独立传递的参数值 */
paramValues[0] = "joe's place";
res = PQexecParams(conn,
"SELECT * FROM test1 WHERE t = $1",
- 1, /* one param */
- NULL, /* let the backend deduce param type */
+ 1, /* 一个参数 */
+ NULL, /* 让后端推断参数类型 */
paramValues,
- NULL, /* don't need param lengths since text */
- NULL, /* default to all text params */
- 1); /* ask for binary results */
+ NULL, /* 文本参数无需指定长度 */
+ NULL, /* 默认所有参数均为文本 */
+ 1); /* 请求二进制结果 */
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
@@ -5990,31 +5985,29 @@ main(int argc, char **argv)
PQclear(res);
/*
- * In this second example we transmit an integer parameter in binary form,
- * and again retrieve the results in binary form.
+ * 第二个示例以二进制形式传输一个整数参数,并同样以二进制形式获取结果。
*
- * Although we tell PQexecParams we are letting the backend deduce
- * parameter type, we really force the decision by casting the parameter
- * symbol in the query text. This is a good safety measure when sending
- * binary parameters.
+ * 虽然我们告诉 PQexecParams 让后端推断参数类型,但实际上,
+ * 查询文本中的参数符号经过强制类型转换,因此其类型已经确定。
+ * 发送二进制参数时,这是一项良好的安全措施。
*/
- /* Convert integer value "2" to network byte order */
+ /* 将整数值 "2" 转换为网络字节序 */
binaryIntVal = htonl((uint32_t) 2);
- /* Set up parameter arrays for PQexecParams */
+ /* 为 PQexecParams 设置参数数组 */
paramValues[0] = (char *) &binaryIntVal;
paramLengths[0] = sizeof(binaryIntVal);
- paramFormats[0] = 1; /* binary */
+ paramFormats[0] = 1; /* 二进制 */
res = PQexecParams(conn,
"SELECT * FROM test1 WHERE i = $1::int4",
- 1, /* one param */
- NULL, /* let the backend deduce param type */
+ 1, /* 一个参数 */
+ NULL, /* 让后端推断参数类型 */
paramValues,
paramLengths,
paramFormats,
- 1); /* ask for binary results */
+ 1); /* 请求二进制结果 */
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
@@ -6027,7 +6020,7 @@ main(int argc, char **argv)
PQclear(res);
- /* close the connection to the database and cleanup */
+ /* 关闭数据库连接并清理 */
PQfinish(conn);
return 0;
diff --git a/zh/11/lobj.sgml b/zh/11/lobj.sgml
index a2edfc51..12f2f107 100644
--- a/zh/11/lobj.sgml
+++ b/zh/11/lobj.sgml
@@ -3,8 +3,8 @@
大对象
- large object
- BLOB large object
+ 大对象
+ BLOB 大对象
PostgreSQL 提供一种大对象 机制,允许以流式方式访问存储在专用大对象结构中的用户数据。在处理大到无法方便地整体操作的数据值时,这种流式访问非常有用。
@@ -19,7 +19,7 @@
TOAST
- versus large objects
+ 与大对象对比
@@ -186,11 +186,11 @@ inv_fd = lo_open(conn, inv_oid, INV_READ|INV_WRITE);
int lo_write(PGconn *conn, int fd, const char *buf, size_t len);
- 将buf 中的len 字节(其大小必须为len )写入大对象描述符fd 。fd 参数必须是先前由lo_open 返回的大对象描述符。返回值是实际写入的字节数(在当前实现中,除非出错,否则它总会等于len )。发生错误时,返回值为 -1。
+ 将buf 中的len 字节(缓冲区大小必须为len )写入大对象描述符fd 。fd 参数必须是先前由lo_open 返回的大对象描述符。返回值是实际写入的字节数(在当前实现中,除非出错,否则它总会等于len )。发生错误时,返回值为 -1。
- 虽然len 参数被声明为size_t ,但该函数会拒绝大于INT_MAX 的长度值。实际上,无论如何最好按每块最多几兆字节来传输数据。
+ 虽然len 参数被声明为size_t ,但该函数会拒绝大于INT_MAX 的长度值。实际上,最好按每块最多几兆字节来传输数据。
@@ -207,7 +207,7 @@ int lo_read(PGconn *conn, int fd, char *buf, size_t len);
- 虽然len 参数被声明为size_t ,但该函数会拒绝大于INT_MAX 的长度值。实际上,无论如何最好按每块最多几兆字节来传输数据。
+ 虽然len 参数被声明为size_t ,但该函数会拒绝大于INT_MAX 的长度值。实际上,最好按每块最多几兆字节来传输数据。
@@ -273,7 +273,7 @@ pg_int64 lo_tell64(PGconn *conn, int fd);
int lo_truncate(PGconn *conn, int fd, size_t len);
- 该函数把大对象描述符fd 截断为长度len 。fd 参数必须是先前由lo_open 返回的大对象描述符。如果len 大于大对象当前的长度,则会用空字节('\0')把该大对象扩展到指定长度。成功时,lo_truncate 返回零;出错时返回值为 -1。
+ 该函数把大对象描述符fd 对应的大对象截断为长度len 。fd 参数必须是先前由lo_open 返回的大对象描述符。如果len 大于大对象当前的长度,则会用零字节('\0')把该大对象扩展到指定长度。成功时,lo_truncate 返回零;出错时返回值为 -1。
@@ -394,16 +394,16 @@ CREATE TABLE image (
raster oid
);
-SELECT lo_creat(-1); -- returns OID of new, empty large object
+SELECT lo_creat(-1); -- 返回新建的空大对象的 OID
-SELECT lo_create(43213); -- attempts to create large object with OID 43213
+SELECT lo_create(43213); -- 尝试创建 OID 为 43213 的大对象
-SELECT lo_unlink(173454); -- deletes large object with OID 173454
+SELECT lo_unlink(173454); -- 删除 OID 为 173454 的大对象
INSERT INTO image (name, raster)
VALUES ('beautiful image', lo_import('/etc/motd'));
-INSERT INTO image (name, raster) -- same as above, but specify OID to use
+INSERT INTO image (name, raster) -- 与上例相同,但指定要使用的 OID
VALUES ('beautiful image', lo_import('/etc/motd', 68583));
SELECT lo_export(image.raster, '/tmp/motd') FROM image
@@ -412,7 +412,7 @@ SELECT lo_export(image.raster, '/tmp/motd') FROM image
- 服务器端的lo_import 和lo_export 函数与其客户端对应函数的行为差异很大。这两个函数在服务器的文件系统中读写文件,使用数据库所有者的权限。因此,默认情况下它们的使用仅限于超级用户。相比之下,客户端导入和导出函数在客户端的文件系统中读写文件,使用客户端程序的权限。客户端函数不需要任何数据库权限,除了读取或写入相关大对象所需的权限。
+ 服务器端的lo_import 和lo_export 函数与其客户端对应函数的行为差异很大。这两个函数在服务器的文件系统中读写文件,使用运行数据库服务器的操作系统用户的权限。因此,默认情况下它们的使用仅限于超级用户。相比之下,客户端导入和导出函数在客户端的文件系统中读写文件,使用客户端程序的权限。客户端函数不需要任何数据库权限,除了读取或写入相关大对象所需的权限。
@@ -431,7 +431,7 @@ SELECT lo_export(image.raster, '/tmp/motd') FROM image
示例程序
- 是一个示例程序,它展示了如何使用libpq 中的大对象接口。程序中有些部分已经被注释掉,但仍保留在源代码中供读者参考。该程序也可以在源代码发行版的src/test/examples/testlo.c 中找到。
+ 是一个示例程序,它展示了如何使用libpq 中的大对象接口。程序中有些部分已经被注释掉,但仍保留在源代码中供读者参考。该程序也可以在源代码发行包的src/test/examples/testlo.c 中找到。
@@ -440,13 +440,13 @@ SELECT lo_export(image.raster, '/tmp/motd') FROM image
/*-------------------------------------------------------------------------
*
* testlo.c
- * test using large objects with libpq
+ * 测试使用 libpq 操作大对象
*
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
*
- * IDENTIFICATION
+ * 标识
* src/test/examples/testlo.c
*
*-------------------------------------------------------------------------
@@ -466,7 +466,7 @@ SELECT lo_export(image.raster, '/tmp/motd') FROM image
/*
* importFile -
- * import file "in_filename" into database as large object "lobjOid"
+ * 将文件 "in_filename" 作为大对象 "lobjOid" 导入数据库
*
*/
static Oid
@@ -480,16 +480,16 @@ importFile(PGconn *conn, char *filename)
int fd;
/*
- * open the file to be read in
+ * 打开要读取的文件
*/
fd = open(filename, O_RDONLY, 0666);
if (fd < 0)
- { /* error */
+ { /* 错误 */
fprintf(stderr, "cannot open unix file\"%s\"\n", filename);
}
/*
- * create the large object
+ * 创建大对象
*/
lobjId = lo_creat(conn, INV_READ | INV_WRITE);
if (lobjId == 0)
@@ -498,7 +498,7 @@ importFile(PGconn *conn, char *filename)
lobj_fd = lo_open(conn, lobjId, INV_WRITE);
/*
- * read in from the Unix file and write to the inversion file
+ * 从 Unix 文件读取数据并写入大对象
*/
while ((nbytes = read(fd, buf, BUFSIZE)) > 0)
{
@@ -536,7 +536,7 @@ pickout(PGconn *conn, Oid lobjId, int start, int len)
fprintf(stderr, ">>> %s", buf);
nread += nbytes;
if (nbytes <= 0)
- break; /* no more data? */
+ break; /* 没有更多数据? */
}
free(buf);
fprintf(stderr, "\n");
@@ -582,7 +582,7 @@ overwrite(PGconn *conn, Oid lobjId, int start, int len)
/*
* exportFile -
- * export large object "lobjOid" to file "out_filename"
+ * 将大对象 "lobjOid" 导出到文件 "out_filename"
*
*/
static void
@@ -595,24 +595,24 @@ exportFile(PGconn *conn, Oid lobjId, char *filename)
int fd;
/*
- * open the large object
+ * 打开大对象
*/
lobj_fd = lo_open(conn, lobjId, INV_READ);
if (lobj_fd < 0)
fprintf(stderr, "cannot open large object %u", lobjId);
/*
- * open the file to be written to
+ * 打开要写入的文件
*/
fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666);
if (fd < 0)
- { /* error */
+ { /* 错误 */
fprintf(stderr, "cannot open unix file\"%s\"",
filename);
}
/*
- * read in from the inversion file and write to the Unix file
+ * 从大对象读取数据并写入 Unix 文件
*/
while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) > 0)
{
@@ -659,11 +659,11 @@ main(int argc, char **argv)
out_filename = argv[3];
/*
- * set up the connection
+ * 建立连接
*/
conn = PQsetdb(NULL, NULL, NULL, NULL, database);
- /* check to see that the backend connection was successfully made */
+ /* 检查是否已成功建立到后端的连接 */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
@@ -671,7 +671,7 @@ main(int argc, char **argv)
exit_nicely(conn);
}
- /* Set always-secure search path, so malicious users can't take control. */
+ /* 设置始终安全的搜索路径,防止恶意用户取得控制权。 */
res = PQexec(conn,
"SELECT pg_catalog.set_config('search_path', '', false)");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
diff --git a/zh/11/pgtrgm.sgml b/zh/11/pgtrgm.sgml
index edf12a49..e7d83b21 100644
--- a/zh/11/pgtrgm.sgml
+++ b/zh/11/pgtrgm.sgml
@@ -339,11 +339,11 @@ SELECT * FROM test_trgm WHERE t ~ '(foo|bar)';
- 文本搜索集成
+ 文本检索集成
与全文索引结合使用时,三字符组匹配是非常有用的工具。
- 尤其是,它有助于识别那些因拼写错误而无法被全文搜索机制直接匹配的输入词。
+ 尤其是,它有助于识别那些因拼写错误而无法被全文检索机制直接匹配的输入词。
diff --git a/zh/11/protocol.sgml b/zh/11/protocol.sgml
index 097ac8e6..36b07c84 100644
--- a/zh/11/protocol.sgml
+++ b/zh/11/protocol.sgml
@@ -33,7 +33,7 @@
- 会话通常由前端选择终止,但在某些情况下也可能由后端强制终止。无论哪种情况,后端在关闭连接前都会回滚所有打开的(未完成的)事务。
+ 会话通常由前端选择终止,但在某些情况下也可能由后端强制终止。无论哪种情况,后端关闭连接时,都会在退出前回滚所有打开的(未完成的)事务。
@@ -72,9 +72,7 @@
整个执行周期包括一个解析 步骤,它从文本查询字符串创建预备语句;
一个绑定 步骤,它根据预备语句和所需参数值创建 portal;
- 以及一个执行 步骤,用于执行 portal 中的查询。对于返回行的查询
- (SELECT 、SHOW 等),可以要求执行步骤只取回
- 有限数量的行,因此可能需要多次执行步骤才能完成整个操作。
+ 以及一个执行 步骤,用于执行 portal 中的查询。对于返回行的查询(SELECT 、SHOW 等),可以要求执行步骤只取回有限数量的行,因此可能需要多次执行步骤才能完成整个操作。
@@ -91,8 +89,8 @@
- 文本形式的数值是特定数据类型的输入/输出转换函数生成或接受的任何字符串。在传输形式上,字符串没有末尾空字符;如果前端要想把收到的值当作C字符串处理,那么必须自己加上一个(顺便说一下,文本格式不允许嵌入空字符)。
-
+ 值的文本表示是相应数据类型的输入/输出转换函数生成和接受的字符串。在传输形式中,值的末尾没有空字符;前端若要将收到的值作为 C 字符串处理,必须自行添加一个。(文本格式也不允许内嵌空字符。)
+
整数的二进制表示采用网络字节序(最高有效字节在前)。至于其他数据类型,请查阅文档或源代码了解其二进制表示形式。要注意,复杂数据类型的二进制表示可能会在不同服务器版本之间发生变化;文本格式通常是可移植性更好的选择。
@@ -112,7 +110,7 @@
启动
- 要开始一个会话,前端会打开到服务器的连接并发送一条启动消息。该消息包含用户名以及用户希望连接的数据库名;它还指明要使用的协议版本。(启动消息也可以选择性地包含运行时参数的附加设置。)随后服务器会结合这些信息以及配置文件(例如 pg_hba.conf )的内容,判断该连接在初步上是否可接受,以及是否需要额外的认证。
+ 要开始一个会话,前端会打开到服务器的连接并发送一条启动消息。该消息包含用户名以及用户希望连接的数据库名;它还指明要使用的协议版本。(启动消息也可以选择性地包含运行时参数的附加设置。)随后服务器会结合这些信息以及配置文件(例如 pg_hba.conf )的内容,初步判断是否接受该连接,以及需要何种额外认证(如果需要)。
@@ -355,7 +353,7 @@
表示即将返回行作为对SELECT 、FETCH 等查询的响应。
- 此消息的内容描述了行的列布局。这将跟随每个返回给前端的行的DataRow消息。
+ 此消息的内容描述了行的列布局。该消息之后,每个返回给前端的行都对应一条 DataRow 消息。
@@ -434,14 +432,14 @@
- 我们建议的方法是把前端代码写成状态机的风格,它可以在任何时刻接受任何有意义的消息类型,而不是假设消息的序列总是准确。
-
+ 建议以状态机的方式编写前端,使其能够在任何合理的时机接收相应类型的消息,而不把消息确切顺序的假设写死在代码中。
+
一个简单查询中的多条语句
- 当一个简单查询消息中包含多于一条SQL语句(被分号分隔)时,那些语句会被当做一个事务中执行,除非其中包括显式事务控制命令来强制不同的行为。例如,如果消息包括
+ 当一个简单查询消息中包含多于一条SQL语句(被分号分隔)时,这些语句会作为单个事务执行,除非其中包括显式事务控制命令来强制不同的行为。例如,如果消息包括
INSERT INTO mytable VALUES(1);
SELECT 1/0;
@@ -463,15 +461,15 @@ SELECT 1/0;
- 这种行为通过在一个隐式事务块 中的一个多语句Query消息中运行那些语句来实现,除非它们运行在某个显式事务块中。隐式事务块与常规事务块之间的区别在于隐式块会在Query消息结束时自动被关闭,或者是在没有错误的情况下由一个隐式提交关闭,或者是在有错误时由一个隐式的回滚关闭。这类似于一个语句自己执行(当不在事务块中时)时发生的隐式提交或回滚。
-
+ 这种行为的实现方式是:除非已有显式事务块可供这些语句执行,否则就在一个隐式事务块 中执行多语句 Query 消息中的语句。隐式事务块与常规事务块的主要区别在于,隐式块会在 Query 消息结束时自动关闭:没有错误时隐式提交,发生错误时隐式回滚。这类似于单独执行一条语句(不在事务块中)时发生的隐式提交或回滚。
+
- 如果会话已经在一个事务块中,作为前面某个消息中BEGIN 的结果,那么Query消息会简单地继续那个事务块,不管该消息包含一个语句还是多个语句。不过,如果该Query消息包含一个关闭现有事务块的COMMIT 或者ROLLBACK ,那么任何接下来的语句都会在一个隐式事务块中被执行。反过来,如果在多语句Query消息中出现一个BEGIN ,那么它会开始一个常规事务块,这个常规事务块将只能被一个显式的COMMIT 或者ROLLBACK 终止,不管这两种命令是出现在这个Query消息还是后面的一个Query消息中。如果BEGIN 跟在一些作为隐式事务块执行的语句后面,那些语句不会被立刻提交。实际上,它们会被包括到新的常规事务块中。
+ 如果会话因前面某条消息中的BEGIN 而已经处于事务块中,那么 Query 消息会继续该事务块,不管该消息包含一个语句还是多个语句。不过,如果该Query消息包含一个关闭现有事务块的COMMIT 或者ROLLBACK ,那么任何接下来的语句都会在一个隐式事务块中被执行。反过来,如果在多语句Query消息中出现一个BEGIN ,那么它会开始一个常规事务块,这个常规事务块将只能被一个显式的COMMIT 或者ROLLBACK 终止,不管这两种命令是出现在这个Query消息还是后面的一个Query消息中。如果BEGIN 跟在一些作为隐式事务块执行的语句后面,那些语句不会被立刻提交。实际上,它们会被包括到新的常规事务块中。
- 出现在一个隐式事务块中的COMMIT 或者ROLLBACK 会被正常执行并且关闭该隐式块。不过,由于没有先前的BEGIN 配对的COMMIT 或者ROLLBACK 表示一种错误,所以将会发出一个警告。如果后面还有更多语句,将会为它们开始一个新的隐式事务块。
+ 出现在一个隐式事务块中的COMMIT 或者ROLLBACK 会被正常执行并且关闭该隐式块。不过,由于没有先前的BEGIN 配对的COMMIT 或者ROLLBACK 可能表示误操作,所以会发出警告。如果后面还有更多语句,将会为它们开始一个新的隐式事务块。
@@ -479,23 +477,23 @@ SELECT 1/0;
- 记住,不管任何事务控制命令存不存在,Query消息的执行会在第一个错误时停止。因此,对于下面的在一个Query消息中的示例
+ 请记住,无论消息中是否包含事务控制命令,Query 消息的执行都会在第一个错误处停止。例如,单条 Query 消息包含以下内容时:
BEGIN;
SELECT 1/0;
ROLLBACK;
- 会话中将留下一个失败的常规事务块,因为在出现除零错误后不会到达ROLLBACK 。将需要另一个ROLLBACK 把会话恢复到一种可用的状态。
-
+会话会停留在失败的常规事务块内,因为发生除零错误后不会再执行ROLLBACK 。需要另发一条ROLLBACK ,才能将会话恢复到可用状态。
+
- 另一种要注意的行为是,最初的词法和语法分析是在整个查询字符串被执行之前进行的。因此后面的语句中的简单错误(例如拼写错误的关键词)可能会阻止任何语句的执行。这通常对用户是不可见的,因为在当作一个隐式事务块执行时,这些语句不管怎样都会全部被回滚。不过,在尝试于一个多语句Query中执行多个事务时,这种现象可能是可见的。例如,如果一个拼写错误把我们之前的示例变成
+ 另一种要注意的行为是,在执行任何语句之前,会先对整个查询字符串进行词法和语法分析。因此后面的语句中的简单错误(例如拼写错误的关键词)可能会阻止任何语句的执行。这通常对用户是不可见的,因为在当作一个隐式事务块执行时,这些语句不管怎样都会全部被回滚。不过,在尝试于一个多语句Query中执行多个事务时,这种现象可能是可见的。例如,如果一个拼写错误把我们之前的示例变成
BEGIN;
INSERT INTO mytable VALUES(1);
COMMIT;
INSERT INTO mytable VALUES(2);
-SELCT 1/0;
+SELCT 1/0;
那么这些语句都不会被运行,导致可见的差别,即第一个INSERT 没有被提交。在语义分析及其后阶段检测到的错误(例如拼错的表名或者列名)不会有这种效果。
@@ -552,11 +550,11 @@ SELCT 1/0;
- 一旦 portal 存在,就可以使用 Execute 消息执行它。Execute 消息指定 portal 的名称(空字符串表示未命名 portal)以及一个最大的结果行计数(零表示取回全部行
)。结果行计数只对包含返回行集命令的 portal 有意义;在其他情况下,命令总会执行到完成,而行计数会被忽略。Execute 的可能响应与通过简单查询协议发出的查询相同,只是执行不会导致后端发送 ReadyForQuery 或 RowDescription。
+ 一旦 portal 存在,就可以使用 Execute 消息执行它。Execute 消息指定 portal 的名称(空字符串表示未命名 portal)以及一个最大的结果行计数(零表示取回全部行
)。结果行计数只对包含返回行集命令的 portal 有意义;在其他情况下,命令总会执行到完成,而行计数会被忽略。Execute 的可能响应与通过简单查询协议发出的查询相同,只是 Execute 不会导致后端发送 ReadyForQuery 或 RowDescription。
- 如果 Execute 在 portal 执行完成之前终止(因为达到了非零的结果行计数),它会发送一条 PortalSuspended 消息;该消息表明前端应当针对同一个 portal 再发出一条 Execute 消息,以完成此次操作。在 portal 执行完成之前,不会发送表示源 SQL 命令结束的 CommandComplete 消息。因此,一个 Execute 阶段总会以下列消息之一结束:CommandComplete、EmptyQueryResponse(如果 portal 是从空查询字符串创建的)、ErrorResponse 或 PortalSuspended。
+ 如果 Execute 在 portal 执行完成之前终止(因为达到了非零的结果行计数),它会发送一条 PortalSuspended 消息;该消息表明前端应当针对同一个 portal 再发出一条 Execute 消息,以完成此次操作。在 portal 执行完成之前,不会发送表示源 SQL 命令结束的 CommandComplete 消息。因此,一个 Execute 阶段总会以下列消息中的恰好一条结束:CommandComplete、EmptyQueryResponse(如果 portal 是从空查询字符串创建的)、ErrorResponse 或 PortalSuspended。
@@ -571,7 +569,7 @@ SELCT 1/0;
- 除了这些基本的、必须的操作之外,在扩展查询协议里还有几种可选的操作可以使用。
+ 除了这些基本的、必需的操作之外,在扩展查询协议里还有几种可选的操作可以使用。
@@ -607,46 +605,40 @@ SELCT 1/0;
- 流水线处理
+ 管道化
- 流水线处理
+ 管道化
协议规范
- 使用扩展查询协议允许流水线处理 ,这意味着发送一系列查询而无需等待先前的查询完成。
- 这减少了完成一系列操作所需的网络往返次数。然而,用户必须仔细考虑所需的行为,如果其中一步失败,
- 因为后续查询已经在传输到服务器的过程中。
-
+ 扩展查询协议允许管道化 ,即连续发送一系列查询,而不等待先前查询完成。这减少了完成一组操作所需的网络往返次数。不过,用户必须仔细考虑其中某个步骤失败时所需的行为,因为后续查询已经在发往服务器的途中。
+
- 处理这个问题的一种方法是将整个查询系列作为一个事务处理,即将其包装在BEGIN ...
- COMMIT 中。然而,如果希望其中一些命令独立于其他命令提交,这并没有帮助。
-
+ 处理这个问题的一种方式是让整组查询成为单个事务,即用BEGIN ... COMMIT 包围它们。不过,如果希望其中某些命令独立于其他命令提交,这种方式就无法满足要求。
+
- 扩展查询协议提供了另一种管理这个问题的方式,即在依赖的步骤之间省略发送同步消息。
- 由于在错误后,后端会跳过命令消息直到找到同步消息,这允许在管道中的后续命令在前面的命令失败时自动跳过,而无需客户端明确地使用BEGIN 和COMMIT 来管理。
- 管道中可以通过同步消息分隔独立可提交的段。
-
+ 扩展查询协议提供了另一种处理方式,即省略相互依赖的步骤之间的 Sync 消息。发生错误后,后端会跳过命令消息,直到遇到 Sync,因此当前面的命令失败时,管道中的后续命令便会自动跳过,而不必由客户端用BEGIN 和COMMIT 显式管理。管道中可独立提交的各段可以用 Sync 消息分隔。
+
- 如果客户端没有发出显式 BEGIN ,则会启动一个隐式事务块。每个 Sync 通常会在前序步骤成功时导致隐式 COMMIT ,失败时导致隐式 ROLLBACK 。服务器只有在第一个命令结束且尚未收到 Sync 时,才能识别这种隐式事务块。有一些 DDL 命令(例如 CREATE DATABASE )不能在事务块内执行;若这类命令在管道中执行,除非它是某个 Sync 之后的第一条命令,否则会失败。此外,它成功后会强制立即提交以保持数据库一致性。因此,紧随这些命令之后的 Sync 除了返回 ReadyForQuery 外不会产生额外效果。
-
+ 如果客户端没有发出显式的BEGIN ,那么每个 Sync 通常会在前序步骤成功时引发隐式的COMMIT ,失败时引发隐式的ROLLBACK 。不过,少数 DDL 命令(例如CREATE DATABASE )不能在事务块中执行。如果这类命令在管道中执行,除非它是管道中的第一条命令,否则会失败。此外,它成功后会强制立即提交,以保持数据库一致性。因此,紧随这类命令之后的 Sync 除了返回 ReadyForQuery 外,不产生其他效果。
+
- 当使用这种方法时,必须通过计算ReadyForQuery消息的数量并等待达到发送的Syncs数量来确定管道的完成。
- 计算命令完成响应是不可靠的,因为其中一些命令可能会被跳过,因此不会产生完成消息。
-
+ 使用这种方式时,必须统计 ReadyForQuery 消息的数量,并等待该数量达到已发送的 Sync 消息数量,才能确定管道已完成。统计命令完成响应并不可靠,因为某些命令可能被跳过,因而不会产生完成消息。
+
函数调用
- 函数调用子协议允许客户端请求一个对存在于数据库pg_proc 系统表中的任意函数的直接调用。客户端必须在该函数上有执行的权限。
-
+ 函数调用子协议允许客户端请求直接调用数据库pg_proc 系统目录中的任意函数。客户端必须具有该函数的执行权限。
+
@@ -656,8 +648,8 @@ SELCT 1/0;
- 一个函数调用周期是由前端向后端发送一条FunctionCall消息初始化的。然后后端根据函数调用的结果发送一条或者更多响应消息,并且最后是一条ReadyForQuery响应消息。ReadyForQuery通知前端它可以安全地发送一个新的查询或者函数调用了。
-
+ 函数调用周期由前端向后端发送一条 FunctionCall 消息来启动。后端随后根据函数调用的结果发送一条或多条响应消息,最后发送一条 ReadyForQuery 响应消息。ReadyForQuery 告知前端,可以安全地发送新的查询或函数调用。
+
来自后端的可能的响应消息是:
@@ -676,7 +668,7 @@ SELCT 1/0;
FunctionCallResponse
- 函数调用完成并且在消息中返回一个结果(请注意函数调用协议只能处理单个标量结果,不能处理行类型或者集合类型的结果)。
+ 函数调用完成并且在消息中返回一个结果(请注意函数调用协议只能处理单个标量结果,不能处理行类型或者结果集合)。
@@ -710,7 +702,7 @@ SELCT 1/0;
- 拷贝入模式(向服务器传输数据)在后端执行COPY FROM STDIN SQL 语句时启动。后端会向前端发送一条 CopyInResponse 消息。随后前端应发送零条或多条 CopyData 消息,构成一条输入数据流。(消息边界与行边界之间没有任何对应关系要求,尽管让它们对齐通常是合理的选择。)前端可以通过发送 CopyDone 消息来结束拷贝入模式(表示成功结束),也可以发送 CopyFail 消息(这会使COPY 语句以错误失败)。然后后端会恢复到COPY 开始之前的命令处理模式,也就是简单查询协议或扩展查询协议。接下来它会发送 CommandComplete(成功时)或 ErrorResponse(失败时)。
+ 拷贝入模式(向服务器传输数据)在后端执行COPY FROM STDIN SQL 语句时启动。后端会向前端发送一条 CopyInResponse 消息。随后前端应发送零条或多条 CopyData 消息,构成一条输入数据流。(消息边界与行边界之间没有任何对应关系要求,尽管让它们对齐通常是合理的选择。)前端可以通过发送 CopyDone 消息来结束拷贝入模式(允许成功结束),也可以发送 CopyFail 消息(这会使COPY 语句以错误失败)。然后后端会恢复到COPY 开始之前的命令处理模式,也就是简单查询协议或扩展查询协议。接下来它会发送 CommandComplete(成功时)或 ErrorResponse(失败时)。
@@ -718,11 +710,11 @@ SELCT 1/0;
- 在拷贝入模式下,后端将忽略所收到的Flush和Sync消息。收到任何其他非拷贝消息类型都会造成一个错误,它将导致上面所描述的拷贝入状态中断(Flush和Sync的例外是为了方便客户端库,它们总是在一个Execute消息之后发送Flush和Sync,而不检查被执行的命令是否为一个COPY FROM STDIN )。
-
+ 后端会忽略在拷贝入模式期间收到的 Flush 和 Sync 消息。收到任何其他非拷贝类型的消息都会构成错误,并按上述方式中止拷贝入状态。(Flush 和 Sync 的例外是为了方便那些总是在 Execute 消息之后发送 Flush 或 Sync、而不检查待执行命令是否为COPY FROM STDIN 的客户端库。)
+
- 拷贝出模式(数据从服务器发出)是在后端执行一个COPY TO STDOUT 语句的时候初始化的。后端发出一个CopyOutResponse消息给前端,后面跟着零或者多个CopyData消息(总是每行一个),然后跟着CopyDone。然后后端回退到它在COPY 开始之前的命令处理模式,然后发送CommandComplete。前端不能退出传输(除非是关闭连接或者发出一个Cancel请求),但是它可以抛弃不需要的CopyData和CopyDone消息。
+ 拷贝出模式(数据从服务器发出)是在后端执行一个COPY TO STDOUT 语句时启动的。后端发出一个CopyOutResponse消息给前端,后面跟着零或者多个CopyData消息(总是每行一个),然后跟着CopyDone。然后后端回退到它在COPY 开始之前的命令处理模式,然后发送CommandComplete。前端不能中止传输(除非是关闭连接或者发出一个Cancel请求),但是它可以抛弃不需要的CopyData和CopyDone消息。
@@ -730,16 +722,16 @@ SELCT 1/0;
- 在CopyData消息中间可能会散布有NoticeResponse和ParameterStatus消息。前端必须处理这些情况,并且应该也为异步消息类型(参见 )准备好。除此之外,可以将任何除 CopyData 或 CopyDone 以外的消息类型视为拷贝出模式的终止标志。
-
+ NoticeResponse 和 ParameterStatus 消息可能穿插在 CopyData 消息之间;前端必须处理这些情况,并应准备好处理其他异步消息类型(参见 )。除此之外,可以将任何除 CopyData 或 CopyDone 以外的消息类型视为拷贝出模式的终止标志。
+
- 还有另一种与拷贝相关的模式,称为双向拷贝(copy-both),它允许数据以高速批量方式在客户端与服务器之间双向传输。当处于 walsender 模式的后端执行START_REPLICATION 语句时,会启动双向拷贝模式。后端会向前端发送一条 CopyBothResponse 消息。此后,前端和后端都可以发送 CopyData 消息,直到任一方发送 CopyDone 消息。客户端发送 CopyDone 后,连接会从双向拷贝模式切换到拷贝出模式,客户端也不得再发送 CopyData。类似地,当服务器发送 CopyDone 后,连接会进入拷贝入模式,服务器也不得再发送 CopyData。当双方都发送完 CopyDone 后,拷贝模式结束,后端恢复到原先的命令处理模式。如果双向拷贝模式期间发生后端检测到的错误,后端会发出 ErrorResponse,丢弃前端消息直到收到 Sync,然后发出 ReadyForQuery 并返回正常处理。前端应将收到 ErrorResponse 视为双向拷贝终止的信号;在这种情况下不应再发送 CopyDone。关于在双向拷贝模式上传输的子协议,见 。
+ 还有另一种与拷贝相关的模式,称为双向拷贝(copy-both),它允许高速批量地向服务器发送数据以及 从服务器接收数据。当处于 walsender 模式的后端执行START_REPLICATION 语句时,会启动双向拷贝模式。后端会向前端发送一条 CopyBothResponse 消息。此后,前端和后端都可以发送 CopyData 消息,直到任一方发送 CopyDone 消息。客户端发送 CopyDone 后,连接会从双向拷贝模式切换到拷贝出模式,客户端也不得再发送 CopyData。类似地,当服务器发送 CopyDone 后,连接会进入拷贝入模式,服务器也不得再发送 CopyData。当双方都发送完 CopyDone 后,拷贝模式结束,后端恢复到原先的命令处理模式。如果双向拷贝模式期间发生后端检测到的错误,后端会发出 ErrorResponse,丢弃前端消息直到收到 Sync,然后发出 ReadyForQuery 并返回正常处理。前端应将收到 ErrorResponse 视为双向拷贝终止的信号;在这种情况下不应再发送 CopyDone。关于在双向拷贝模式上传输的子协议,见 。
- CopyInResponse、CopyOutResponse和CopyBothResponse消息包括域和格式代码,域告诉前端每行的列数,而格式代码则用于具体每个列(就目前的实现而言,一个给定COPY 操作中的所有列都将使用同样的格式,但是消息设计并不做这个假设)。
-
+ CopyInResponse、CopyOutResponse 和 CopyBothResponse 消息包含一些字段,用于告知前端每行的列数以及每列所使用的格式代码。(在当前实现中,同一次COPY 操作的所有列都使用相同格式,但消息设计并不作此假设。)
+
@@ -766,8 +758,8 @@ SELCT 1/0;
- 如果前端发出一个LISTEN 命令, 那么无论何时在为同一个通道名NOTIFY 时,后端将发送一个NotificationResponse消息(不要和NoticeResponse搞混!)。
-
+ 如果前端发出LISTEN 命令,那么每当针对同一通道名执行NOTIFY 命令时,后端都会发送一条 NotificationResponse 消息(不要与 NoticeResponse 混淆)。
+
@@ -785,11 +777,11 @@ SELCT 1/0;
- 要发出一条取消请求,前端打开一个与服务器的新连接并且发送一条CancelRequest消息, 而不是通常在新连接中经常发送的StartupMessage消息。服务器将处理这个请求然后关闭连接。 出于安全原因,对取消请求消息不做直接的响应。
-
+ 要发出取消请求,前端会新建到服务器的连接,并发送 CancelRequest 消息,而不是新连接通常发送的 StartupMessage 消息。服务器处理该请求后便会关闭连接。出于安全原因,服务器不会直接回复取消请求消息。
+
- 除非CancelRequest消息包含在连接启动过程中传递给前端的相同的关键数据(PID和密钥),否则它将被忽略。如果该请求匹配当前运行着的后端的PID和密钥, 则退出当前查询的处理(目前的实现里采用的方法是向正在处理该查询的后端进程发送一个特殊的信号)。
+ 除非CancelRequest消息包含在连接启动过程中传递给前端的相同的密钥数据(PID 和密钥),否则它将被忽略。如果该请求匹配当前运行着的后端的PID和密钥, 则中止当前查询的处理(目前的实现里采用的方法是向正在处理该查询的后端进程发送一个特殊的信号)。
@@ -797,7 +789,7 @@ SELCT 1/0;
- 这么做是对安全性和有效性通盘考虑的结果,前端没有直接的方法获知一个取消请求是否成功。它必须继续等待后端对查询响应。发出一个取消仅仅是增加了当前查询快些结束的可能性, 同时也增加了当前查询会伴随着一条错误消息失败而不是成功执行的可能性。
+ 这么做是对安全性和效率通盘考虑的结果,前端没有直接的方法获知一个取消请求是否成功。它必须继续等待后端对查询响应。发出一个取消仅仅是增加了当前查询快些结束的可能性, 同时也增加了当前查询会伴随着一条错误消息失败而不是成功执行的可能性。
@@ -817,11 +809,11 @@ SELCT 1/0;
- 其他终止场景来自各种故障,例如任一端发生内核转储、通信链路中断、消息边界同步丢失等。如果前端或后端看到连接意外关闭,就应清理并终止。若前端不想自行终止,也可以重新联系服务器以启动一个新的后端。如果收到无法识别的消息类型,同样建议关闭连接,因为这通常意味着消息边界同步已经丢失。
+ 其他终止场景来自各种故障,例如任一端发生 core dump、通信链路中断、消息边界同步丢失等。如果前端或后端看到连接意外关闭,就应清理并终止。若前端不想自行终止,也可以重新联系服务器以启动一个新的后端。如果收到无法识别的消息类型,同样建议关闭连接,因为这通常意味着消息边界同步已经丢失。
- 不管是正常还是不正常的终止,任何打开的事务都会回滚而不是提交。不过,我们应该注意的是如果一个前端在一个非SELECT 查询正在处理的时候断开, 那么后端很可能在发现断开之前先完成查询的处理。如果查询处于任何事务块之外(BEGIN ... COMMIT 序列),那么其结果很可能在得知断开之前被提交。
+ 不管是正常还是不正常的终止,任何打开的事务都会回滚而不是提交。不过,我们应该注意的是如果一个前端在一个非SELECT 查询正在处理的时候断开, 那么后端很可能在发现断开之前先完成查询的处理。如果查询处于任何事务块之外(BEGIN ... COMMIT 序列),那么其结果可能在发现连接断开之前被提交。
@@ -837,12 +829,16 @@ SELCT 1/0;
前端还应准备好处理服务器对 SSLRequest 返回的 ErrorMessage 响应。只有当服务器版本早于 PostgreSQL 引入 SSL 支持时,才会发生这种情况。(这样的服务器已经非常古老,现实中可能已不存在。)此时必须关闭连接,但前端可以选择建立一个新连接,并在不请求 SSL 的情况下继续通信。
- 当可以执行 SSL 加密时,服务器预计仅发送单个 S 字节,然后等待前端启动 SSL 握手。如果此时有其他可读取的字节,则很可能意味着中间人正在尝试执行缓冲区填充攻击(CVE-2021-23222 )。前端应该编写代码,要么从套接字中恰好读取一个字节,然后将套接字交给他们的 SSL 库,要么在发现他们已经读取到额外的字节时将其视为协议违规。
+ 当可以执行 SSL 加密时,服务器应仅发送单个 S 字节,然后等待前端启动 SSL 握手。如果此时有其他可读取的字节,则很可能意味着中间人正在尝试执行缓冲区填充攻击(CVE-2021-23222 )。前端应该编写代码,要么从套接字中恰好读取一个字节,然后将套接字交给所用的 SSL 库,要么在发现已经读取到额外的字节时将其视为协议违规。
- 如果建立连接是为了发送 CancelRequest 消息,也可以先发送 SSLRequest。
+
+ 如果建立连接是为了发送 CancelRequest 消息,也可以先发送 SSLRequest。
+
- 虽然协议本身没有提供让服务器强制使用 SSL 加密的方法,但管理员可以配置服务器,使其在认证检查中拒绝未加密的会话。
+
+ 虽然协议本身没有提供让服务器强制使用SSL 加密的方法,但管理员可以配置服务器,使其在认证检查中拒绝未加密的会话。
+
@@ -864,24 +860,21 @@ SELCT 1/0;
- 客户端从列表中选择一个支持的机制,并向服务器发送一个SASLInitialResponse消息。
- 该消息包括所选机制的名称,以及如果所选机制使用的话,还包括一个可选的初始客户端响应。
-
+ 客户端从列表中选择一种受支持的机制,并向服务器发送 SASLInitialResponse 消息。消息包含所选机制的名称;如果该机制使用初始客户端响应,消息还可以包含这一可选响应。
+
- 一个或多个服务器挑战和客户端响应消息将随后而来。每个服务器挑战都是在一个
- AuthenticationSASLContinue 消息中发送的,随后是客户端在一个 SASLResponse
- 消息中的响应。这些消息的具体内容是特定于机制的。
-
+ 随后会进行一轮或多轮服务器挑战和客户端响应。每次服务器挑战都通过 AuthenticationSASLContinue 消息发送,随后客户端通过 SASLResponse 消息响应。消息的具体内容取决于所用机制。
+
- 最后,当认证交换成功完成时,服务器会发送可选的 AuthenticationSASLFinal 消息,随后立即发送 AuthenticationOk。AuthenticationSASLFinal 包含机制特定的附加数据;若该机制不需要完成时附加数据,则不会发送 AuthenticationSASLFinal。
-
+ 最后,认证交换成功完成时,服务器会发送 AuthenticationSASLFinal 消息,紧接着发送 AuthenticationOk 消息。AuthenticationSASLFinal 包含从服务器发给客户端的附加数据,其具体内容取决于所选认证机制。如果该认证机制不使用在完成时发送的附加数据,则不会发送 AuthenticationSASLFinal 消息。
+
@@ -901,31 +894,22 @@ SELCT 1/0;
- SCRAM规范规定密码也必须是UTF-8编码,并且使用SASLprep 算法处理。
- 然而,PostgreSQL 不要求密码必须使用UTF-8编码。
- 当用户设置密码时,无论实际使用的编码是什么,都会像使用UTF-8一样使用SASLprep进行处理。
- 但是,如果密码不是合法的UTF-8字节序列,或者包含SASLprep算法禁止的UTF-8字节序列,
- 则会使用原始密码而不进行SASLprep处理,而不是抛出错误。这样可以在密码为UTF-8时对其进行规范化,
- 但仍允许使用非UTF-8密码,并且不需要系统知道密码使用的编码方式。
-
+ SCRAM 规范规定密码也必须采用 UTF-8 编码,并通过SASLprep 算法处理。不过,PostgreSQL 并不要求密码使用 UTF-8。设置用户密码时,无论实际采用何种编码,都会将其视作 UTF-8 并用 SASLprep 处理。但是,如果密码不是合法的 UTF-8 字节序列,或者包含 SASLprep 算法禁止的 UTF-8 字节序列,就会直接使用未经 SASLprep 处理的原始密码,而不抛出错误。这样既能对 UTF-8 密码进行规范化,又允许使用非 UTF-8 密码,而且不要求系统知道密码采用何种编码。
+
- Channel binding 在支持SSL的PostgreSQL构建中受支持。带有通道绑定的SCRAM的SASL机制名称是
+ 通道绑定 在支持SSL的PostgreSQL构建中受支持。带有通道绑定的SCRAM的SASL机制名称是
SCRAM-SHA-256-PLUS 。PostgreSQL使用的通道绑定类型是
tls-server-end-point 。
- 在没有通道绑定的SCRAM 中,服务器选择一个随机数,
- 传输给客户端,与用户提供的密码在传输的密码哈希中混合。虽然这可以
- 防止密码哈希在后续会话中被成功重新传输,但无法阻止真实服务器和客
- 户端之间的虚假服务器通过服务器的随机值并成功进行认证。
-
+ 在不带通道绑定的SCRAM 中,服务器会选择一个随机数并发送给客户端,将它与用户提供的密码混合,形成所传输的密码 hash。虽然这样可以防止在后续会话中成功重放该密码 hash,但无法阻止位于真实服务器与客户端之间的伪造服务器转发服务器的随机值并成功通过认证。
+
- SCRAM 与通道绑定一起防止这种中间人攻击,通过将服务器证书的签名混合到传输的密码哈希中。
- 虽然伪造服务器可以重新传输真实服务器的证书,但它无法访问与该证书匹配的私钥,因此无法证明自己是所有者,导致SSL连接失败。
-
+ 带通道绑定的SCRAM 会将服务器证书的签名混入所传输的密码 hash,从而防止此类中间人攻击。虽然伪造服务器可以转发真实服务器的证书,但它无法取得与证书匹配的私钥,因此无法证明自己是证书所有者,最终导致 SSL 连接失败。
+
@@ -994,21 +978,27 @@ SELCT 1/0;
无论是物理复制还是逻辑复制的 walsender 模式,都只能使用简单查询协议。
-为了测试复制命令,可以通过psql 或其他使用libpq 的工具建立复制连接,连接字符串中应包含replication 选项,例如:
+
+ 为了测试复制命令,可以通过 psql 或其他使用 libpq 的工具建立复制连接,连接字符串中应包含 replication 选项,例如:
+
psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
- 不过,通常更有用的做法是使用 (用于物理复制)或 (用于逻辑复制)。
+
+不过,通常更有用的做法是使用 (用于物理复制)或 (用于逻辑复制)。
+
- 复制命令在服务器日志中记录,当启用 时。
+ 启用 后,复制命令会记录到服务器日志中。
复制模式接受以下命令:
IDENTIFY_SYSTEM
- 识别系统
+ IDENTIFY_SYSTEM
- 请求服务器标识自身。服务器返回一个只有一行的结果集,包含四个字段:
+
+ 请求服务器标识自身。服务器会返回一个包含四个字段的单行结果集:
+
@@ -1017,7 +1007,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
systemid (text )
- 标识数据库集簇的唯一系统标识符。可用于检查初始化备库的基础备份是否来自同一个数据库集簇。
+
+ 用于标识该集簇的唯一系统标识符。它可用于检查初始化备库所用的基础备份是否来自同一个集簇。
+
@@ -1042,7 +1034,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
dbname (text )
- 所连接的数据库,或 null。
+
+ 当前连接到的数据库,或为 null。
+
@@ -1101,7 +1095,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
content (bytea )
- 时间线历史文件的内容。
+
+ 时间线历史文件的内容。
+
@@ -1208,22 +1204,16 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
START_REPLICATION [ SLOT slot_name ] [ PHYSICAL ] XXX/XXX [ TIMELINE tli ]
- 开始复制
+ START_REPLICATION
- 指示服务器开始流式传输WAL,从WAL位置XXX/XXX 开始。
- 如果指定了TIMELINE 选项,则流式传输将从时间线tli 开始;
- 否则,将选择服务器当前的时间线。如果请求的WAL部分已经被回收,服务器可能会回复错误。
- 成功时,服务器将用CopyBothResponse消息回复,然后开始向前端流式传输WAL。
-
+ 指示服务器从 WAL 位置 XXX/XXX 开始流式传输 WAL。如果指定了 TIMELINE 选项,则从时间线 tli 开始传输;否则选择服务器当前的时间线。服务器可以返回错误,例如请求的 WAL 部分已被回收时。成功时,服务器返回 CopyBothResponse 消息,然后开始向前端流式传输 WAL。
+
- 如果通过slot_name 提供了复制槽名称,
- 那么在复制进行期间会更新该复制槽,以便服务器知道哪些 WAL 段,
- 以及在启用了 hot_standby_feedback 时,哪些事务
- 仍然被备库所需要。
-
+ 如果通过 slot_name 提供了复制槽名称,该复制槽会随着复制的进行而更新,使服务器知道备库仍需要哪些 WAL 段,以及在启用 hot_standby_feedback 时仍需要哪些事务。
+
如果客户端请求的时间线不是最新时间线,但属于服务器的历史,服务器会从请求的起点开始,流式传输该时间线上的所有 WAL,直到服务器切换到另一条时间线的位置。如果客户端请求的流式传输起点恰好位于旧时间线的末尾,服务器会立即返回 CommandComplete,而不进入 COPY 模式。
@@ -1474,7 +1464,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
DROP_REPLICATION_SLOT slot_name WAIT
- 删除复制槽
+ DROP_REPLICATION_SLOT
删除复制槽,释放任何保留的服务器端资源。如果该槽是逻辑槽,且创建它的数据库与 walsender 当前连接的数据库不同,则此命令失败。
@@ -1516,9 +1506,8 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
- 设置备份的标签。如果未指定,则将使用base backup 作为备份标签。
- 标签的引号使用规则与打开 的标准SQL字符串相同。
-
+ 设置备份标签。如果未指定,则使用 base backup 作为备份标签。标签的引号规则与启用 时的标准 SQL 字符串相同。
+
@@ -1618,7 +1607,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
size (int8 )
- 如果请求了进度报告,则为表空间的大致大小;否则为空值。
+
+ 如果请求了进度报告,则为表空间的大致大小;否则为 null。
+
@@ -1682,7 +1673,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
- 逻辑复制协议
+ 逻辑流复制协议
本节介绍逻辑复制协议,它是一种以复制命令START_REPLICATION
@@ -1691,7 +1682,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
- 逻辑复制协议构建在物理流复制协议的底层机制之上。
+ 逻辑流复制协议构建在物理流复制协议的基本机制之上。
@@ -1746,7 +1737,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
逻辑复制协议逐个发送事务。这意味着,一对 Begin 和 Commit 消息之间的所有消息都属于同一个事务。
- 每个被发送的事务都包含零条或多条 DML 消息(插入、更新、删除)。在级联场景下,它还会包含 Origin 消息。Origin 消息表示该事务产生于另一个复制节点。由于逻辑复制协议中的复制节点可以是任意实现,因此唯一标识符就是该源头的名称。下游是否以及如何处理这一信息,由其自行决定。Origin 消息总是在事务中的任何 DML 消息之前发送。
+ 每个发送的事务都包含零条或多条 DML 消息(Insert、Update、Delete)。在级联配置中,还可能包含 Origin 消息。Origin 消息表示该事务源自另一个复制节点。由于逻辑复制协议中的复制节点几乎可以是任何实现,因此唯一的标识符就是复制源的名称。下游负责按需处理这一信息(如果需要处理)。Origin 消息总是在事务中的任何 DML 消息之前发送。
@@ -1811,9 +1802,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
- 对后端返回的字符串长度,没有预定义的限制 。
- 前端较好的编码策略是使用可扩展缓冲区,以便接收所有能放进内存的内容。
- 如果做不到这一点,就应读取完整字符串,并丢弃不适合固定大小缓冲区的尾随字符。
+ 后端返回的字符串长度没有预定义的限制 。前端较好的编码策略是使用可扩展缓冲区,以便接收所有能放进内存的内容。如果做不到这一点,就应读取完整字符串,并丢弃固定大小的缓冲区容纳不下的尾随字符。
@@ -1838,8 +1827,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
消息格式
- 本节描述每条消息的详细格式。每条消息都标记了可由前端(F)、后端(B)或双方(F&B)发送。
- 请注意,虽然每条消息开头都带有字节计数,但大多数消息格式都定义为无需参考该计数也能确定消息边界。这一设计最初是出于历史原因(早期已废弃的协议 v2 没有显式长度字段),同时也有助于有效性校验。
+ 本节描述每条消息的详细格式。每条消息都标明它可以由前端(F)、后端(B)或双方(F & B)发送。注意,虽然每条消息开头都有字节计数,但消息格式的定义使得无需参考该计数也能确定消息的结束位置。这有助于检查消息的有效性。(CopyData 消息是例外,因为它构成数据流的一部分,任何单条 CopyData 消息的内容都无法独立解释。)
@@ -1860,7 +1848,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1891,7 +1879,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1921,7 +1909,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1951,7 +1939,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(12)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -1988,7 +1976,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2019,7 +2007,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2050,7 +2038,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2081,7 +2069,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2118,7 +2106,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2156,7 +2144,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2193,7 +2181,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2230,7 +2218,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(12)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2267,7 +2255,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2285,13 +2273,13 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int16
-后续参数格式码的数量(下文以 C 表示)。可以为零,表示没有参数,或者所有参数都使用默认格式(文本);也可以为一,此时指定的格式码应用于所有参数;还可以等于实际参数数量。
+后续参数格式代码的数量(下文以 C 表示)。可以为零,表示没有参数,或者所有参数都使用默认格式(文本);也可以为一,此时指定的格式代码应用于所有参数;还可以等于实际参数数量。
Int16[C ]
-参数格式码。目前每个格式码必须为零(文本)或一(二进制)。
+参数格式代码。目前每个格式代码必须为零(文本)或一(二进制)。
@@ -2310,20 +2298,20 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Byten
-参数值,格式由对应的格式码指明。n 为上述长度。
+参数值,格式由对应的格式代码指明。n 为上述长度。
最后一个参数之后是以下字段:
Int16
-后续结果列格式码的数量(下文以 R 表示)。可以为零,表示没有结果列,或者所有结果列都应使用默认格式(文本);也可以为一,此时指定的格式码应用于所有结果列(如果有);还可以等于查询实际的结果列数量。
+后续结果列格式代码的数量(下文以 R 表示)。可以为零,表示没有结果列,或者所有结果列都应使用默认格式(文本);也可以为一,此时指定的格式代码应用于所有结果列(如果有);还可以等于查询实际的结果列数量。
Int16[R ]
-结果列格式码。目前每个格式码必须为零(文本)或一(二进制)。
+结果列格式代码。目前每个格式代码必须为零(文本)或一(二进制)。
@@ -2347,7 +2335,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2371,7 +2359,7 @@ CancelRequest (F)
- 消息内容的长度,以字节为单位,包括此长度字段本身。
+ 消息内容的长度(以字节为单位),包括其自身。
@@ -2427,7 +2415,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2463,7 +2451,7 @@ CancelRequest (F)
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2488,7 +2476,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2552,7 +2540,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2589,7 +2577,7 @@ CancelRequest (F)
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2618,7 +2606,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2647,13 +2635,13 @@ CancelRequest (F)
Byte1('G')
-标识消息为开始复制输入的响应。前端此时必须发送复制输入数据(如果尚未准备好,应发送 CopyFail 消息)。
+将该消息标识为开始 COPY 输入的响应。前端此时必须发送 COPY 输入数据(如果尚未准备好,应发送 CopyFail 消息)。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2702,13 +2690,13 @@ CancelRequest (F)
Byte1('H')
-标识消息为开始复制输出的响应。该消息之后会发送复制输出数据。
+将该消息标识为开始 COPY 输出的响应。此消息之后会发送 COPY 输出数据。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2757,13 +2745,13 @@ CancelRequest (F)
Byte1('W')
-标识消息为开始双向复制的响应。此消息仅用于流复制。
+将该消息标识为开始双向 COPY 的响应。此消息仅用于流复制。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2819,7 +2807,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2834,7 +2822,7 @@ CancelRequest (F)
Int32
-列值的长度,以字节为单位(不包括本长度字段自身)。可以为零。特殊值 -1 表示列值为 NULL,此时后面没有值字节。
+列值的长度,以字节为单位(不包括此长度字段本身)。可以为零。特殊值 -1 表示 NULL 列值。为 NULL 时,后面不再有值的字节。
@@ -2865,14 +2853,14 @@ CancelRequest (F)
- 标识消息为描述命令。
+ 将该消息标识为 Describe 命令。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2915,7 +2903,7 @@ CancelRequest (F)
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -2944,7 +2932,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
消息体由一个或多个带标识的字段组成,最后以一个零字节终止。字段可以按任意顺序出现。每个字段包含以下内容:
@@ -2983,14 +2971,14 @@ CancelRequest (F)
- 标识消息为一个执行命令。
+ 将该消息标识为 Execute 命令。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3025,14 +3013,14 @@ CancelRequest (F)
- 将消息标识为Flush命令。
+ 将该消息标识为 Flush 命令。
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3061,7 +3049,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3094,7 +3082,7 @@ CancelRequest (F)
Int32
-参数值的长度,以字节为单位(不包括本长度字段自身)。可以为零。特殊值 -1 表示参数值为 NULL,此时后面没有值字节。
+参数值的长度,以字节为单位(不包括此长度字段本身)。可以为零。特殊值 -1 表示 NULL 参数值。为 NULL 时,后面不再有值的字节。
@@ -3139,13 +3127,13 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
Int32
-函数结果值的长度,以字节为单位(不包括本长度字段自身)。可以为零。特殊值 -1 表示函数结果为 NULL,此时后面没有值字节。
+函数结果值的长度,以字节为单位(不包括此长度字段本身)。可以为零。特殊值 -1 表示 NULL 函数结果。为 NULL 时,后面不再有值的字节。
@@ -3184,7 +3172,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3219,7 +3207,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3267,7 +3255,7 @@ CancelRequest (F)
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3296,7 +3284,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
消息体由一个或多个带标识的字段组成,最后以一个零字节终止。字段可以按任意顺序出现。每个字段包含以下内容:
@@ -3342,7 +3330,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3360,7 +3348,7 @@ CancelRequest (F)
String
-通知进程传来的载荷
字符串。
+通知进程传来的有效载荷
字符串。
@@ -3389,7 +3377,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3432,7 +3420,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3465,14 +3453,14 @@ CancelRequest (F)
- 将消息标识为解析命令。
+ 将该消息标识为 Parse 命令。
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3521,14 +3509,14 @@ CancelRequest (F)
- 将消息标识为解析完成指示器。
+ 将该消息标识为 Parse 完成指示。
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3558,7 +3546,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3587,15 +3575,14 @@ CancelRequest (F)
- 标识消息为 portal 挂起指示器。
- 请注意,仅当执行消息的行数限制达到时才会出现此消息。
+ 将该消息标识为 portal 挂起指示。注意,仅当达到 Execute 消息指定的行数限制时,才会出现此消息。
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3624,7 +3611,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3661,7 +3648,7 @@ CancelRequest (F)
Int32(5)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3700,7 +3687,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3759,7 +3746,7 @@ CancelRequest (F)
Int16
-字段所使用的格式代码。目前为零(文本)或一(二进制)。对于 Describe 的语句变体所返回的 RowDescription,格式代码尚未确定,始终为零。
+字段所使用的格式代码。目前为零(文本)或一(二进制)。对于 Describe 针对预备语句的变体所返回的 RowDescription,格式代码尚未确定,始终为零。
@@ -3789,7 +3776,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3840,7 +3827,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3866,7 +3853,7 @@ CancelRequest (F)
Int32(8)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3897,7 +3884,7 @@ CancelRequest (F)
Int32
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -3981,14 +3968,14 @@ CancelRequest (F)
- 将消息标识为同步命令。
+ 将该消息标识为 Sync 命令。
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -4017,7 +4004,7 @@ CancelRequest (F)
Int32(4)
-消息内容的长度,以字节为单位,包括此长度字段本身。
+消息内容的长度(以字节为单位),包括其自身。
@@ -4033,7 +4020,7 @@ CancelRequest (F)
-错误和通知消息域
+错误和通知消息字段
本节描述了ErrorResponse和NoticeResponse消息中可能出现的字段。每个字段类型都有一个单字节的标识符。
@@ -4047,11 +4034,7 @@ CancelRequest (F)
- 严重性: 字段内容为ERROR , FATAL , 或
- PANIC (在错误消息中), 或
- WARNING , NOTICE , DEBUG ,
- INFO , 或 LOG (在通知消息中),
- 或者这些内容的本地化翻译。始终存在。
+ 严重性:字段内容为 ERROR 、FATAL 或 PANIC (在错误消息中),或 WARNING 、NOTICE 、DEBUG 、INFO 或 LOG (在通知消息中),或这些内容的本地化翻译。始终存在。
@@ -4061,11 +4044,7 @@ CancelRequest (F)
- 严重性:字段内容为 ERROR 、FATAL 或
- PANIC (在错误消息中),或 WARNING 、NOTICE 、DEBUG 、
- INFO 或 LOG (在通知消息中)。
- 这与S 字段相同,只是内容不会被本地化。仅在由PostgreSQL 版本9.6
- 及更高版本生成的消息中存在。
+ 严重性:字段内容为 ERROR 、FATAL 或 PANIC (在错误消息中),或 WARNING 、NOTICE 、DEBUG 、INFO 或 LOG (在通知消息中)。它与 S 字段相同,只是内容从不本地化。仅在 PostgreSQL 9.6 及更高版本生成的消息中存在。
@@ -4075,7 +4054,7 @@ CancelRequest (F)
- Code: 错误的SQLSTATE代码(参见 )。不可本地化。始终存在。
+ 代码:错误的 SQLSTATE 代码(见 )。不可本地化。始终存在。
@@ -4085,9 +4064,7 @@ CancelRequest (F)
- 消息: 主要的人类可读错误消息。
- 这应该准确但简洁(通常一行)。
- 总是存在。
+ 消息:主要的可读错误消息。应准确而简洁(通常为一行)。始终存在。
@@ -4097,7 +4074,7 @@ CancelRequest (F)
- 详细信息:一个可选的次要错误消息,提供有关问题的更多详细信息。可能会跨多行。
+ 详细信息:可选的次要错误消息,提供有关该问题的更多细节。可能占多行。
@@ -4107,9 +4084,7 @@ CancelRequest (F)
- 提示: 关于问题应该怎么做的一个可选建议。
- 这意在与细节不同,它提供建议(可能不合适)而不是硬性事实。
- 可能会跨越多行。
+ 提示:可选的建议,说明如何处理该问题。它与详细信息的区别在于,它提供建议(可能并不合适),而非确凿事实。可能占多行。
@@ -4151,9 +4126,7 @@ CancelRequest (F)
- Where: 错误发生的上下文指示。
- 目前包括活动的过程语言函数和内部生成查询的调用堆栈回溯。
- 跟踪每行一个条目,最近的在前。
+ 上下文:说明错误发生时的上下文。目前包括活跃的过程语言函数和内部生成的查询的调用栈回溯。回溯每行一个条目,最近的调用在前。
@@ -4163,7 +4136,7 @@ CancelRequest (F)
- Schema name: 如果错误与特定数据库对象相关联,则为包含该对象的模式的名称(如果有)。
+ 模式名:如果错误与某个特定数据库对象有关,则为包含该对象的模式名称(如果有)。
@@ -4173,7 +4146,7 @@ CancelRequest (F)
- 表名: 如果错误与特定表相关联,则为表的名称。(有关表模式名称的名称,请参考模式名称字段。)
+ 表名:如果错误与某个特定表有关,则为该表的名称。(表所在模式的名称见模式名字段。)
@@ -4183,7 +4156,7 @@ CancelRequest (F)
- 列名: 如果错误与特定表列相关联,则为列的名称。(请参考模式和表名字段以识别表。)
+ 列名:如果错误与某个特定表列有关,则为该列的名称。(通过模式名和表名字段确定该表。)
@@ -4193,8 +4166,7 @@ CancelRequest (F)
- 数据类型名称: 如果错误与特定数据类型相关联,则为数据类型的名称。
- (有关数据类型模式的名称,请参阅模式名称字段。)
+ 数据类型名:如果错误与某个特定数据类型有关,则为该数据类型的名称。(数据类型所在模式的名称见模式名字段。)
@@ -4204,8 +4176,7 @@ CancelRequest (F)
- 约束名称: 如果错误与特定约束相关联,则为约束的名称。请参考上面列出的字段,了解相关表或域。
- (为此,即使索引不是使用约束语法创建的,也将其视为约束。)
+ 约束名:如果错误与某个特定约束有关,则为该约束的名称。相关的表或域见上述字段。(这里将索引也视为约束,即使它不是用约束语法创建的。)
@@ -4215,7 +4186,7 @@ CancelRequest (F)
- 文件: 报告错误的源代码位置的文件名。
+ 文件:报告错误的源代码位置所在的文件名。
@@ -4225,7 +4196,7 @@ CancelRequest (F)
- Line: 源代码位置的行号,报告错误的位置。
+ 行号:报告错误的源代码位置所在的行号。
@@ -4235,7 +4206,7 @@ CancelRequest (F)
- Routine: 报告错误的源代码例程的名称。
+ 例程:报告错误的源代码例程的名称。
@@ -4245,15 +4216,12 @@ CancelRequest (F)
- 模式名称、表名称、列名称、数据类型名称和约束名称的字段仅针对有限数量的错误类型提供;
- 请参阅 。前端不应假设任何这些字段的存在就保证了另一个字段的存在。
- 核心错误源观察到上述相互关系,但用户定义的函数可能以其他方式使用这些字段。
- 同样地,客户端不应假设这些字段表示当前数据库中的当代对象。
+ 模式名、表名、列名、数据类型名和约束名字段仅针对有限的几类错误提供,见 。前端不应假设其中任何字段的存在就保证了另一个字段的存在。核心错误源遵循上述相互关系,但用户定义的函数可能以其他方式使用这些字段。同样,客户端不应假设这些字段表示当前数据库中现存的对象。
- 客户端负责格式化显示的信息以满足其需求;特别是应根据需要换行。错误消息字段中出现的换行符应被视为段落分隔符,而不是换行符。
+ 客户端负责按自身需要格式化显示的信息;尤其应根据需要将长行断开。错误消息字段中的换行符应视为段落分隔符,而非行分隔符。
@@ -4281,7 +4249,7 @@ CancelRequest (F)
- 将消息标识为开始消息。
+ 将该消息标识为 Begin 消息。
@@ -4325,7 +4293,7 @@ CancelRequest (F)
- 标识消息为提交消息。
+ 将该消息标识为 Commit 消息。
@@ -4374,7 +4342,7 @@ CancelRequest (F)
Byte1('O')
-标识消息为复制源消息。
+将该消息标识为 Origin 消息。
@@ -4396,7 +4364,7 @@ CancelRequest (F)
- 请注意,在单个事务中可能存在多个Origin消息。
+ 注意,单个事务中可能有多条 Origin 消息。
@@ -4411,7 +4379,7 @@ CancelRequest (F)
Byte1('R')
-将该消息标识为关系消息。
+将该消息标识为 Relation 消息。
@@ -4438,7 +4406,7 @@ CancelRequest (F)
- 关系的复制标识设置(与relreplident 在pg_class 中相同)。
+ 关系的复制标识设置(与 pg_class 中的 relreplident 相同)。
@@ -4473,7 +4441,7 @@ CancelRequest (F)
- 列的类型修饰符 (atttypmod )。
+ 列的类型修饰符(atttypmod )。
@@ -4492,7 +4460,7 @@ CancelRequest (F)
Byte1('Y')
-将该消息标识为类型消息。
+将该消息标识为 Type 消息。
@@ -4528,13 +4496,13 @@ CancelRequest (F)
Byte1('I')
-将该消息标识为插入消息。
+将该消息标识为 Insert 消息。
Int32
-关系的 ID,与关系消息中的 ID 对应。
+关系的 ID,与 Relation 消息中的 ID 对应。
@@ -4565,13 +4533,13 @@ CancelRequest (F)
Byte1('U')
-将该消息标识为更新消息。
+将该消息标识为 Update 消息。
Int32
-关系的 ID,与关系消息中的 ID 对应。
+关系的 ID,与 Relation 消息中的 ID 对应。
@@ -4627,13 +4595,13 @@ CancelRequest (F)
Byte1('D')
-将该消息标识为删除消息。
+将该消息标识为 Delete 消息。
Int32
-关系的 ID,与关系消息中的 ID 对应。
+关系的 ID,与 Relation 消息中的 ID 对应。
@@ -4674,7 +4642,7 @@ CancelRequest (F)
Byte1('T')
-将该消息标识为截断消息。
+将该消息标识为 Truncate 消息。
@@ -4695,7 +4663,7 @@ CancelRequest (F)
Int32
-关系的 ID,与关系消息中的 ID 对应。每个关系都重复出现此字段。
+关系的 ID,与 Relation 消息中的 ID 对应。每个关系都重复出现此字段。
diff --git a/zh/11/rangetypes.sgml b/zh/11/rangetypes.sgml
index e29cda85..e9983d1d 100644
--- a/zh/11/rangetypes.sgml
+++ b/zh/11/rangetypes.sgml
@@ -4,7 +4,7 @@
范围类型
- range type
+ 范围类型
@@ -18,7 +18,9 @@
内置范围类型
- PostgreSQL 提供以下内置范围类型:
+
+ PostgreSQL 自带下列内置范围类型:
+
int4range — integer 的范围
@@ -37,7 +39,9 @@
daterange — date 的范围
- 此外,还可以定义自己的范围类型;参见 了解更多信息。
+
+ 此外,你还可以定义自己的范围类型;详见 。
+
@@ -92,15 +96,15 @@ SELECT isempty(numrange(1, 5));
无限(无界)范围
- 范围的下界可以省略,这意味着所有小于上界的值都包含在范围内,例如(,3] 。同样,如果省略范围的上界,则所有大于下界的值都包含在范围内。如果上下界都被省略,则该元素类型的所有值都被认为处于该范围内。把缺失的界限指定为包含,会自动转换为排除,例如[,] 会转换为(,) 。你可以把这些缺失的值看作 +/-infinity,但它们是特殊的范围类型值,并且被认为超出了任何范围元素类型的 +/-infinity 值。
+ 范围的下界可以省略,这意味着所有小于上界的值都包含在范围内,例如(,3] 。同样,如果省略范围的上界,则所有大于下界的值都包含在范围内。如果上下界都被省略,则该元素类型的所有值都被认为处于该范围内。把缺失的界限指定为包含,会自动转换为排除,例如[,] 会转换为(,) 。你可以把这些缺失的值看作正负无穷大,但它们是特殊的范围类型值,并且被认为超出了任何范围元素类型的正负无穷大值。
- 具有infinity
概念的元素类型可以将其用作显式界限值。例如,对于时间戳范围,[today,infinity) 不包括特殊的timestamp 值infinity ,而[today,infinity] 则包括它,[today,) 和[today,] 也一样。
+ 具有无穷大
概念的元素类型可以将其用作显式界限值。例如,对于时间戳范围,[today,infinity) 不包括特殊的timestamp 值infinity ,而[today,infinity] 则包括它,[today,) 和[today,] 也一样。
- 函数lower_inf 和upper_inf 分别测试范围的下界和上界是否为无限。
+ 函数lower_inf 和upper_inf 分别测试范围是否没有下界和上界。
@@ -259,23 +263,23 @@ SELECT '[11:10, 23:00]'::timerange;
索引
- range type
- indexes on
+ 范围类型
+ 索引
可以为范围类型的表列创建 GiST 和 SP-GiST 索引。例如,创建 GiST 索引:
CREATE INDEX reservation_idx ON reservation USING GIST (during);
- GiST 或 SP-GiST 索引可以加速涉及以下范围操作符的查询:= ,
- && ,
- <@ ,
- @> ,
- << ,
- >> ,
- -|- ,
+GiST 或 SP-GiST 索引可以加速涉及以下范围操作符的查询:= 、
+ && 、
+ <@ 、
+ @> 、
+ << 、
+ >> 、
+ -|- 、
&< 和&> (参见 了解更多信息)。
- 此外,也可以为范围类型的表列创建 B-树和哈希索引。对于这些索引类型,基本上唯一有用的范围操作就是等值。系统为范围值定义了对应< 和> 操作符的 B-树排序顺序,但这种顺序相当任意,在现实中通常并没有什么用处。范围类型的 B-树和哈希支持主要是为了允许在查询内部进行排序和哈希,而不是用于创建实际的索引。
+ 此外,也可以为范围类型的表列创建 B-树和 hash 索引。对于这些索引类型,基本上唯一有用的范围操作就是等值。系统为范围值定义了对应< 和> 操作符的 B-树排序顺序,但这种顺序相当任意,在现实中通常并没有什么用处。范围类型的 B-树和 hash 支持主要是为了允许在查询内部进行排序和 hash 运算,而不是用于创建实际的索引。
@@ -284,8 +288,8 @@ CREATE INDEX reservation_idx ON reservation USING GIST (during);
范围上的约束
- range type
- exclude
+ 范围类型
+ 排他约束
diff --git a/zh/11/recovery-config.sgml b/zh/11/recovery-config.sgml
index 178d9c57..9fd213d7 100644
--- a/zh/11/recovery-config.sgml
+++ b/zh/11/recovery-config.sgml
@@ -4,9 +4,9 @@
恢复配置
- configuration
- of recovery
- 一个备库
+ 配置
+ 恢复
+ 备库
本章介绍 recovery.conf recovery.conf 文件中可用的设置。它们只在恢复期间生效。如果之后还要进行恢复,必须重新设置这些参数。恢复开始后,就不能再更改它们。
diff --git a/zh/11/ref/alter_extension.sgml b/zh/11/ref/alter_extension.sgml
index 86286dec..ed782ba4 100644
--- a/zh/11/ref/alter_extension.sgml
+++ b/zh/11/ref/alter_extension.sgml
@@ -170,7 +170,7 @@ ALTER EXTENSION name DROP
要添加到扩展中或从扩展中移除的对象名称。表、聚合、域、外部表、函数、
- 操作符、操作符类、操作符族、过程、例程、序列、文本搜索对象、类型和视图的名称
+ 操作符、操作符类、操作符族、过程、例程、序列、文本检索对象、类型和视图的名称
可以带模式限定。
diff --git a/zh/11/ref/alter_tsconfig.sgml b/zh/11/ref/alter_tsconfig.sgml
index 453d7ee7..02e172c8 100644
--- a/zh/11/ref/alter_tsconfig.sgml
+++ b/zh/11/ref/alter_tsconfig.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
ALTER TEXT SEARCH CONFIGURATION
- 更改一个文本搜索配置的定义
+ 更改一个文本检索配置的定义
@@ -45,7 +45,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
ALTER TEXT SEARCH CONFIGURATION
- 更改一个文本搜索配置的定义。你可以修改其从记号类型到字典的映射,
+ 更改一个文本检索配置的定义。你可以修改其从词元类型到词典的映射,
或者更改该配置的名称或拥有者。
@@ -67,7 +67,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 一个现有文本搜索配置的名称(可以是模式限定的)。
+ 一个现有文本检索配置的名称(可以是模式限定的)。
@@ -78,7 +78,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 由该配置的解析器发出的记号类型的名称。
+ 由该配置的解析器发出的词元类型的名称。
@@ -89,7 +89,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 用于指定记号类型的文本搜索字典名称。如果列出了多个字典,
+ 用于指定词元类型的文本检索词典名称。如果列出了多个词典,
将按指定顺序依次查阅它们。
@@ -101,7 +101,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 在映射中要替换的文本搜索字典的名称。
+ 在映射中要替换的文本检索词典的名称。
@@ -113,7 +113,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
被用来替代old_dictionary
- 的文本搜索字典的名称。
+ 的文本检索词典的名称。
@@ -124,7 +124,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 该文本搜索配置的新名称。
+ 该文本检索配置的新名称。
@@ -135,7 +135,7 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 该文本搜索配置的新拥有者。
+ 该文本检索配置的新拥有者。
@@ -146,21 +146,21 @@ ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA
- 该文本搜索配置的新模式。
+ 该文本检索配置的新模式。
- ADD MAPPING FOR 形式为指定的词元类型安装要查询的字典列表;如果任何词元类型已经存在映射,则会报错。ALTER MAPPING FOR 形式执行相同操作,但会先移除这些词元类型的现有映射。ALTER MAPPING REPLACE 形式在任何出现旧字典的地方用new_dictionary 替换old_dictionary 。当出现FOR 时,只对指定的词元类型执行此操作;不出现时,则对该配置的所有映射执行。DROP MAPPING 形式移除指定词元类型的所有字典,使这些类型的词元被文本搜索配置忽略。如果词元类型没有映射,则会报错,除非出现IF EXISTS 。
+ ADD MAPPING FOR 形式为指定的词元类型安装要查询的词典列表;如果任何词元类型已经存在映射,则会报错。ALTER MAPPING FOR 形式执行相同操作,但会先移除这些词元类型的现有映射。ALTER MAPPING REPLACE 形式在任何出现旧词典的地方用new_dictionary 替换old_dictionary 。当出现FOR 时,只对指定的词元类型执行此操作;不出现时,则对该配置的所有映射执行。DROP MAPPING 形式移除指定词元类型的所有词典,使这些类型的词元被文本检索配置忽略。如果词元类型没有映射,则会报错,除非出现IF EXISTS 。
示例
- 以下示例在my_config 中使用english 的任何地方,都将english 字典替换为swedish 字典。
+ 以下示例在my_config 中使用english 的任何地方,都将english 词典替换为swedish 词典。
ALTER TEXT SEARCH CONFIGURATION my_config
diff --git a/zh/11/ref/alter_tsdictionary.sgml b/zh/11/ref/alter_tsdictionary.sgml
index 9fedf32d..76c28ac6 100644
--- a/zh/11/ref/alter_tsdictionary.sgml
+++ b/zh/11/ref/alter_tsdictionary.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
ALTER TEXT SEARCH DICTIONARY
- 更改一个文本搜索字典的定义
+ 更改一个文本检索词典的定义
@@ -37,14 +37,14 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- ALTER TEXT SEARCH DICTIONARY 更改文本搜索字典的
- 定义。你可以更改该字典的模板相关选项,也可以更改该字典的名称或拥有者。
+ ALTER TEXT SEARCH DICTIONARY 更改文本检索词典的
+ 定义。你可以更改该词典的模板相关选项,也可以更改该词典的名称或拥有者。
- 要使用ALTER TEXT SEARCH DICTIONARY ,你必须是该字典
+ 要使用ALTER TEXT SEARCH DICTIONARY ,你必须是该词典
的拥有者。
@@ -59,7 +59,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 一个现有文本搜索字典的名称(可以是模式限定的)。
+ 一个现有文本检索词典的名称(可以是模式限定的)。
@@ -70,7 +70,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 要为此字典设置的模板相关选项的名称。
+ 要为此词典设置的模板相关选项的名称。
@@ -81,7 +81,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 模板相关选项要使用的新值。如果省略等号和值,则会从该字典中移除
+ 模板相关选项要使用的新值。如果省略等号和值,则会从该词典中移除
该选项之前的设置,从而允许使用默认值。
@@ -93,7 +93,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 该文本搜索字典的新名称。
+ 该文本检索词典的新名称。
@@ -104,7 +104,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 该文本搜索字典的新拥有者。
+ 该文本检索词典的新拥有者。
@@ -115,7 +115,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 该文本搜索字典的新模式。
+ 该文本检索词典的新模式。
@@ -134,7 +134,7 @@ ALTER TEXT SEARCH DICTIONARY name SET SCHEMA
- 下面的示例命令更改了一个基于 Snowball 的字典的停用词列表。其他参数
+ 下面的示例命令更改了一个基于 Snowball 的词典的停用词列表。其他参数
保持不变。
@@ -160,7 +160,7 @@ ALTER TEXT SEARCH DICTIONARY my_dict ( language = dutch, StopWords );
- 下面的示例命令更新
了该字典的定义,但实际上并没有做
+ 下面的示例命令更新
了该词典的定义,但实际上并没有做
任何更改。
@@ -168,7 +168,7 @@ ALTER TEXT SEARCH DICTIONARY my_dict ( dummy );
(之所以可行,是因为选项移除代码在不存在该选项时也不会报错。)
- 这种技巧在修改该字典的配置文件时很有用:ALTER
+ 这种技巧在修改该词典的配置文件时很有用:ALTER
会强制现有数据库会话重新读取配置文件,而如果它们先前已经读取过这
些文件,本来是不会再次读取的。
diff --git a/zh/11/ref/alter_tsparser.sgml b/zh/11/ref/alter_tsparser.sgml
index 0844cb0a..ccc73f05 100644
--- a/zh/11/ref/alter_tsparser.sgml
+++ b/zh/11/ref/alter_tsparser.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
ALTER TEXT SEARCH PARSER
- 更改一个全文检索解析器的定义
+ 更改一个文本检索解析器的定义
@@ -30,7 +30,7 @@ ALTER TEXT SEARCH PARSER name SET SCHEMA 描述
- ALTER TEXT SEARCH PARSER 更改全文检索解析器的定义。
+ ALTER TEXT SEARCH PARSER 更改文本检索解析器的定义。
当前唯一支持的功能是更改该解析器的名称。
@@ -47,7 +47,7 @@ ALTER TEXT SEARCH PARSER name SET SCHEMA name
- 一个现有全文检索解析器的名称(可以是模式限定的)。
+ 一个现有文本检索解析器的名称(可以是模式限定的)。
@@ -56,7 +56,7 @@ ALTER TEXT SEARCH PARSER name SET SCHEMA new_name
- 该全文检索解析器的新名称。
+ 该文本检索解析器的新名称。
@@ -65,7 +65,7 @@ ALTER TEXT SEARCH PARSER name SET SCHEMA new_schema
- 该全文检索解析器的新模式。
+ 该文本检索解析器的新模式。
diff --git a/zh/11/ref/alter_tstemplate.sgml b/zh/11/ref/alter_tstemplate.sgml
index a3eec599..9c9dfc2c 100644
--- a/zh/11/ref/alter_tstemplate.sgml
+++ b/zh/11/ref/alter_tstemplate.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
ALTER TEXT SEARCH TEMPLATE
- 更改一个文本搜索模板的定义
+ 更改一个文本检索模板的定义
@@ -30,7 +30,7 @@ ALTER TEXT SEARCH TEMPLATE name SET SCHEMA 描述
- ALTER TEXT SEARCH TEMPLATE 更改文本搜索模板的定义。
+ ALTER TEXT SEARCH TEMPLATE 更改文本检索模板的定义。
当前唯一支持的功能是更改该模板的名称。
@@ -47,7 +47,7 @@ ALTER TEXT SEARCH TEMPLATE name SET SCHEMA name
- 一个现有文本搜索模板的名称(可以是模式限定的)。
+ 一个现有文本检索模板的名称(可以是模式限定的)。
@@ -56,7 +56,7 @@ ALTER TEXT SEARCH TEMPLATE name SET SCHEMA new_name
- 该文本搜索模板的新名称。
+ 该文本检索模板的新名称。
@@ -65,7 +65,7 @@ ALTER TEXT SEARCH TEMPLATE name SET SCHEMA new_schema
- 该文本搜索模板的新模式。
+ 该文本检索模板的新模式。
diff --git a/zh/11/ref/comment.sgml b/zh/11/ref/comment.sgml
index 89b06fe3..68533da6 100644
--- a/zh/11/ref/comment.sgml
+++ b/zh/11/ref/comment.sgml
@@ -116,7 +116,7 @@ COMMENT ON
rule_name
trigger_name
- 要添加注释的对象名称。表、聚合、排序规则、转换、域、外部表、函数、索引、操作符、操作符类、操作符族、过程、例程、序列、统计信息、文本搜索对象、类型和视图的名称可以带模式限定。为列添加注释时,relation_name 必须引用表、视图、复合类型或外部表。
+ 要添加注释的对象名称。表、聚合、排序规则、转换、域、外部表、函数、索引、操作符、操作符类、操作符族、过程、例程、序列、统计信息、文本检索对象、类型和视图的名称可以带模式限定。为列添加注释时,relation_name 必须引用表、视图、复合类型或外部表。
diff --git a/zh/11/ref/create_tsconfig.sgml b/zh/11/ref/create_tsconfig.sgml
index 974ef42a..1d4ceca2 100644
--- a/zh/11/ref/create_tsconfig.sgml
+++ b/zh/11/ref/create_tsconfig.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
CREATE TEXT SEARCH CONFIGURATION
- 定义一个新的文本搜索配置
+ 定义一个新的文本检索配置
@@ -33,24 +33,24 @@ CREATE TEXT SEARCH CONFIGURATION name
CREATE TEXT SEARCH CONFIGURATION
- 创建一个新的文本搜索配置。文本搜索配置指定一个能把字符串拆分为记号
- 的文本搜索解析器,以及一些可用于判断哪些记号对搜索有意义的词典。
+ 创建一个新的文本检索配置。文本检索配置指定一个能把字符串拆分为词元
+ 的文本检索解析器,以及一些可用于判断哪些词元对搜索有意义的词典。
- 如果只指定了解析器,那么新文本搜索配置最初没有从记号类型到词典的映射,
+ 如果只指定了解析器,那么新文本检索配置最初没有从词元类型到词典的映射,
因而会忽略所有词。要让该配置真正可用,必须使用后续的ALTER TEXT SEARCH
CONFIGURATION 命令创建映射。
- 另一种方式是复制一个现有的文本搜索配置。
+ 另一种方式是复制一个现有的文本检索配置。
- 如果给出了一个模式名称,则文本搜索配置会被创建在指定的模式中。否则它将会
+ 如果给出了一个模式名称,则文本检索配置会被创建在指定的模式中。否则它将会
被创建在当前模式中。
- 定义该文本搜索配置的用户会成为其拥有者。
+ 定义该文本检索配置的用户会成为其拥有者。
@@ -66,7 +66,7 @@ CREATE TEXT SEARCH CONFIGURATION namename
- 要创建的文本搜索配置的名称。该名称可以是模式限定的。
+ 要创建的文本检索配置的名称。该名称可以是模式限定的。
@@ -75,7 +75,7 @@ CREATE TEXT SEARCH CONFIGURATION nameparser_name
- 此配置要使用的文本搜索解析器的名称。
+ 此配置要使用的文本检索解析器的名称。
@@ -84,7 +84,7 @@ CREATE TEXT SEARCH CONFIGURATION namesource_config
- 要复制的现有文本搜索配置的名称。
+ 要复制的现有文本检索配置的名称。
diff --git a/zh/11/ref/create_tsdictionary.sgml b/zh/11/ref/create_tsdictionary.sgml
index 2dbca552..75218295 100644
--- a/zh/11/ref/create_tsdictionary.sgml
+++ b/zh/11/ref/create_tsdictionary.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
CREATE TEXT SEARCH DICTIONARY
- 定义一个新的文本搜索字典
+ 定义一个新的文本检索词典
@@ -33,19 +33,19 @@ CREATE TEXT SEARCH DICTIONARY name
CREATE TEXT SEARCH DICTIONARY 创建一个
- 新的文本搜索字典。文本搜索字典指定一种在搜索时识别哪些词值得关注、
- 哪些词不值得关注的方式。字典依赖于文本搜索模板,后者规定了实际执行
- 这项工作的函数。通常,字典会提供一些选项,用来控制模板函数的具体
+ 新的文本检索词典。文本检索词典指定一种在搜索时识别哪些词值得关注、
+ 哪些词不值得关注的方式。词典依赖于文本检索模板,后者规定了实际执行
+ 这项工作的函数。通常,词典会提供一些选项,用来控制模板函数的具体
行为。
- 如果给出了一个模式名称,那么该文本搜索字典会被创建在指定的模式中。
+ 如果给出了一个模式名称,那么该文本检索词典会被创建在指定的模式中。
否则它会被创建在当前模式中。
- 定义文本搜索字典的用户将成为其拥有者。
+ 定义文本检索词典的用户将成为其拥有者。
@@ -61,7 +61,7 @@ CREATE TEXT SEARCH DICTIONARY name
name
- 要创建的文本搜索字典的名称。该名称可以被模式限定。
+ 要创建的文本检索词典的名称。该名称可以被模式限定。
@@ -70,7 +70,7 @@ CREATE TEXT SEARCH DICTIONARY name
template
- 用于定义该字典基本行为的文本搜索模板名称。
+ 用于定义该词典基本行为的文本检索模板名称。
@@ -79,7 +79,7 @@ CREATE TEXT SEARCH DICTIONARY name
option
- 要为此字典设置的模板相关选项的名称。
+ 要为此词典设置的模板相关选项的名称。
@@ -105,7 +105,7 @@ CREATE TEXT SEARCH DICTIONARY name
下面的示例命令创建了一个基于 Snowball 且使用非标准停用词列表的
- 字典。
+ 词典。
diff --git a/zh/11/ref/create_tsparser.sgml b/zh/11/ref/create_tsparser.sgml
index 6af67ab8..5f2e5184 100644
--- a/zh/11/ref/create_tsparser.sgml
+++ b/zh/11/ref/create_tsparser.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
CREATE TEXT SEARCH PARSER
- 定义一个新的全文检索解析器
+ 定义一个新的文本检索解析器
@@ -36,19 +36,19 @@ CREATE TEXT SEARCH PARSER name (
CREATE TEXT SEARCH PARSER 创建一个
- 新的全文检索解析器。全文检索解析器定义了一种方法,用于将文本字符串
- 拆分成记号并为这些记号指定类型(类别)。解析器本身并没有太大用处,
- 必须与一些全文检索字典一起绑定到一个全文检索配置中,才能用于搜索。
+ 新的文本检索解析器。文本检索解析器定义了一种方法,用于将文本字符串
+ 拆分成词元并为这些词元指定类型(类别)。解析器本身并没有太大用处,
+ 必须与一些文本检索词典一起绑定到一个文本检索配置中,才能用于搜索。
- 如果给出了一个模式名称,那么全文检索解析器将被创建在指定的模式中。
+ 如果给出了一个模式名称,那么文本检索解析器将被创建在指定的模式中。
否则它会被创建在当前模式中。
要使用CREATE TEXT SEARCH PARSER ,你必须是超级用户。
- 之所以有此限制,是因为错误的全文检索解析器定义可能会让服务器陷入
+ 之所以有此限制,是因为错误的文本检索解析器定义可能会让服务器陷入
混乱,甚至崩溃。
@@ -65,7 +65,7 @@ CREATE TEXT SEARCH PARSER name (
name
- 要创建的全文检索解析器的名称。该名称可以是模式限定的。
+ 要创建的文本检索解析器的名称。该名称可以是模式限定的。
@@ -83,7 +83,7 @@ CREATE TEXT SEARCH PARSER name (
gettoken_function
- 该解析器的获取下一个记号的函数名称。
+ 该解析器的获取下一个词元的函数名称。
@@ -101,7 +101,7 @@ CREATE TEXT SEARCH PARSER name (
lextypes_function
- 该解析器的 lextypes 函数的名称(该函数返回它所产生的记号类型集合的
+ 该解析器的 lextypes 函数的名称(该函数返回它所产生的词元类型集合的
信息)。
@@ -111,7 +111,7 @@ CREATE TEXT SEARCH PARSER name (
headline_function
- 该解析器的 headline 函数的名称(该函数对一组记号生成摘要)。
+ 该解析器的 headline 函数的名称(该函数对一组词元生成摘要)。
diff --git a/zh/11/ref/create_tstemplate.sgml b/zh/11/ref/create_tstemplate.sgml
index 5dd2e1c0..24ee925e 100644
--- a/zh/11/ref/create_tstemplate.sgml
+++ b/zh/11/ref/create_tstemplate.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
CREATE TEXT SEARCH TEMPLATE
- 定义一个新的全文检索模板
+ 定义一个新的文本检索模板
@@ -33,22 +33,22 @@ CREATE TEXT SEARCH TEMPLATE name (
CREATE TEXT SEARCH TEMPLATE 创建一个
- 新的全文检索模板。全文检索模板定义实现全文检索字典的函数。模板本身
- 并无直接用途,必须先实例化为字典后才能使用。字典通常会指定要传递给
+ 新的文本检索模板。文本检索模板定义实现文本检索词典的函数。模板本身
+ 并无直接用途,必须先实例化为词典后才能使用。词典通常会指定要传递给
模板函数的参数。
- 如果给出了模式名称,则全文检索模板会被创建在指定模式中。否则它会被
+ 如果给出了模式名称,则文本检索模板会被创建在指定模式中。否则它会被
创建在当前模式中。
要使用CREATE TEXT SEARCH TEMPLATE ,你
- 必须是超级用户。之所以有此限制,是因为错误的全文检索模板定义可能使
- 服务器陷入混乱,甚至崩溃。将模板与字典分离的原因在于,模板封装了定
- 义字典时那些不安全
的方面。而在定义字典时可设置的参数,
- 对非特权用户来说是安全的,因此创建字典不必是特权操作。
+ 必须是超级用户。之所以有此限制,是因为错误的文本检索模板定义可能使
+ 服务器陷入混乱,甚至崩溃。将模板与词典分离的原因在于,模板封装了定
+ 义词典时那些不安全
的方面。而在定义词典时可设置的参数,
+ 由普通用户设置也是安全的,因此创建词典不必是特权操作。
@@ -64,7 +64,7 @@ CREATE TEXT SEARCH TEMPLATE name (
name
- 要创建的全文检索模板名称。该名称可以是模式限定的。
+ 要创建的文本检索模板名称。该名称可以是模式限定的。
diff --git a/zh/11/ref/drop_opclass.sgml b/zh/11/ref/drop_opclass.sgml
index 9d67dc64..545a2517 100644
--- a/zh/11/ref/drop_opclass.sgml
+++ b/zh/11/ref/drop_opclass.sgml
@@ -110,7 +110,7 @@ DROP OPERATOR CLASS [ IF EXISTS ] name 示例
- 移除 B-tree 操作符类widget_ops :
+ 移除 B-树操作符类widget_ops :
DROP OPERATOR CLASS widget_ops USING btree;
diff --git a/zh/11/ref/drop_tsconfig.sgml b/zh/11/ref/drop_tsconfig.sgml
index ea139802..b3ebb9d1 100644
--- a/zh/11/ref/drop_tsconfig.sgml
+++ b/zh/11/ref/drop_tsconfig.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
DROP TEXT SEARCH CONFIGURATION
- 移除一个文本搜索配置
+ 移除一个文本检索配置
@@ -29,7 +29,7 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
描述
- DROP TEXT SEARCH CONFIGURATION 删除一个现有文本搜索配置。
+ DROP TEXT SEARCH CONFIGURATION 删除一个现有文本检索配置。
要执行此命令,你必须是该配置的拥有者。
@@ -43,7 +43,7 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
IF EXISTS
- 如果该文本搜索配置不存在,则不要抛出错误。这种情况下会发出一个提示。
+ 如果该文本检索配置不存在,则不要抛出错误。这种情况下会发出一个提示。
@@ -52,7 +52,7 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
name
- 现有文本搜索配置的名称(可以被模式限定)。
+ 现有文本检索配置的名称(可以被模式限定)。
@@ -61,7 +61,7 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
CASCADE
- 自动删除依赖于该文本搜索配置的对象,以及所有进一步依赖于这些对象的对象
+ 自动删除依赖于该文本检索配置的对象,以及所有进一步依赖于这些对象的对象
(参见 )。
@@ -71,7 +71,7 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
RESTRICT
- 如果有任何对象依赖于该文本搜索配置,则拒绝删除该配置。这是默认值。
+ 如果有任何对象依赖于该文本检索配置,则拒绝删除该配置。这是默认值。
@@ -82,14 +82,14 @@ DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name
示例
- 移除文本搜索配置my_english :
+ 移除文本检索配置my_english :
DROP TEXT SEARCH CONFIGURATION my_english;
如果已有索引在to_tsvector 调用中引用了该配置,
- 此命令将不会成功。加上CASCADE 可以在删除该文本搜索配置的同时删除这类索引。
+ 此命令将不会成功。加上CASCADE 可以在删除该文本检索配置的同时删除这类索引。
diff --git a/zh/11/ref/drop_tsdictionary.sgml b/zh/11/ref/drop_tsdictionary.sgml
index 316c5d00..0f7751a1 100644
--- a/zh/11/ref/drop_tsdictionary.sgml
+++ b/zh/11/ref/drop_tsdictionary.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
DROP TEXT SEARCH DICTIONARY
- 移除一个文本搜索字典
+ 移除一个文本检索词典
@@ -29,8 +29,8 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] name描述
- DROP TEXT SEARCH DICTIONARY 删除一个现有文本搜索字典。
- 要执行此命令,你必须是该字典的拥有者。
+ DROP TEXT SEARCH DICTIONARY 删除一个现有文本检索词典。
+ 要执行此命令,你必须是该词典的拥有者。
@@ -43,7 +43,7 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] nameIF EXISTS
- 如果该文本搜索字典不存在,则不要抛出错误。这种情况下会发出一个提示。
+ 如果该文本检索词典不存在,则不要抛出错误。这种情况下会发出一个提示。
@@ -52,7 +52,7 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] namename
- 一个现有文本搜索字典的名称(可以被模式限定)。
+ 一个现有文本检索词典的名称(可以被模式限定)。
@@ -61,7 +61,7 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] nameCASCADE
- 自动删除依赖于该文本搜索字典的对象,以及进一步依赖于这些对象的所有对象
+ 自动删除依赖于该文本检索词典的对象,以及进一步依赖于这些对象的所有对象
(参见 )。
@@ -71,7 +71,7 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] nameRESTRICT
- 如果有任何对象依赖于该文本搜索字典,则拒绝删除它。这是默认值。
+ 如果有任何对象依赖于该文本检索词典,则拒绝删除它。这是默认值。
@@ -82,14 +82,14 @@ DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] name示例
- 移除文本搜索字典english :
+ 移除文本检索词典english :
DROP TEXT SEARCH DICTIONARY english;
- 如果已有文本搜索配置使用该字典,此命令将不会成功。
- 加上CASCADE 可以在删除字典的同时删除这类配置。
+ 如果已有文本检索配置使用该词典,此命令将不会成功。
+ 加上CASCADE 可以在删除词典的同时删除这类配置。
diff --git a/zh/11/ref/drop_tsparser.sgml b/zh/11/ref/drop_tsparser.sgml
index a65f47be..ea74f0f8 100644
--- a/zh/11/ref/drop_tsparser.sgml
+++ b/zh/11/ref/drop_tsparser.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
DROP TEXT SEARCH PARSER
- 移除一个文本搜索解析器
+ 移除一个文本检索解析器
@@ -29,7 +29,7 @@ DROP TEXT SEARCH PARSER [ IF EXISTS ] name描述
- DROP TEXT SEARCH PARSER 删除一个现有文本搜索解析器。
+ DROP TEXT SEARCH PARSER 删除一个现有文本检索解析器。
要使用此命令,你必须是超级用户。
@@ -43,7 +43,7 @@ DROP TEXT SEARCH PARSER [ IF EXISTS ] nameIF EXISTS
- 如果该文本搜索解析器不存在,则不要抛出错误。这种情况下会发出一个提示。
+ 如果该文本检索解析器不存在,则不要抛出错误。这种情况下会发出一个提示。
@@ -52,7 +52,7 @@ DROP TEXT SEARCH PARSER [ IF EXISTS ] namename
- 一个现有文本搜索解析器的名称(可以被模式限定)。
+ 一个现有文本检索解析器的名称(可以被模式限定)。
@@ -61,7 +61,7 @@ DROP TEXT SEARCH PARSER [ IF EXISTS ] nameCASCADE