平台和客户端兼容性
很多平台都使用数据库系统,数据库系统的对外兼容性给平台提供了很大的方便。
convert_string_to_digit
参数说明:设置隐式转换优先级,是否优先将字符串转为数字。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示优先将字符串转为数字。
- off表示不优先将字符串转为数字。
默认值:on
须知: 该参数调整会修改内部数据类型转换规则,导致不可预期的行为,请谨慎操作。
nls_timestamp_format
参数说明:设置时间戳默认格式。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。
取值范围:字符串
默认值:DD-Mon-YYYY HH:MI:SS.FF AM
group_concat_max_len
参数说明: 搭配函数GROUP_CONCAT使用,限制其返回值长度,超长截断。
该参数属于USERSET类型参数,请参考表表1中对应设置方法进行设置。
取值范围: 0-9223372036854775807
默认值: 1024
说明: 目前能返回的最大长度是1073741823,超出此长度后会有out of memory的报错。
max_function_args
参数说明:函数参数最大个数。
该参数属于INTERNAL类型参数,为固定参数,用户无法修改此参数,只能查看。
取值范围:整型
默认值:8192
transform_null_equals
参数说明: 控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。如果expr得出NULL值则返回真,否则返回假。
- 正确的SQL标准兼容的expr = NULL总是返回NULL(未知)。
- Microsoft Access里的过滤表单生成的查询使用expr = NULL来测试空值。打开这个选项,可以使用该接口来访问数据库。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。
- off表示不控制,即expr = NULL总是返回NULL(未知)。
默认值: off
说明: 新用户经常在涉及NULL的表达式上语义混淆,故默认值设为off。
support_extended_features
参数说明: 控制是否支持数据库的扩展特性。
该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示支持数据库的扩展特性。
- off表示不支持数据库的扩展特性。
默认值: off
sql_compatibility
参数说明: 控制数据库的SQL语法和语句行为同哪一个主流数据库兼容。
该参数属于INTERNAL类型参数,用户无法修改,只能查看。
取值范围: 枚举型
- A表示同O数据库兼容。
- B表示同MY数据库兼容。
- C表示同TD数据库兼容。
- PG表示同POSTGRES数据库兼容。
默认值: A
须知:
该参数只能在执行CREATE DATABASE命令创建数据库时通过dbcompatibility设置。
在数据库中,该参数只能是确定的一个值,要么始终设置为A,要么始终设置为B,请勿任意改动,否则会导致数据库行为不一致。
b_format_behavior_compat_options
参数说明: 数据库B模式兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。
取值范围: 字符串
默认值: ""
说明:
- 当前只支持表1 兼容性B模式配置项。
- 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set b_format_behavior_compat_options='enable_set_variables,set_session_transaction';
表 1 兼容性B模式配置项
| |
| |
| |
| |
| |
|
enable_set_variable_b_format
参数说明: 在MY数据库模式下是否支持自定义用户变量的功能。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示在MY数据库模式下支持自定义用户变量。
- off表示在MY数据库模式下不支持自定义用户变量。
behavior_compat_options
参数说明: 数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。
取值范围: 字符串
默认值: 空
说明:
当前只支持表2 兼容性配置项。
配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set behavior_compat_options='end_month_calculate,display_leading_zero';
表 2 兼容性配置项
浮点数显示配置项。控制数值类型中浮点类型、任意精度类型的小数点前零显示。并且length计算数字长度同步显示。
| |
假定函数add_months的两个参数分别为param1和param2,param1的月份和param2的和为月份result。
openGauss=# select add_months('2018-02-28',3) from sys_dummy;
add_months
\---------------------\
2018-05-28 00:00:00
(1 row)
openGauss=# select add_months('2018-02-28',3) from sys_dummy;
add_months
\---------------------\
2018-05-31 00:00:00
(1 row) | |
设置此配置项时,会优化analyze的采样行为,主要体现在analyze时全局采样会更精确的控制在3万条左右,更好的控制analyze时DBnode端的内存消耗,保证analyze性能的稳定性。 | |
如果存在与模式名sche_name相同的表空间名,那么如果设置search_path为sche_name, default_tablespace也会同步切换到sche_name。 | |
在存储过程中如果不显示指定模式名,会优先在存储过程所属的模式下搜索。
| |
若设置此配置项,则不需要对除法结果做范围校验,例如,INT_MIN/(-1)可以得到输出结果为INT_MAX+1,反之,则会因为超过结果大于INT_MAX而报越界错误。 | |
控制函数lpad()和rpad()结果为空字符串''的显示配置项。
postgres=# select length(lpad('123',0,'*')) from sys_dummy;
length
\--------\
(1 row)
postgres=# select length(lpad('123',0,'*')) from sys_dummy;
length
\--------\
0
(1 row) | |
控制函数concat()和concat_ws()对variadic类型结果兼容性的配置项。 若设置此配置项,当concat函数参数为variadic类型时,保留a db和Teradata兼容模式下不同的结果形式;否则默认a db和Teradata兼容模式下结果相同,且与a db保持一致。由于MY无variadic类型,所以该选项对MY无影响。 | |
控制在使用MERGE INTO ... WHEN MATCHED THEN UPDATE(参考MERGE INTO)和INSERT ... ON DUPLICATE KEY UPDATE(参考INSERT)时,当目标表中一条目标数据与多条源数据冲突时UPDATE行为。 若设置此配置项,当存在上述场景时,该冲突行将会多次执行UPDATE;否则(默认)报错,即MERGE或INSERT操作失败。 | |
若设置此配置项,存储过程中每条更新语句前开启隐式保存点,EXCEPTION块中默认回退到最近的保存点,从而保证只回退失败语句的修改。该选项是为了兼容O数据库的EXCEPTION行为。 | |
numeric显示配置项。不设置此项时,numeric按照指定精度显示。设置此项时,所有输出numeric的场景均隐藏小数点后的末尾0,包括显示指定format精度情况。 openGauss=# set behavior_compat_options='hide_tailing_zero'; openGauss=# select cast(123.123 as numeric(15,10)) as a, to_char(cast(123.123 as numeric(15,10)), '999D999999'); a | to_char ---------+---------- 123.123 | 123.123 (1 row) openGauss=# set behavior_compat_options=''; openGauss=# select cast(123.123 as numeric(15,10)) as a, to_char(cast(123.123 as numeric(15,10)), '999D999999'); a | to_char ----------------+------------- 123.1230000000 | 123.123000 (1 row) | |
控制rowtype类型判空逻辑,设置此项时,对于rowtype is not null判断,当一行数据有一列不为空的时候返回ture。 | |
设置此项,且sql_compatibility参数的值为A或B时,正则表达式的 flags 参数支持的选项含义有变更:
| |
控制隐式游标状态兼容行为。设置此项,且兼容O,隐式游标状态(SQL%FOUND、SQL%NOTFOUND、SQL%ISOPNE、SQL%ROWCOUNT)由原先的仅在当前执行的函数有效,拓展到包括本函数调用的子函数有效。 | |
控制存储过程中FOR_LOOP查询语句行为设置此项时,在FOR rec IN query LOOP语句中,若rec已经定义,不会复用已经定义的rec变量,而且重新建立一个新的变量。否则,会复用已经定义的rec变量,不会建立新的变量。 | |
控制存储过程中select语句和open cursor语句的编译检查设置此项时,在存储过程中执行select语句、open cursor for语句、cursor%rowtype语句、for rec in语句时,若查询的表不存在,则无法创建创建存储过程,不支持trigger函数的编译检查,若查询的表存在,则成功创建存储过程。 | |
控制char(n)类型向其它变长字符串类型转换时的行为,以及char(n)和varchar操作时的行为。默认情况下char(n)类型转换其它变长字符串类型时会省略尾部的空格,开启该参数后,转换时不再省略尾部的空格,并且在转换时如果char(n)类型的长度超过其它变长字符串类型时将会报错;开启该参数后,char(n)和varchar操作时,例如比较操作符,首先各自转换为text类型再进行操作,具体表现为在操作时不会忽略尾部空格,如' '::char(5)和' '::varchar(5)不相等。该参数仅在sql_compatibility参数的值为A时生效。 | |
numeric显示配置项。不设置此项时,numeric按照默认精度显示。设置此项时,除去to_char(numeric, format)这种显示设置精度的情况,所有输出numeric的场景均会隐藏小数点后的末尾0。例如: openGauss=# set behavior_compat_options='truncate_numeric_tail_zero'; openGauss=# select cast(123.123 as numeric(15,10)) as a, to_char(cast(123.123 as numeric(15,10)), '999D999999'); a | to_char ---------+------------- 123.123 | 123.123000 (1 row) openGauss=# set behavior_compat_options=''; openGauss=# select cast(123.123 as numeric(15,10)) as a, to_char(cast(123.123 as numeric(15,10)), '999D999999'); a | to_char ----------------+------------- 123.1230000000 | 123.123000 (1 row) | |
控制substr(str, from, for)在不同场景下的表现。默认情况下,当from小于0时,substr将从字符串尾部开始计数;当for小于1时,substr将返回NULL。开启该参数后,当from小于0时,将从字符串的第一位的前(-from + 1)位开始计数;当for小于0时,substr将报错。该参数仅在sql_compatibility参数的值为PG时生效。 | |
开启此参数后,创建函数,存储过程,包支持未定义的对象。可以新建成功。可以在GS_DEPENDENCIES和GS_DEPENDENCIES_OBJ查询对应的依赖关系。 开启此参数后,创建PLSQL对象时,会主动维护依赖于该PLSQL对象的OID,不再需要用户手动更新。 注意: 1.在并发创建PLSQL对象时,如果需要维护的对象间存在竞争关系,可能会造成死锁。 2.在调用失效的PLSQL对象时,自动执行一个自治事务对PLSQL对象重编译,重编译有效时会修改pg_object表的valid字段为true,回滚调用PLSQL对象的事务不会回滚自治事务中的重编译语句,包括对pg_object表的valid字段的修改。 3.当修改对象在gs_dependencies和gs_dependencies_obj中存在时,不允许进行rename操作。 | |
allow_orderby_undistinct_column | SQL语法兼容B的情况下,开启此参数后,select语句支持order by后面的列不在distinct中。如: select distinct a from test order by b; 注意:该参数只支持distinct,不支持distinct on,且当 DOLPHIN 插件存在时不生效,转由 dolphin.sql_mode 参数控制。dolphin.sql_mode 未设置 sql_mode_full_group 选项时相当于打开此选项。 |
select_into_return_null | 在B或PG兼容模式下,开启此参数后,存储过程语句SELECT select_expressions INTO [STRICT] target FROM ... 允许在不指定STRICT并且查询结果为空时给变量赋NULL值。 |
在A兼容模式下,关闭此参数后,openGauss处理空字符串时会当做NULL处理;反之则正常接受空字符串。例如: openGauss=# set behavior_compat_options='accept_empty_str'; openGauss=# select '' is null; ?column? ---------- f (1 row) openGauss=# set behavior_compat_options=''; openGauss=# select '' is null; ?column? ---------- t (1 row) | |
proc_uncheck_default_param | 此参数打开时,调用带有默认参数的函数,入参从左到右排入函数,且允许缺省默认参数个数个入参,如果存在非默认参数的入参缺失,则会用错位的默认值填充缺失参数;参数关闭时,调用函数报错。 |
convert_string_digit_to_numeric | 控制是否将表中以字符串形式表示的numeric常量和数字类型作比较时统一都转换为numeric类型再进行比较。openGauss=# create table test1(c1 int, c2 varchar); openGauss=# insert into test1 values(2, '1.1'); openGauss=# set behavior_compat_options = ''; openGauss=# select * from test1 where c2 > 1; ERROR: invalid input syntax for type bigint: "1.1" openGauss=# set behavior_compat_options = 'convert_string_digit_to_numeric'; openGauss=# select * test1 from where c2 > 1; c1 | c2 ----+----- 2 | 1.1 (1 row) |
plsql_security_definer | 开启此参数后,创建存储过程时默认为定义者权限。 |
skip_insert_gs_source | 开启此参数后,创建PL/SQL对象时不再插入DBE_PLDEVELOPER.gs_source表中。 |
update_unusable_unique_index_on_iud | 开启此参数后,在数据insert、update、delete时候会同时对unusable unique索引的数据也进行更新,非unique索引不受影响。此参数默认关闭,关闭后如果有重复数据inser或者update到unique index列,rebuild unique index的时候会失败。 |
prefer_parse_cursor_parentheses_as_expr | 默认情况下openGuass只会把cursor(select xxx)和cursor(with xxx)两种场景的查询语句当成游标表达式执行,其他场景当成cursor function执行。如果开启此参数且系统中没注册cursor function,openGuass将所有的cursor()都当成表达式执行。比如cursor((select xxx))默认情况下会当成cursor function执行,打开其参数后将当成cursor表达式执行 |
update_global_index_on_partition_change | 此参数关闭时,分区变更(比如drop、merge、split、truncate分区等操作)时不会对全局索引进行数据更新而是将全局索引设置为UNUSABLE状态。打开此开关时,在分区变更时自动对全局索引进行数据更新操作,因此也会导致执行DDL时间变长和阻塞其他DML并发执行。默认此开关为关闭状态。 |
prior_function_first | 控制是否将prior(arg)当做函数进行使用。openGauss=# create table t1(father int, son int); CREATE TABLE openGauss=# insert into t1 values(0,1),(1, 2), (2, 3); INSERT 0 3 openGauss=# create or replace function prior(id int) returns int openGauss-# LANGUAGE plpgsql AS $$ openGauss$# begin openGauss$# raise info 'invoke prior function'; openGauss$# return id*3; openGauss$# end; openGauss$# $$; CREATE FUNCTION openGauss=# select prior son as father, son from t1 where prior(son) = 6 start with son = 1 connect by prior son = father; father | son --------+----- (0 rows) |
float_as_numeric | 在A兼容模式下,开启此参数后,FLOAT[(p)]映射至numeric,此时精度p为二进制精度,p取值范围为[1,126]。 |
plsql_compile_check_options
参数说明: 数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。
取值范围: 字符串
默认值: ""
说明:
- 当前只支持表3 兼容性配置项。
- 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set plsql_compile_check_options='for_loop,outparam';
表 3 兼容性配置项
控制存储过程中FOR_LOOP查询语句行为设置此项时,在FOR rec IN query LOOP语句中,若rec已经定义,不会复用已经定义的rec变量,而且重新建立一个新的变量。否则,会复用已经定义的rec变量,不会建立新的变量。(与proc_implicit_for_loop_variable相同,后续进行收编) | |
disable_keyword_options
参数说明:数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。设置该参数的标识符将不会作为关键字使用。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。
取值范围:字符串,支持设置以下关键字: interval。
默认值: ""
说明:
- 该参数打开后,作为关键字使用的部分功能会失效,请谨慎使用。
- 当设置非关键字时,会有警告提示,设置的非关键字标识符将会被跳过。
plpgsql.variable_conflict
参数说明:设置同名的存储过程变量和表的列的使用优先级。
该参数属于USERSET类型参数,仅支持表2中对应设置方法3进行设置。
取值范围:字符串
- error表示遇到存储过程变量和表的列名同名则编译报错。
- use_variable表示存储过程变量和表的列名同名则优先使用变量。
- use_column表示存储过程变量和表的列名同名则优先使用列名。
默认值:error
td_compatible_truncation
参数说明: 控制是否开启与Teradata数据库相应兼容的特征。该参数在用户连接上与TD兼容的数据库时,可以将参数设置成为on(即超长字符串自动截断功能启用),该功能启用后,在后续的insert语句中,对目标表中char和varchar类型的列插入超长字符串时,会按照目标表中相应列定义的最大长度对超长字符串进行自动截断。保证数据都能插入目标表中,而不是报错。
说明: 超长字符串自动截断功能不适用于insert语句包含外表的场景。如果向字符集为字节类型编码(SQL_ASCII、LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示启动超长字符串自动截断功能。
- off表示停止超长字符串自动截断功能。
默认值: off
uppercase_attribute_name
参数说明:设置列名以大写形式返回给客户端。该参数仅限于ORA兼容模式和集中式环境下使用。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。
取值范围: 布尔型
- on表示开启列名以大写形式返回给客户端。
- off表示关闭列名以大写形式返回给客户端。
默认值:off
lastval_supported
参数说明: 在分布式模式中,该参数控制是否可以使用lastval函数;而在单机模式下,该参数控制nextval函数在并行查询中是否可以下推到并行算子。 事实上,无论是分布式中lastval的使用,还是单机模式下nextval是否下推到并行算子,都不是由该参数单独控制的。enable_beta_features在这两个行为的控制上也发挥着作用,因此在讨论该参数的作用时,前提都是enable_beta_features为off。
该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。
取值范围: 布尔型
- on:在分布式模式中,表示允许lastval函数的使用;在单机模式中,表示nextval函数不可以下推到并行算子。
- off:在分布式模式中,表示不允许lastval函数的使用;在单机模式中,表示nextval函数可以下推到并行算子。
默认值: off
character_set_connection
参数说明: 在兼容B模式(sql_compatibility = 'B'),并且GUC参数b_format_behavior_compat_options设置值包含enable_multi_charset的场景下,连接到数据库时自动设置、生效。用于设置字符串常量的默认字符集。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。仅在设置会话级时生效,设置数据库级和用户级不生效。
修改此参数会同时将GUC参数collation_connection设置成该字符集的默认字符序。
取值范围: 字符串,详见仅支持在B模式下使用的字符序
默认值: 当前数据库的字符集。
collation_connection
参数说明: 在兼容B模式(sql_compatibility = 'B'),并且GUC参数b_format_behavior_compat_options设置值包含enable_multi_charset的场景下,连接到数据库时自动设置、生效。用于设置字符串常量的默认字符序。
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。仅在设置会话级时生效,设置数据库级和用户级不生效。
修改此参数会同时将GUC参数character_set_connection设置成该字符序对应的字符集。
取值范围: 字符串
默认值: 当前数据库的字符集的默认字符序。
附表:accept_empty开启后受影响函数
涉及SQL函数/功能 | 功能 |
---|---|
空字符串常量 | 返回一个字符串常量的语法树节点。 |
lpad | 通过填充字符串,把入参string填充为指定长度的字符串。(左填充) |
rpad | 通过填充字符串,把入参string填充为指定长度的字符串。(右填充) |
btrim | 从字符串string的两边删除指定模式的字符的最长的字符串。 |
ltrim | 从字符串string的开头删除指定模式的字符的最长的字符串。 |
ltrim | 从字符串string的开头删除空格的最长的字符串。 |
rtrim | 从字符串string的结尾删除指定模式的字符的最长的字符串。 |
rtrim | 从字符串string的结尾删除空格的最长的字符串。 |
nlssort | 以sort_method指定的排序方式返回字符串在该排序模式下的编码值,该编码值可用于排序,其决定了string在这种排序模式下的先后位置。 |
translate | 把在string中包含的任何匹配from中的字符转化为to中的字符,如果from比to长,删掉from中出现的额外的字符。 |
repeat | 将string重复number次。 |
oidvectortypes | 将一个由oid组成的向量(数组)转换为类型名的列表 |
regexp_replace | 替换匹配POSIX镇提供者表达式的子字符串 |
regexp_replace | 替换匹配POSIX镇提供者表达式的子字符串,该版本默认大小写敏感,且只替换第一个匹配项。 |
regexp_replace | 替换匹配POSIX镇提供者表达式的子字符串,该版本可以添加一些对应的匹配、替换选项,详情见文档。 |
regexp_split_to_table | 用POSIX正则表达式作为分隔符,分隔string。如果没有与pattern的匹配,该函数返回string。 |
regexp_substr | 用正则表达式抽取子串 |
lpad | lpad的向量化版本 |
substr | 返回字符串的子串(针对bytea) |
substr | 返回字符串的子串(针对bytea) |
replace | 对字符串string中出现的所有子字符串from替换为子字符串to |
split_part | 根据delimiter分割string,返回生成的第field个字符串 |
array_to_string | 将数组转换为字符串,使用第一个text作为数组的新分隔符 |
array_to_text_null | 将数组转换为字符串,使用第一个text作为数组的新分隔符,使用第二个text替换数组值为null的值 |
concat concat_ws group_concat_transfn | 连接两个字符串 以第一个参数作为分隔符,连接第二个以后的所有参数 用于聚集函数group_concat |
left | 返回前n个字符的子串 |
right | 返回后n个字符的子串 |
substrb | 提取指定位置、指定长度的子串 |
substrb | 提取指定位置开始到结尾的子串 |
substr | substr函数的codegen,是substr运行时生成特化代码用的。目前要使用需要满足一下三个条件:表为列存表,设置enable_codegen=on,设置codegen_cost_threshold=0 |
rtrim | rtrim函数的codegen,是rtrim运行时生成特化代码用的。目前要使用需要满足一下三个条件:表为列存表,设置enable_codegen=on,设置codegen_cost_threshold=0 |
btrim | btrim函数的codegen,是btrim运行时生成特化代码用的。目前要使用需要满足一下三个条件:表为列存表,设置enable_codegen=on,设置codegen_cost_threshold=0 |
substr(列存版) | 与substr相同,不过是列存版 |
enable_custom_parser
该参数当前版本不支持。