更新时间:2025-10-23 GMT+08:00

SET

功能描述

用于修改运行时配置参数。

注意事项

大多数运行时参数都可以用SET在运行时设置,但有些则在服务运行过程中或会话开始之后不能修改。

语法格式

  • 设置所处的时区。
    SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT };
  • 设置所属的模式。
    SET [ SESSION | LOCAL ] 
        {CURRENT_SCHEMA { TO | = } { schema | DEFAULT }
        | SCHEMA 'schema'};
  • 设置客户端编码集。
    SET [ SESSION | LOCAL ] NAMES {'charset_name' [COLLATE 'collation_name'] | DEFAULT};
  • 设置自定义用户变量。
    SET @var_name := expr [, @var_name := expr] ...
    SET @var_name = expr [, @var_name = expr] ...
  • 设置其他运行时的参数。
    SET [ SESSION | @@SESSION. | @@ | LOCAL | @@LOCAL.]
          {config_parameter { TO | = } { expr | DEFAULT } | FROM CURRENT }};
  • 设置字符集。同时设置character_set_connection、character_set_results、character_set_client的值,把character_set_client、character_set_results设置成指定charset,把character_set_connection设置成character_set_database的值。DEFAULT表示把character_set_client、character_set_results设置为默认值,character_set_connection设置成character_set_database的值。
    SET {CHARSET | CHARACTER SET} {DEFAULT | charset_name}

参数说明

  • SESSION

    声明的参数只对当前会话起作用。如果SESSION和LOCAL都没出现,则SESSION为缺省值。

    如果在事务中执行了此命令,命令的产生影响将在事务回滚之后消失。如果该事务已提交,影响将持续到会话的结束,除非被另外一个SET命令重置参数。

  • LOCAL

    声明的参数只在当前事务中有效。在COMMIT或ROLLBACK之后,会话级别的设置将再次生效。

    不论事务是否提交,此命令的影响只持续到当前事务结束。一个特例是:在一个事务里面,既有SET命令,又有SET LOCAL命令,且SET LOCAL在SET后面,则在事务结束之前,SET LOCAL命令会起作用,但事务提交之后,则是SET命令会生效。

  • TIME ZONE

    用于指定当前会话的本地时区。

    取值范围:有效的本地时区。该选项对应的运行时参数名称为TimeZone,DEFAULT缺省值为PRC。

  • CURRENT_SCHEMA

    CURRENT_SCHEMA用于指定当前的模式。

    取值范围:已存在模式名称。如果模式名不存在,会导致CURRENT_SCHEMA值为空。

  • SCHEMA

    同CURRENT_SCHEMA。此处的schema是个字符串。

    例如:set schema 'public';

  • NAMES {'charset_name' [COLLATE 'collation_name'] | DEFAULT};

    用于设置客户端的字符编码。

    等价于:

    set client_encoding = charset_name; set character_set_connection = charset_name;
    set collation_connection = collation_name; set character_set_results = charset_name;

    取值范围:M-compatibility兼容模式下支持的字符集,字符序。暂不支持指定charset_name与数据库字符集不同。

  • config_parameter

    可设置的运行时参数的名称。可用的运行时参数可以使用SHOW ALL命令查看。

    部分通过SHOW ALL查看的参数不能通过SET设置。如max_datanodes。

  • value

    config_parameter的新值。可以声明为字符串常量、标识符、数字,或者逗号分隔的列表。DEFAULT用于把这些参数设置为它们的缺省值。

  • SESSION | @@SESSION. | @@| LOCAL | @@LOCAL.

    声明的参数生效方式为superuser、user,可通过pg_settings系统视图的context字段确定,如果没有出现GLOBAL /SESSION,则SESSION为缺省值。支持config_parameter赋值为表达式。

    1. 使用@@config_parameter进行操作符运算时,尽量使用空格隔开。比如set @@config_parameter1=@@config_parameter1*2; 命令中,会将=@@当做操作符,可将其修改为set @@config_parameter1= @@config_parameter1 * 2 。
    2. GaussDB中仅支持通过数据库运维平台下发全局参数,避免错误使用时影响其他用户或应用,带来安全隐患,因此不支持@@global语法修改参数值。
  • var_name

    自定义变量名。变量名只能由数字、字母、下划线(_),点(.)、$组成,如果使用单引号(')、双引号(")、反引号(`)引用时,则可以使用其他字符,但不能使用相同引号。形如,单引号内可以使用除单引号外的其他字符。

    • 自定义变量只会存储数值类型、字符类型、二进制类型和NULL。对于布尔类型,有符号整型,bit和year类型会转为int8存储;无符号整型转为无符号int8存储;float4、float8类型转为float8存储;numeric类型转为numeric存储;二进制类型转为longblob类型;除year类型的时间类型和字符类型转为longtext存储。
    • prepare语句不支持自定义用户变量。
    • 对于连续赋值的场景,只支持@var_name1 := @var_name2 := … := expr和@var_name1 = @var_name2 := … := expr,等号只有放在首位才表示赋值,形如set @var_name1 = @var_name2 := @var_name3 = @var_name4 := expr这种等号放在中间的赋值场景不支持,因为除首位其他位置等号表示比较操作符。
    • 非SET语句中不支持对用户变量赋值,只支持使用或查询。
    • 对于无法转为用户变量支持的数据类型,则报错。
  • expr

    表达式,支持可直接或间接转为整型、浮点型、字符串、位串和NULL的表达式。

    • 字符串表达式中避免包含口令等敏感信息的函数,如加解密类函数gs_encrypt,gs_decrypt等,防止敏感信息泄露。
    • 当expr为子查询表达式或为case when表达式且最终结果为子查询表达式时,自定义变量结果与直接查询结果一致。MySQL使用中间计算结果,自定义变量和直接查询结果可能不一致。

示例

--设置模式搜索路径。    
m_db=# SET search_path TO tpcds, public;

--把日期时间风格设置为传统的 POSTGRES 风格(日在月前)。
m_db=# SET datestyle TO postgres,dmy;

--设置用户变量
m_db=# SET @a := 1;

相关链接

RESETSHOW