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)

这个参数通常为打开 。当设置为off时,它禁用CREATE FUNCTION期间对函数体字符串的验证。禁用验证避免了验证处理的副作用并且避免了如向前引用导致的伪肯定。在代表其他用户载入函数之前设置这个参数为offpg_dump会自动这样做。

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 without NOWAIT)和隐式获得的锁。如果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 亿个事务。尽管用户可以把这个值设置为从 0 到 20 亿,VACUUM会悄悄地将有效值设置为autovacuum_freeze_max_age值的95%,因此在表上启动一次反回卷自动清理之前有机会进行一次定期手动VACUUM。更多信息请见Section 23.1.5

vacuum_freeze_min_age (integer)

指定VACUUM在扫描表时用来决定是否把事务 ID 替换为FrozenXID的切断年龄(以事务计)。默认值是 5 千万个事务。尽管用户可以将这个值设置为从 0 到 10 亿,VACUUM会悄悄地将有效值设置为autovacuum_freeze_max_age值的一半,这样在强制执行的自动清理之间不会有过短的时间间隔。更多信息请见Section 23.1.5

vacuum_multixact_freeze_table_age (integer)

如果表的pg_class.relminmxid域超过了这个设置指定的年龄,VACUUM会执行一次全表扫描。默认值是 1.5 亿个组合事务。尽管用户可以把这个值设置为从 0 到 20 亿,VACUUM会悄悄地将有效值设置为autovacuum_multixact_freeze_max_age值的95%,因此在表上启动一次反回卷自动清理之前有机会进行一次定期手动VACUUM。更多信息请见Section 23.1.5.1

vacuum_multixact_freeze_min_age (integer)

指定VACUUM在扫描表时用来决定是否把组合事务 ID 替换为一个更新的事务 ID 或组合事务 ID 的切断年龄(以组合事务计)。默认值是 5 千万个组合事务。尽管用户可以将这个值设置为从 0 到 10 亿,VACUUM会悄悄地将有效值设置为autovacuum_multixact_freeze_max_age值的一半,这样在强制执行的自动清理之间不会有过短的时间间隔。更多信息请见Section 23.1.5.1

bytea_output (enum)

设置bytea类型值的输出格式。有效值是hex(默认)和 escape(传统的 PostgreSQL 格式)。详见Section 8.4。不管这个设置的值如何,bytea类型总是接受这两种格式的输入。

xmlbinary (enum)

设置二进制值如何被编码为 XML。例如,这适用于通过xmlelement函数或xmlforest函数将bytea值转换到 XML 值。可能的值有base64hex,它们都是用 XML 模式标准定义的。默认值是base64。更多关于 XML 相关函数的信息可参阅Section 9.14

这里的实际选择都是根据爱好做出的,只受客户端应用中可能存在的限制的约束。两种方法都支持所有可能的值,尽管十六进制编码将比 base64 编码更大。

xmloption (enum)

当在XML和字符串值之间进行转换时,无论设置DOCUMENT或 CONTENT都是隐式的。可参阅Section 8.13。 有效值是DOCUMENT和CONTENT。 缺省值是CONTENT。 当在 XML 和字符串值之间进行转换时,设置DOCUMENTCONTENT都是隐式的。详见Section 8.13。有效值是DOCUMENTCONTENT。默认值是CONTENT

根据 SQL 标准,设置这个选项的命令是:

SET XML OPTION { DOCUMENT | CONTENT };

这种语法在 PostgreSQL 也可用。

18.11.2. 区域和格式化

DateStyle (string)

设置日期和时间值的显示格式,以及解释有歧义的日期输入值的规则。由于历史原因, 这个变量包含两个独立的部分:输出格式声明(ISOPostgresSQLGerman)、 输入/输出的年/月/日顺序(DMYMDYYMD)。这些可以被独立设置或者一起设置。关键字EuroEuropeanDMY的同义词;关键字USNonEuroNonEuropeanMDY的同义词。详见Section 8.5。内建默认值是ISO, MDY,但是initdb将用对应于选中的lc_time区域行为的设置初始化配置文件。

IntervalStyle (enum)

设置间隔值的显示格式。值sql_standard将产生匹配 SQL 标准间隔文本的输出。当DateStyle参数被设置为ISO时,值postgres(默认)将产生匹配PostgreSQL发行 8.4 之前的输出。当DateStyle参数被设置为非ISO输出时,值postgres_verbose会产生匹配PostgreSQL发行 8.4 之前的输出。值iso_8601会产生匹配在 ISO 8601 的 4.4.3.2 节中定义的"带标志符格式"的时间间隔的输出。

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)

这个参数为浮点值调整显示的位数,包括float4float8以及几何数据类型。参数值被加在标准的位数(FLT_DIGDBL_DIG,视情况而定)上。该值最高可以被设置为 3 来包括部分有效位;这特别有助于转储需要被准确恢复的否点数据。或者它可以被设置为负值来消除不需要的位。另请参见Section 8.1.3

client_encoding (string)

设置客户端编码(字符集)。默认使用数据库编码。PostgreSQL服务器所支持的字符集在Section 22.3.1中描述。

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 FUNCTIONLOAD命令中指定的文件名没有目录部分(即名字中不包含斜线),那么系统将搜索这个路径以查找所需的文件。

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 库不能通过这种方法加载。