SET
SET — 设置会话的运行时参数
大纲
SETvariable{ TO | = } { 'value' | DEFAULT } SET TIME ZONE { 'timezone' | LOCAL | DEFAULT } SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZED }
输入
variable可设置的全局参数。
value参数的新值。
可能的变量和允许的值有:
- CLIENT_ENCODING | NAMES
设置多字节客户端编码。参数有:
value把多字节客户端编码设为
value。指定的编码必须为后端所支持。- DEFAULT
把多字节客户端编码设为默认值。
只有在向 configure 指定了 multi-byte 时才会启用。
- DateStyle
设置日期/时间的表示风格。影响输出格式,某些情况下也会影响输入的解释。
- ISO
使用 ISO 8601 风格的日期和时间
- SQL
使用 Oracle/Ingres 风格的日期和时间
- Postgres
使用传统的 Postgres 格式
- European
数值日期表示使用 dd/mm/yyyy。
- NonEuropean
数值日期表示使用 mm/dd/yyyy。
- German
数值日期表示使用 dd.mm.yyyy。
- US
与 'NonEuropean' 相同
- default
恢复默认值('US,Postgres')
日期格式的初始化可以通过以下方式完成:
设置 PGDATESTYLE环境变量。使用 -o -e选项运行 postmaster,把日期设为European约定。注意这只影响日期风格的一些组合;例如 ISO 风格不受这个参数影响。更改 src/backend/utils/init/globals.c中的变量。globals.c中可以更改的变量有:bool EuroDates = false | true int DateStyle = USE_ISO_DATES | USE_POSTGRES_DATES | USE_SQL_DATES | USE_GERMAN_DATES - SERVER_ENCODING
设置多字节服务器编码
value设置多字节服务器编码。
- DEFAULT
设置多字节服务器编码。
只有在向 configure 指定了 multi-byte 时才会启用。
- TIME ZONE
timezone 的可用值取决于你的操作系统。例如在 Linux 上,/usr/lib/zoneinfo 包含时区数据库。
下面是一些有效的 timezone 值:
- 'PST8PDT'
把时区设为加利福尼亚州
- 'Portugal'
把时区设为葡萄牙。
- 'Europe/Rome'
把时区设为意大利。
- DEFAULT
把时区设为你的本地时区(TZ 环境变量的值)。
如果指定了无效的时区,时区会变成 GMT(至少在大多数系统上如此)。
使用 libpq 的前端可以通过设置 PGTZ 环境变量来初始化。
上面所示的第二种语法允许用与 SQL92
SET TIME ZONE类似的语法设置时区。LOCAL 关键字只是为兼容 SQL92 而提供的 DEFAULT 的另一种形式。- TRANSACTION ISOLATION LEVEL
设置当前事务的隔离级别。
- READ COMMITTED
当前事务的查询只读取在查询开始之前已提交的行。READ COMMITTED 是默认值。
注意
SQL92 标准要求 SERIALIZABLE 为默认的隔离级别。
- SERIALIZABLE
当前事务的查询只读取在本事务中第一条 DML 语句 (
SELECT/INSERT/DELETE/UPDATE/FETCH/COPY_TO) 执行之前已提交的行。
还有一些内部参数或优化参数也可以由
SET 命令指定:
- COST_HEAP
设置优化器使用的堆扫描默认代价。
float4把堆扫描的代价设为指定的浮点值。
- DEFAULT
把堆扫描的代价设为默认值。
前端可以通过设置 PGCOSTHEAP 环境变量来初始化。
- COST_INDEX
设置优化器使用的索引扫描默认代价。
float4把索引扫描的代价设为指定的浮点值。
- DEFAULT
把索引扫描的代价设为默认值。
前端可以通过设置 PGCOSTINDEX 环境变量来初始化。
- GEQO
设置使用遗传优化器算法的阈值。
- ON
对涉及 6 个或更多表的语句启用遗传优化器算法。
- ON=
# 接受一个整数参数,对查询中涉及
#个或更多表的语句启用遗传优化器算法。- OFF
禁用遗传优化器算法。
- DEFAULT
等价于指定
SET GEQO='ON'
这个算法默认开启,即对涉及十一个或更多表的语句使用 GEQO。(更多信息见程序员指南中的 GEQO 一章。)
前端可以通过设置 PGGEQO 环境变量来初始化。
在大关系与小关系连接时可能有用。这个算法默认关闭。GEQO 也不会使用它。
- KSQO
键集查询优化器强制查询优化器优化诸如 MicroSoft Access 生成的重复 OR 子句:
- ON
启用这种优化。
- OFF
禁用这种优化。
- DEFAULT
等价于指定
SET KSQO='OFF'。
在大关系与小关系连接时可能有用。这个算法默认关闭。GEQO 也不会使用它。
前端可以通过设置 PGKSQO 环境变量来初始化。
输出
- →
SET VARIABLE 成功时返回的消息。
- →
WARN: Bad value forvariable(value) 如果命令未能设置指定的变量。
描述
SET 会在会话期间修改变量的配置参数。
当前值可以用 SHOW 获得,值可以用 RESET 恢复为默认值。参数和值不区分大小写。注意值字段总是以字符串形式指定,因此用单引号括起。
SET TIME ZONE 更改会话的默认时区偏移。SQL 会话总是以一个初始的默认时区偏移开始。SET TIME ZONE 语句用于更改当前 SQL 会话的默认时区偏移。
注解
SET
语句是一种 Postgres 语言扩展。
variable
请参阅 SHOW 和 RESET 来显示或重置当前值。
用法
把日期样式设置为 ISO:
SET DATESTYLE TO 'ISO';
为有 4 个或更多表的查询启用 GEQO:
SET GEQO ON=4;
把 GEQO 设为默认值:
SET GEQO = DEFAULT;
把时区设为加州伯克利:
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
SQL92 中没有通用的
SET (SET TRANSACTION ISOLATION LEVEL 除外)。SQL92 中 variableSET TIME ZONE 的语法略有不同,只允许用单个整数值指定时区:
SET TIME ZONE { interval_value_expression | LOCAL }