企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 18.11\. 客户端连接缺省 ## 18.11.1\. 语句行为 `search_path` (`string`) 这个变量声明模式的搜索顺序,在一个被引用对象(表、数据类型、函数等)只是一个简单名字, 没有声明模式时需要这样的搜索。如果在另外一个模式里有一个相同的对象名, 那么使用在这个搜索路径中找到的第一个。 一个不在搜索路径中任何一个模式里出现的对象只能通过其所在模式的全称(打点的)名字来声明。 `search_path`的值必需是一个逗号分隔的模式名列表。 它不是一个现有的模式名,或者用户不具有`USAGE`权限的模式,都将被自动忽略。 如果列表项之一是特殊名称`$user`, 那么通过`SESSION_USER`返回的名称模式被取代, 如果有这样一个模式并且用户已经有`USAGE`权限。 (如果不是,那么忽略`$user`。) 系统表模式`pg_catalog`总是被搜索,不管是否在搜索路径。如果在路径中, 那么按照路径指定的顺序搜索, 如果`pg_catalog`不在路径中,那么将在任何路径_之前_搜索。 同样,如果它存在,那么当前会话的临时表模式, `pg_temp_``_nnn_`总是被搜索。 它可以通过使用别名`pg_temp` 被明确地列在该路径中。如果没有列在路径中,那么它首先被搜索(甚至`pg_catalog`之前)。 但是,临时模式只搜索关系(表,视图,序列等)以及数据类型名称。 它从来没有搜索函数或运算符名称。 如果创建对象时没有声明特定的目标模式,那么它将被放进`search_path`中的第一个模式。 如果搜索路径是空的,那么会报告一个错误。 这个参数的缺省值是`"$user", public`。 这样就支持共享使用一个数据库(没有用户拥有私有模式,所有人都共享使用`public`)、 私有的针对每个用户的模式、以及两者的组合。 其它效果可以通过全局或者针对每个用户修改搜索路径设置获取。 搜索路径当前值可以用SQL函数`current_schemas`(参阅[Section 9.25](#calibre_link-1457)) 检查。它和检查`search_path`的值不太一样,因为`current_schemas` 显示的是在`search_path`里出现的项如何被处理。 有关模式处理的更多信息,参阅[Section 5.7](#calibre_link-1458)。 `default_tablespace` (`string`) 这个变量声明当`CREATE`命令没有明确声明表空间时, 所创建对象(表和索引等)的缺省表空间。 值要么是一个表空间的名字,要么是一个表明使用当前数据库缺省表空间的空字符串。 如果这个数值和任意现存表空间的名字都不匹配, 那么PostgreSQL将自动使用当前数据库的缺省表空间。 如果声明非缺省表空间,用户必须有`CREATE`权限,或者创建尝试将失败。 这个变量不用于临时表;对他们来说, [temp_tablespaces](#calibre_link-91)提供谘询。 这个变量在创建数据库时也没有使用。默认情况下,新的数据库继承了从 模板数据库复制的表空间设置。 关于表空间的更多信息,请参阅[Section 21.6](#calibre_link-1269)。 `temp_tablespaces` (`string`) 当`CREATE`命令不明确指定一个表空间时, 这个变量指定要在其中创建临时对象的表空间(临时表和临时表的索引)。 出于此目的的临时文件,比如排序大型数据集,也在这些表空间中创建。 该值是表空间名称的列表。当列表中有一个以上名称时, PostgreSQL每次临时对象被创建时选择一个列表中的随机数; 除了在一个事务中之外,先后创建临时 对象放置在列表连续的表空间中。 如果列表中选定的元素是一个空字符串, PostgreSQL会自动使用当前数据库的缺省表空间。 当`temp_tablespaces`交互设置时,指定 不存在的表空间是一个错误,为 不具有`CREATE`权限的用户声明一个表空间。但是, 当使用事先设定的值时,则忽略不存在的表空间, 因为对于缺少`CREATE`权限的用户是一个表空间。 特别是,该规则适用于使用`postgresql.conf`设置的值时。 默认值是一个空字符串,这会导致所有临时对象在当前数据库缺省表空间被创建。 参阅[default_tablespace](#calibre_link-90)。 `check_function_bodies` (`boolean`) 这个参数通常是on。设置为`off`表示在[CREATE FUNCTION](#calibre_link-4)之间关闭函数体字符串的合法性检查。 关闭合法性检查有时候会有用,比如避免从转储中恢复函数定义时向前引用的问题。 `default_transaction_isolation` (`enum`) 每个SQL事务都有一个隔离级别,可以是"读未提交","读已提交", "可重复读"或者是"可串性化"。 这个参数控制每个新事务的缺省隔离级别。缺省是"读已提交"。 参考[Chapter 13](#calibre_link-444)和[SET TRANSACTION](#calibre_link-507)获取更多信息。 `default_transaction_read_only` (`boolean`) 只读的SQL事务不能修改非临时表。这个参数控制每个新事务的只读状态。缺省是`off`(读/写)。 参考[SET TRANSACTION](#calibre_link-507)获取更多信息。 `default_transaction_deferrable` (`boolean`) 当在`可串行化`隔离级别下运行时, 延迟的只读SQL事务允许继续进行之前可能会延迟。 然而,一旦开始执行不会产生任何开销要求,以确保串行化; 所以串行化代码没有理由迫使它终止,因为并发更新, 这使这些选项适合长时间运行只读事务。 此参数控制每个新事务缺省延迟状态。 它目前对读写事务或那些比`可串行化`低的隔离级别下的操作没有影响。 缺省是`off`。 参阅[SET TRANSACTION](#calibre_link-507)获取更多详细信息。 `session_replication_role` (`enum`) 控制当前会话复制相关的触发器和规则。设置此变量需要 超级用户权限,并导致丢弃任何以前缓存查询规划。 可能的值是`origin` (缺省),`replica`和`local`。 参阅[ALTER TABLE](#calibre_link-88)获取更多信息。 `statement_timeout` (`integer`) 退出任何使用了超过此参数指定时间(毫秒)的语句,从服务器收到命令时开始计时。 如果`log_min_error_statement`设置为`ERROR`或者更低, 那么也会在日志中记录超时。 零值(缺省)关闭这个计时器。 不推荐设置`postgresql.conf`中的`statement_timeout`, 因为它影响所有的会话。 `lock_timeout` (`integer`) 当试图获取表、索引、行或其他数据库对象的锁时,终止等待时间超过指定毫秒数的任何语句。 时间限制分别适用于每个锁获取尝试。该限制适用于明确 锁定请求(如`LOCK TABLE`或者没有`NOWAIT`的`SELECT FOR UPDATE`) 以及隐式获取的锁。 如果`log_min_error_statement`设置为`ERROR`或更低, 则记录超时的语句。零值(缺省值)关闭它。 不像`statement_timeout`,此超时只能发生在等待锁的时候。 请注意,如果`statement_timeout`是非零, 设置`lock_timeout`相同或更大的值是相当没有意义的, 因为该语句超时总是会首先触发。 不推荐设置`postgresql.conf`中的`lock_timeout`, 因为它影响所有的会话。 `vacuum_freeze_table_age` (`integer`) 如果该表`pg_class`.`relfrozenxid` 字段已达到此设置中指定的时间,`VACUUM`执行全表扫描。 默认值是1.5亿个事务。虽然用户可以从零到十亿设置此值。 `VACUUM`会默默的限制[autovacuum_freeze_max_age](#calibre_link-96)的95%的有效值, 从而使定期手动的`VACUUM`在自动清理该表之前有运行机会。 详细信息请见[Section 23.1.5](#calibre_link-92)。 `vacuum_freeze_min_age` (`integer`) 指定`VACUUM`在扫描一个表时用于判断是否用`FrozenXID` 替换事务ID的中断寿命(在同一个事务中)。 缺省值为50百万。虽然用户可以指定一个 0-1000000000之间的值, 但是`VACUUM`将会悄无声息的将有效值限制在[autovacuum_freeze_max_age](#calibre_link-96)的一半之内。 更多信息参见[Section 23.1.5](#calibre_link-92)。 `bytea_output` (`enum`) 设置`bytea`类型值的输出格式。 有效值为`hex` (缺省) 和`escape` (传统PostgreSQL 格式)。参见[Section 8.4](#calibre_link-628)获取更多信息。 不管这些设置,其中`bytea`类型总是接受这两种格式的输入。 `xmlbinary` (`enum`) 设置二进制值是如何在XML中进行编码的。 这适用于当`bytea`值通过`xmlelement` 或者`xmlforest`函数被转换为XML。 可能的值是`base64`和`hex`, 这在XML模式标准中定义。默认值是`base64`。 关于XML相关的函数的进一步信息,请参阅[Section 9.14](#calibre_link-1459)。 这里的实际选择主要是口味问题, 只有在客户端应用程序中可能存在某些限制约束。 这两种方法都支持所有可能的值, 虽然十六进制编码将会比base64编码大一些。 `xmloption` (`enum`) 当XML和字符串值之间进行转换时,设置`DOCUMENT`或 `CONTENT`是否是隐含的。 参见[Section 8.13](#calibre_link-1460)获取更多详细信息。有效 值`DOCUMENT`和`CONTENT`。缺省是 `CONTENT`。 按照SQL标准,设置这个选项的命令是: ``` SET XML OPTION { DOCUMENT | CONTENT }; ``` 这种语法在PostgreSQL中是可用的。 ## 18.11.2\. 区域和格式化 `DateStyle` (`string`) 设置日期和时间值的显示格式,以及有歧义的输入值的解析规则。 由于历史原因,这个变量包含两个独立的部分:输出格式声明(`ISO`, `Postgres`, `SQL`或者`German`)、 输入输出的年/月/日顺序(`DMY`, `MDY`或者`YMD`)。 这两个可以独立设置或者一起设置。 关键字`Euro`和`European` 等价于`DMY`; 关键字`US`, `NonEuro`和 `NonEuropean`等价于`MDY`。 参阅[Section 8.5](#calibre_link-783)获取更多信息。内置缺省是`ISO, MDY`, 但是initdb将在初始化配置文件时根据`lc_time`选择一个合适的默认设置。 `IntervalStyle` (`enum`) 设置区间值的显示格式。 `sql_standard`将产生输出匹配SQL标准时间间隔。 `postgres`的值(默认值)会产生输出匹配PostgreSQL8.4之前的版本。 当[DateStyle](#calibre_link-787)参数设置为`ISO`时。 `postgres_verbose`将产生输出匹配PostgreSQL8.4之前的版本。 当`DateStyle`参数被设置成非-`ISO`输出时。 `iso_8601`将产生输出匹配4.4.3.2节中ISO 8601定义的时间间隔格式。 `IntervalStyle`参数也会影响不明确的间隔输入的说明。 参阅[Section 8.5.4](#calibre_link-1461)获取更多详细信息。 `TimeZone` (`string`) 设置用于显示和解析时间戳的时区。内置缺省值`GMT`, 但是,这通常被`postgresql.conf`改写;initdb 将安装设置对应它的系统环境。 意味着使用系统环境声明的时区。 参阅[Section 8.5.3](#calibre_link-792)获取更多信息。 `timezone_abbreviations` (`string`) 设置服务器接受日期时间输入中使用的时区缩写集合。缺省值`'Default'`, 在全世界大多数地方都能工作的很好。 另外的可用值还有`'Australia'`和`'India'`等其它值。 参见[Appendix B](#calibre_link-121)以获取更多信息。 `extra_float_digits` (`integer`) 这个参数为浮点数值调整显示的数据位数,浮点类型包括`float4`, `float8`以及几何数据类型。 参数值加在标准的数据位数上(`FLT_DIG`或者`DBL_DIG`中合适的)。 数值可以设置为最高3, 以包括部分关键的数据位;这个功能对转储那些需要精确恢复的浮点数据特别有用。 或者你也可以把它设置位负数以消除不需要的数据位。 参阅[Section 8.1.3](#calibre_link-1462)。 `client_encoding` (`string`) 设置客户端编码(字符集)。缺省使用数据库编码。 字符集通过[Section 22.3.1](#calibre_link-1463)里描述的 PostgreSQL服务器支持。 `lc_messages` (`string`) 设置信息显示的语言。可接受的值是系统相关的; 参阅[Section 22.1](#calibre_link-1271)获取更多信息。如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。 在一些系统上,这个区域范畴并不存在,不过仍然允许设置这个变量, 只是不会有任何效果。同样,也有可能是所期望的语言的翻译信息不存在。 在这种情况下,你仍然能看到英文信息。 只有超级用户可以改变这个设置。因为它同时影响发送到服务器日志和客户端的信息。 并且不正确的值可能会掩盖服务器日志的可读性。 `lc_monetary` (`string`) 为格式化金额数量设置区域。比如用于`to_char`函数族。可接受的值是系统相关的; 参阅[Section 22.1](#calibre_link-1271)获取更多信息。如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。 `lc_numeric` (`string`) 设置用于格式化数字的区域,比如用于`to_char`函数族。可接受的值是系统相关的; 参阅[Section 22.1](#calibre_link-1271)获取更多信息。如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。 `lc_time` (`string`) 设置用于格式化日期和时间值的区域。比如`to_char`函数族, 可接受的值是系统相关的;参阅[Section 22.1](#calibre_link-1271)获取更多信息。 如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。 `default_text_search_config` (`string`) 选择文本搜索函数使用的那些变量的文本搜索配置没有声明配置的明确参数。 参见[Chapter 12](#calibre_link-426)获取进一步信息。 内置缺省值是`pg_catalog.simple`, 如果配置匹配可以被识别的区域,则initdb将初始化该设置的配置文件, 它对应于已选择的`lc_ctype`区域。 ## 18.11.3\. 其他缺省 `dynamic_library_path` (`string`) 如果需要打开一个可以动态装载的模块并且在`CREATE FUNCTION`或者 `LOAD`命令里面声明的名字没有目录部分(也就是说名字里不包含斜杠), 那么系统将搜索这个目录以查找声明的文件。 用于`dynamic_library_path`的数值必须是一个冒号分隔 (或者是在Windows上分号分隔)的绝对路径列表。 如果一个路径名字以特殊变量`$libdir` (PostgreSQL编译好的库目录)开头, 那么就替换为PostgreSQL发布提供的模块安装路径。 (使用`pg_config --pkglibdir`打印这个目录名)。比如: ``` dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir' ``` 或者是在Windows环境里: ``` dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' ``` 这个参数的缺省值是`'$libdir'`。 如果把这个值设置为一个空字符串,则关闭自动路径搜索。 这个参数可以在运行时由超级用户修改,但是这么修改的设置只能保持到这个客户端连接的结束, 因此这个方法应该保留给开发用途使用。我们建议在`postgresql.conf`配置文件里设置。 `gin_fuzzy_search_limit` (`integer`) GIN索引扫描返回的集合尺寸软上限。更多信息参见[Section 57.4](#calibre_link-1464)。 `local_preload_libraries` (`string`) 指定在开始连接前预先加载一个或多个共享库,多个库之间用逗号分隔。 所有的库名被转换为小写字母,除非双引号引用。 该参数不能在会话开始之后更改。 因为并非只有超级用户才能更改此选项, 因此只能加载安装的标准库目录下`plugins`子目录中的库文件, 数据库管理员有责任确保该目录中的库都是"安全的"。 `local_preload_libraries`中指定的项可以明确含有该目录, 例如`$libdir/plugins/mylib`;也可以仅指定库的名字— 例如`mylib`(等价于`$libdir/plugins/mylib`)。 与[shared_preload_libraries](#calibre_link-576)不同的是, 在会话开始时加载库比第一次使用时相比并不具有性能优势。 相反,这个特性的目的是为了调试或者测量在特定会话中不明确使用`LOAD`加载库时的性能。 例如针对某个用户将该参数设为`ALTER ROLE SET`来进行调试。 如果指定的库未找到,那么连接将失败。 每一个支持PostgreSQL的库都有一个"magic block"用于确保兼容性。 因此不支持PostgreSQL的库不能通过这个方法加载。