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) 检查。它和检查search_path的值不太一样,因为current_schemas 显示的是在search_path里出现的项如何被处理。

有关模式处理的更多信息,参阅Section 5.7

default_tablespace (string)

这个变量声明当CREATE命令没有明确声明表空间时, 所创建对象(表和索引等)的缺省表空间。

值要么是一个表空间的名字,要么是一个表明使用当前数据库缺省表空间的空字符串。 如果这个数值和任意现存表空间的名字都不匹配, 那么PostgreSQL将自动使用当前数据库的缺省表空间。 如果声明非缺省表空间,用户必须有CREATE权限,或者创建尝试将失败。

这个变量不用于临时表;对他们来说, temp_tablespaces提供谘询。

这个变量在创建数据库时也没有使用。默认情况下,新的数据库继承了从 模板数据库复制的表空间设置。

关于表空间的更多信息,请参阅Section 21.6

temp_tablespaces (string)

CREATE命令不明确指定一个表空间时, 这个变量指定要在其中创建临时对象的表空间(临时表和临时表的索引)。 出于此目的的临时文件,比如排序大型数据集,也在这些表空间中创建。

该值是表空间名称的列表。当列表中有一个以上名称时, PostgreSQL每次临时对象被创建时选择一个列表中的随机数; 除了在一个事务中之外,先后创建临时 对象放置在列表连续的表空间中。 如果列表中选定的元素是一个空字符串, PostgreSQL会自动使用当前数据库的缺省表空间。

temp_tablespaces交互设置时,指定 不存在的表空间是一个错误,为 不具有CREATE权限的用户声明一个表空间。但是, 当使用事先设定的值时,则忽略不存在的表空间, 因为对于缺少CREATE权限的用户是一个表空间。 特别是,该规则适用于使用postgresql.conf设置的值时。

默认值是一个空字符串,这会导致所有临时对象在当前数据库缺省表空间被创建。

参阅default_tablespace

check_function_bodies (boolean)

这个参数通常是on。设置为off表示在CREATE FUNCTION之间关闭函数体字符串的合法性检查。 关闭合法性检查有时候会有用,比如避免从转储中恢复函数定义时向前引用的问题。

default_transaction_isolation (enum)

每个SQL事务都有一个隔离级别,可以是"读未提交","读已提交", "可重复读"或者是"可串性化"。 这个参数控制每个新事务的缺省隔离级别。缺省是"读已提交"。

参考Chapter 13SET TRANSACTION获取更多信息。

default_transaction_read_only (boolean)

只读的SQL事务不能修改非临时表。这个参数控制每个新事务的只读状态。缺省是off(读/写)。

参考SET TRANSACTION获取更多信息。

default_transaction_deferrable (boolean)

当在可串行化隔离级别下运行时, 延迟的只读SQL事务允许继续进行之前可能会延迟。 然而,一旦开始执行不会产生任何开销要求,以确保串行化; 所以串行化代码没有理由迫使它终止,因为并发更新, 这使这些选项适合长时间运行只读事务。

此参数控制每个新事务缺省延迟状态。 它目前对读写事务或那些比可串行化低的隔离级别下的操作没有影响。 缺省是off

参阅SET TRANSACTION获取更多详细信息。

session_replication_role (enum)

控制当前会话复制相关的触发器和规则。设置此变量需要 超级用户权限,并导致丢弃任何以前缓存查询规划。 可能的值是origin (缺省),replicalocal。 参阅ALTER TABLE获取更多信息。

statement_timeout (integer)

退出任何使用了超过此参数指定时间(毫秒)的语句,从服务器收到命令时开始计时。 如果log_min_error_statement设置为ERROR或者更低, 那么也会在日志中记录超时。 零值(缺省)关闭这个计时器。

不推荐设置postgresql.conf中的statement_timeout, 因为它影响所有的会话。

lock_timeout (integer)

