SET
SET — 更改一个运行时参数
大纲
SETvariable{ TO | = } {value| 'value' | DEFAULT } SET TIME ZONE { 'timezone' | LOCAL | DEFAULT }
输入
variable一个可设置的运行时参数。
value参数的新值。
DEFAULT可用于指定把参数重置为默认值。允许使用字符串列表,但更复杂的构造可能需要加单引号或双引号。
描述
SET 命令更改运行时配置参数。下列参数可以更改:
- CLIENT_ENCODING
NAMES 设置多字节客户端编码。指定的编码必须为后端所支持。
这个选项只有在 PostgreSQL 以多字节支持构建时才可用。
- 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的值可以取自第一个列表(输出风格),或第二个列表(子风格),或从两个列表中各取一个并用逗号分隔。日期格式的初始化可以通过以下方式完成:
设置 PGDATESTYLE环境变量。如果在基于 libpq 的客户端前端环境中设置了 PGDATESTYLE,libpq 会在连接启动时自动把 DATESTYLE 设为 PGDATESTYLE 的值。使用选项 -o -e运行 postmaster,把日期设为European约定。DateStyle选项其实只是为了移植应用而设的。要按你的选择格式化日期/时间值,请使用to_char函数族。- SEED
设置随机数生成器的内部种子。
valuerandom函数使用的种子的值。允许的值是 0 到 1 之间的浮点数,之后会乘以 231-1。如果使用范围之外的数,该乘积会静默溢出。也可以通过调用
setseedSQL 函数来设置种子:SELECT setseed(
value);
- SERVER_ENCODING
设置多字节服务器编码。
这个选项只有在 PostgreSQL 以多字节支持构建时才可用。
- TIME ZONE
TIME ZONE 设置会话的默认时区。参数可以是 SQL 时间间隔常量、整数或双精度常量,或者一个表示宿主操作系统所支持时区的字符串。
时区的可用值取决于你的操作系统。例如在 Linux 上,
/usr/share/zoneinfo包含时区数据库。下面是一些有效的时区值:
- 'PST8PDT'
把时区设为加利福尼亚州。
- 'Portugal'
把时区设为葡萄牙。
- 'Europe/Rome'
把时区设为意大利。
- 7
把时区设为 GMT 以西 7 小时偏移(相当于 PDT)。
- INTERVAL '08:00' HOUR TO MINUTE
把时区设为 GMT 以西 8 小时偏移(相当于 PST)。
- LOCAL
DEFAULT 把时区设为你的本地时区(你的操作系统默认的时区)。
如果指定了无效的时区,时区会变成 GMT(至少在大多数系统上如此)。
如果在基于 libpq 的客户端前端环境中设置了
PGTZ环境变量,libpq 会在连接启动时自动把 TIMEZONE 设为PGTZ的值。
其他运行时参数的完整列表见管理员指南。
使用SHOW显示参数的当前设置。
诊断
SET VARIABLE成功时返回的消息。
ERROR: not a valid option name:name你试图设置的参数不存在。
ERROR: permission denied你必须是超级用户才能访问某些设置。
ERROR:namecan only be set at start-up有些参数在服务器启动后就是固定的。
示例
把日期风格设为带欧洲约定的传统 PostgreSQL 风格:
SET DATESTYLE TO PostgreSQL,European;
把时区设为加利福尼亚州伯克利,使用双引号来保留时区说明符的大写属性(注意这里显示的日期/时间格式是 ISO):
SET TIME ZONE "PST8PDT";
SELECT CURRENT_TIMESTAMP AS today;
today
------------------------
1998-03-31 07:41:21-08把时区设为意大利(注意需要单引号或双引号来处理特殊字符):
SET TIME ZONE 'Europe/Rome';
SELECT CURRENT_TIMESTAMP AS today;
today
------------------------
1998-03-31 17:41:31+02
兼容性
SQL92
上面所示的第二种语法(SET TIME ZONE)试图模仿 SQL92。但 SQL 只允许数值形式的时区偏移。所有其他参数设置以及上面所示的第一种语法都是
PostgreSQL 扩展。