↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 7.3 已结束支持。 请参阅 当前版本手册.

SET

SET — 更改一个运行时参数

大纲

SET [ SESSION | LOCAL ] variable { TO | = } { value | 'value' | DEFAULT }
SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }
  

输入

SESSION

指定命令对当前会话生效。(如果 SESSION 和 LOCAL 都未出现,这是默认行为。)

LOCAL

指定命令只对当前事务生效。在 COMMIT 或 ROLLBACK 之后,会话级的设置重新生效。注意,如果在 BEGIN 块之外执行 SET LOCAL,它看起来不会有任何效果,因为事务会立即结束。

variable

一个可设置的运行时参数。

value

参数的新值。DEFAULT 可用于指定把参数重置为默认值。允许使用字符串列表,但更复杂的构造可能需要加单引号或双引号。

描述

SET 命令更改运行时配置参数。管理员指南中列出的许多运行时参数都可以用 SET 即时更改。(但有些需要超级用户权限才能更改,另一些在服务器或会话启动后不能更改。)注意 SET 只影响当前会话使用的值。

如果在一个随后被中止的事务中发出SET或SET SESSION,那么在事务回滚时,SET命令的效果就会消失。(这一行为与PostgreSQL 7.3 之前的版本不同,在那些版本中,SET的效果不会在后续出错后回滚。)一旦该事务提交,这些效果就会持续到会话结束,除非被另一个SET覆盖。

SET LOCAL的效果只持续到当前事务结束,无论事务是否提交。一种特殊情况是:在同一个事务中先执行 SET,再执行SET LOCAL。这样SET LOCAL设置的值会一直生效到事务结束,但在此之后(如果该事务被提交),SET设置的值将生效。

即使把 autocommit 设为 off,SET 也不会开始一个新的事务块。详情见管理员指南的 autocommit 一节。

下面是可以设置的一些参数的补充细节:

DATESTYLE

选择日期/时间的表示风格。这里涉及两个独立的设置:默认的日期/时间输出和对有歧义输入的解释。

以下是日期/时间的输出风格:

ISO

使用 ISO 8601 风格的日期和时间(YYYY-MM-DD HH:MM:SS)。这是默认值。

SQL

使用 Oracle/Ingres 风格的日期和时间。注意这种风格与 SQL(它强制使用 ISO 8601 风格)毫无关系,这个选项的命名是一个历史意外。

PostgreSQL

使用传统的 PostgreSQL 格式。

German

数值日期表示使用 dd.mm.yyyy。

下面两个选项既决定 “SQL” 和 “PostgreSQL” 输出格式的子风格,也决定有歧义日期输入的首选解释。

European

数值日期表示使用 dd/mm/yyyy。

NonEuropean
US

数值日期表示使用 mm/dd/yyyy。

SET DATESTYLE 的值可以取自第一个列表(输出风格),或第二个列表(子风格),或从两个列表中各取一个并用逗号分隔。

SET DATESTYLE 影响输入的解释并提供几种标准输出格式。如果应用需要不同的变化形式或对输入输出的更严格控制,可以考虑使用 to_char 函数族。

除了通过 SET 或配置文件条目设置日期风格的正常方法之外,还有几种现已不推荐的方法:

设置 postmaster 的 PGDATESTYLE 环境变量。(它会被任何其他方法覆盖。)
使用选项 -o -e 运行 postmaster,把日期设为 European 约定。(这会覆盖环境变量和配置文件条目。)
设置客户端的 PGDATESTYLE 环境变量。如果在基于 libpq 的客户端前端环境中设置了 PGDATESTYLE,libpq 会在连接启动时自动把 DATESTYLE 设为 PGDATESTYLE 的值。这等价于手动发出 SET DATESTYLE。

NAMES

SET NAMES 是 SET CLIENT_ENCODING 的别名。

SEED

设置随机数生成器的内部种子。

value

random 函数使用的种子的值。允许的值是 0 到 1 之间的浮点数,之后会乘以 231-1。

种子也可以通过调用 setseed SQL 函数来设置:

SELECT setseed(value);
       

SERVER_ENCODING

显示服务器端的多字节编码。(目前这个参数只能显示不能设置,因为编码是在 initdb 时确定的。)

TIME ZONE
TIME ZONE

设置会话的默认时区。参数可以是 SQL 时间间隔常量、整数或双精度常量,或者一个表示宿主操作系统可识别的时区名的字符串。

下面是一些典型的时区设置值:

'PST8PDT'

把时区设为加利福尼亚州伯克利。

'Portugal'

把时区设为葡萄牙。

'Europe/Rome'

把时区设为意大利。

7

把时区设为 GMT 以西 7 小时偏移(相当于 PDT)。

INTERVAL '08:00' HOUR TO MINUTE

把时区设为 GMT 以西 8 小时偏移(相当于 PST)。

LOCAL
DEFAULT

把时区设为你的本地时区(你的操作系统默认的时区)。

可用的时区名取决于你的操作系统。例如在 Linux 上,/usr/share/zoneinfo 包含时区数据库;该目录中文件的名称可以用作这个命令的参数。

如果指定了无效的时区,时区会变成 GMT(至少在大多数系统上如此)。

如果在基于 libpq 的客户端前端环境中设置了 PGTZ 环境变量,libpq 会在连接启动时自动把 SET TIMEZONE 设为 PGTZ 的值。

使用SHOW显示参数的当前设置。

诊断

SET

成功时返回的消息。

ERROR: 'name is not a valid option name

你试图设置的参数不存在。

ERROR: 'name': permission denied

你必须是超级用户才能更改某些设置。

ERROR: 'name' cannot be changed after server start

有些参数在服务器启动后就是固定的。

示例

把日期风格设为带欧洲约定的传统 PostgreSQL 风格:

SET DATESTYLE TO PostgreSQL,European;
   

把时区设为加利福尼亚州伯克利,使用引号来保留时区名的大写拼写(注意这个例子中的日期风格是 PostgreSQL):

SET TIME ZONE 'PST8PDT';
SELECT CURRENT_TIMESTAMP AS today;
               today                
------------------------------------
 Tue Feb 26 07:32:21.42834 2002 PST
   

把时区设为意大利(注意需要单引号来处理特殊字符):

SET TIME ZONE 'Europe/Rome';
SELECT CURRENT_TIMESTAMP AS today;

             today             
-------------------------------
 2002-10-08 05:39:35.008271+02
   

兼容性

SQL92

SET TIME ZONE 扩展了 SQL9x 中定义的语法。SQL9x 只允许数值形式的时区偏移,而 PostgreSQL 还允许完整的时区说明字符串。所有其他 SET 特性都是 PostgreSQL 扩展。

另见

set_config 函数提供了等价的功能。见 PostgreSQL 用户指南中的杂项函数。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.