当试图获取表、索引、行或其他数据库对象的锁时,终止等待时间超过指定毫秒数的任何语句。 时间限制分别适用于每个锁获取尝试。该限制适用于明确 锁定请求(如LOCK TABLE或者没有NOWAITSELECT 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的95%的有效值, 从而使定期手动的VACUUM在自动清理该表之前有运行机会。 详细信息请见Section 23.1.5

vacuum_freeze_min_age (integer)

指定VACUUM在扫描一个表时用于判断是否用FrozenXID 替换事务ID的中断寿命(在同一个事务中)。 缺省值为50百万。虽然用户可以指定一个 0-1000000000之间的值, 但是VACUUM将会悄无声息的将有效值限制在autovacuum_freeze_max_age的一半之内。 更多信息参见Section 23.1.5

bytea_output (enum)

设置bytea类型值的输出格式。 有效值为hex (缺省) 和escape (传统PostgreSQL 格式)。参见Section 8.4获取更多信息。 不管这些设置,其中bytea类型总是接受这两种格式的输入。

xmlbinary (enum)

设置二进制值是如何在XML中进行编码的。 这适用于当bytea值通过xmlelement 或者xmlforest函数被转换为XML。 可能的值是base64hex, 这在XML模式标准中定义。默认值是base64。 关于XML相关的函数的进一步信息,请参阅Section 9.14

这里的实际选择主要是口味问题, 只有在客户端应用程序中可能存在某些限制约束。 这两种方法都支持所有可能的值, 虽然十六进制编码将会比base64编码大一些。

xmloption (enum)

当XML和字符串值之间进行转换时,设置DOCUMENTCONTENT是否是隐含的。 参见Section 8.13获取更多详细信息。有效 值DOCUMENTCONTENT。缺省是 CONTENT

按照SQL标准,设置这个选项的命令是:

SET XML OPTION { DOCUMENT | CONTENT };

这种语法在PostgreSQL中是可用的。

18.11.2. 区域和格式化

DateStyle (string)

设置日期和时间值的显示格式,以及有歧义的输入值的解析规则。 由于历史原因,这个变量包含两个独立的部分:输出格式声明(ISO, Postgres, SQL或者German)、 输入输出的年/月/日顺序(DMY, MDY或者YMD)。 这两个可以独立设置或者一起设置。 关键字EuroEuropean 等价于DMY; 关键字US, NonEuroNonEuropean等价于MDY。 参阅Section 8.5获取更多信息。内置缺省是ISO, MDY, 但是initdb将在初始化配置文件时根据lc_time选择一个合适的默认设置。

IntervalStyle (enum)

设置区间值的显示格式。 sql_standard将产生输出匹配SQL标准时间间隔。 postgres的值(默认值)会产生输出匹配PostgreSQL8.4之前的版本。 当DateStyle参数设置为ISO时。 postgres_verbose将产生输出匹配PostgreSQL8.4之前的版本。 当DateStyle参数被设置成非-ISO输出时。 iso_8601将产生输出匹配4.4.3.2节中ISO 8601定义的时间间隔格式。

IntervalStyle参数也会影响不明确的间隔输入的说明。 参阅Section 8.5.4获取更多详细信息。

TimeZone (string)

设置用于显示和解析时间戳的时区。内置缺省值GMT, 但是,这通常被postgresql.conf改写;initdb 将安装设置对应它的系统环境。 意味着使用系统环境声明的时区。 参阅Section 8.5.3获取更多信息。

timezone_abbreviations (string)

设置服务器接受日期时间输入中使用的时区缩写集合。缺省值'Default', 在全世界大多数地方都能工作的很好。 另外的可用值还有'Australia''India'等其它值。 参见Appendix B以获取更多信息。

extra_float_digits (integer)

这个参数为浮点数值调整显示的数据位数,浮点类型包括float4, float8以及几何数据类型。 参数值加在标准的数据位数上(FLT_DIG或者DBL_DIG中合适的)。 数值可以设置为最高3, 以包括部分关键的数据位;这个功能对转储那些需要精确恢复的浮点数据特别有用。 或者你也可以把它设置位负数以消除不需要的数据位。 参阅Section 8.1.3

client_encoding (string)

设置客户端编码(字符集)。缺省使用数据库编码。 字符集通过Section 22.3.1里描述的 PostgreSQL服务器支持。

lc_messages (string)

设置信息显示的语言。可接受的值是系统相关的; 参阅Section 22.1获取更多信息。如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。

在一些系统上,这个区域范畴并不存在,不过仍然允许设置这个变量, 只是不会有任何效果。同样,也有可能是所期望的语言的翻译信息不存在。 在这种情况下,你仍然能看到英文信息。

只有超级用户可以改变这个设置。因为它同时影响发送到服务器日志和客户端的信息。 并且不正确的值可能会掩盖服务器日志的可读性。

lc_monetary (string)

为格式化金额数量设置区域。比如用于to_char函数族。可接受的值是系统相关的; 参阅Section 22.1获取更多信息。如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。

lc_numeric (string)

设置用于格式化数字的区域,比如用于to_char函数族。可接受的值是系统相关的; 参阅Section 22.1获取更多信息。如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。

lc_time (string)

设置用于格式化日期和时间值的区域。比如to_char函数族, 可接受的值是系统相关的;参阅Section 22.1获取更多信息。 如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。

default_text_search_config (string)

选择文本搜索函数使用的那些变量的文本搜索配置没有声明配置的明确参数。 参见Chapter 12获取进一步信息。 内置缺省值是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

local_preload_libraries (string)

指定在开始连接前预先加载一个或多个共享库,多个库之间用逗号分隔。 所有的库名被转换为小写字母,除非双引号引用。 该参数不能在会话开始之后更改。

因为并非只有超级用户才能更改此选项, 因此只能加载安装的标准库目录下plugins子目录中的库文件, 数据库管理员有责任确保该目录中的库都是"安全的"。 local_preload_libraries中指定的项可以明确含有该目录, 例如$libdir/plugins/mylib;也可以仅指定库的名字— 例如mylib(等价于$libdir/plugins/mylib)。

shared_preload_libraries不同的是, 在会话开始时加载库比第一次使用时相比并不具有性能优势。 相反,这个特性的目的是为了调试或者测量在特定会话中不明确使用LOAD加载库时的性能。 例如针对某个用户将该参数设为ALTER ROLE SET来进行调试。

如果指定的库未找到,那么连接将失败。

每一个支持PostgreSQL的库都有一个"magic block"用于确保兼容性。 因此不支持PostgreSQL的库不能通过这个方法加载。