平台和客户端兼容性
很多平台都使用数据库系统,数据库系统的对外兼容性给平台提供了很大的方便。
transform_null_equals
参数说明:控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。如果expr得出NULL值则返回真,否则返回假。
- 正确的SQL标准兼容的expr = NULL总是返回NULL(未知)。
- Microsoft Access里的过滤表单生成的查询使用expr = NULL来测试空值。打开这个选项,可以使用该接口来访问数据库。
参数类型:USERSET
取值范围:布尔型
- on表示控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。
- off表示不控制,即expr = NULL总是返回NULL(未知)。
默认值:off
新用户经常在涉及NULL的表达式上语义混淆,故默认值设为off。
td_compatible_truncation
参数说明:控制是否开启与Teradata数据库相应兼容的特征。该参数在用户连接上与TD兼容的数据库时,可以将参数设置成为on(即超长字符串自动截断功能启用),该功能启用后,在后续的insert语句中,对目标表中char和varchar类型的列插入超长字符串时,会按照目标表中相应列定义的最大长度对超长字符串进行自动截断。保证数据都能插入目标表中,而不是报错。
- 超长字符串自动截断功能不适用于insert语句包含外表的场景。
- 如果向字符集为字节类型编码(SQL_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。
参数类型:USERSET
取值范围:布尔型
- on表示启动超长字符串自动截断功能。
- off表示停止超长字符串自动截断功能。
默认值:off
behavior_compat_options
参数说明:数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。
参数类型:USERSET
取值范围:字符串
默认值:升级场景下保持前向兼容,即与升级前的集群中该参数的默认值保持一致。新安装集群场景下,该参数默认值为 check_function_conflicts,check_function_shippable,unsupported_set_function_case,以防止用户定义错误的函数属性导致严重的问题。
- 当前只支持表1。
- 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set behavior_compat_options='end_month_calculate,display_leading_zero';
- 此参数选项中strict_concat_functions和strict_text_concat_td不能同时设置。
- Oracle兼容模式下不建议设置behavior_compat_options= 'return_null_string' ,如果设置了此选项,应避免将查询结果插入到表里。
兼容性配置项 |
兼容性行为控制 |
适用兼容模式 |
||||
---|---|---|---|---|---|---|
display_leading_zero |
浮点数显示配置项。
|
ORA TD |
||||
end_month_calculate |
add_months函数计算逻辑配置项。 假定函数add_months的两个参数分别为param1和param2,param1的月份和param2的月份和为result。
|
ORA TD |
||||
compat_analyze_sample |
analyze采样行为配置项。 设置此配置项时,会优化analyze的采样行为,主要体现在analyze时全局采样会更精确的控制在3万条左右,更好的控制analyze时Coordinator端的内存消耗,保证analyze性能的稳定性。 |
ORA TD MySQL |
||||
bind_schema_tablespace |
绑定模式与同名表空间配置项。 如果存在与模式名sche_name相同的表空间名,那么如果设置search_path为sche_name, default_tablespace也会同步切换到sche_name。 |
ORA TD MySQL |
||||
bind_procedure_searchpath |
未指定模式名的数据库对象的搜索路径配置项。 在存储过程中如果不显示指定模式名,会优先在存储过程所属的模式下搜索。 如果找不到,则有两种情况:
|
ORA TD MySQL |
||||
correct_to_number |
控制to_number()结果兼容性的配置项。 若设置此配置项,则to_number()函数结果与PG11保持一致,否则默认与Oracle保持一致。 |
ORA |
||||
unbind_divide_bound |
控制对整数除法的结果进行范围校验。
SELECT (-2147483648)::int / (-1)::int; ERROR: integer out of range
SELECT (-2147483648)::int / (-1)::int; ?column? ------------ 2147483648 (1 row) |
ORA TD |
||||
merge_update_multi |
控制行存表merge into匹配多行时是否进行update操作。 若设置此配置项,匹配多行时update不报错,否则默认与Oracle保持一致,报错。 |
ORA TD |
||||
disable_row_update_multi |
控制行存表update匹配多行时是否进行update操作。 若设置此配置项,匹配多行时update报错,否则默认可以进行多行匹配更新。 |
ORA TD |
||||
return_null_string |
控制函数lpad()、rpad()、repeat()、regexp_split_to_table()和split_part()的结果为空字符串''的显示配置项。
|
ORA |
||||
compat_concat_variadic |
控制函数concat()和concat_ws()对variadic类型结果兼容性的配置项。 若设置此配置项,当concat函数参数为variadic类型时,保留Oracle和Teradata兼容模式下不同的结果形式;否则默认Oracle和Teradata兼容模式下结果相同,且与Oracle保持一致。 |
ORA TD |
||||
convert_string_digit_to_numeric |
控制CHAR类型和INT类型进行二元BOOL运算时类型转换优先级的配置项。
注意:
此配置项只对二元BOOL运算生效,例如,INT2>TEXT、INT4=BPCHAR,非BOOL运算不会受到影响,该配置项暂不支持INT>'1.1'这类UNKNOWN类型运算的转换。由于该配置项开启后,CHAR类型与INT类型的BOOL运算会优先转换为NUMERIC类型进行计算,因此会影响数据库计算性能,当JOIN列为受影响的类型组合时,还会影响执行计划。 |
ORA TD MySQL |
||||
check_function_conflicts |
控制是否检查自定义plpgsql/SQL函数的属性。
例如:设置此参数时,以下场景下会执行报错: CREATE OR replace FUNCTION sql_immutable (INTEGER) RETURNS INTEGER AS 'SELECT a+$1 from shipping_schema.t4 where a=1;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; select sql_immutable(1); ERROR: IMMUTABLE function cannot contain SQL statements with relation or Non-IMMUTABLE function. CONTEXT: SQL function "sql_immutable" during startup referenced column: sql_immutable |
ORA TD MySQL |
||||
varray_verification |
控制是否校验数组长度以及数组类型长度。用于兼容GaussDB(DWS) 8.1.0之前的版本。 若设置此配置项,不会校验数组长度以及数组类型长度。 -- 场景1 CREATE OR REPLACE PROCEDURE varray_verification AS TYPE org_varray_type IS varray(5) OF VARCHAR2(2); v_org_varray org_varray_type; BEGIN v_org_varray(1) := '111'; --例如赋值已经超过了VARCHAR2(2)的限制,配置该选项后将和历史版本保持一致不进行校验 END; / --场景2 CREATE OR REPLACE PROCEDURE varray_verification_i3_1 AS TYPE org_varray_type IS varray(2) OF NUMBER(2); v_org_varray org_varray_type; BEGIN v_org_varray(3) := 1; --例如赋值已经超过了varray(2)的数组长度限制,配置该选项后将和历史版本保持一致不进行校验 END; / |
ORA TD |
||||
strict_concat_functions |
控制函数textanycat()和anytextcat()在参数存在空值时,对返回值兼容性的配置项。此参数不能和strict_text_concat_td同时设置。 MySQL兼容模式下,此参数无影响。
例如,不设置此配置项时,函数textanycat()和anytextcat()的返回值与Oracle保持一致: SELECT textanycat('gauss', cast(NULL as BOOLEAN)); textanycat ------------ gauss (1 row) SELECT 'gauss' || cast(NULL as BOOLEAN); --这种情况下,||运算符会被转换为函数textanycat ?column? ---------- gauss (1 row) 设置此配置项时,保留与Oracle和Teradata兼容模式下不同的结果: SELECT textanycat('gauss', cast(NULL as BOOLEAN)); textanycat ------------ (1 row) SELECT 'gauss' || cast(NULL as BOOLEAN); --这种情况下,||运算符会被转换为函数textanycat ?column? ---------- (1 row) |
ORA TD |
||||
strict_text_concat_td |
Teradata兼容模式下,控制函数textcat()、textanycat()和anytextcat()在参数存在空值时,对返回值兼容性的配置项。此参数不能和strict_concat_functions同时设置。
例如,不设置此配置项时,函数textcat()、textanycat()和anytextcat()的返回值与GaussDB(DWS)保持一致: td_compatibility_db=# SELECT textcat('abc', NULL); textcat --------- abc (1 row) td_compatibility_db=# SELECT 'abc' || NULL; --这种情况下,||运算符会被转换为函数textcat() ?column? ---------- abc (1 row) 设置此配置项时,若函数textcat()、textanycat()和anytextcat()的返回值有空值,则返回NULL: td_compatibility_db=# SELECT textcat('abc', NULL); textcat --------- (1 row) td_compatibility_db=# SELECT 'abc' || NULL; ?column? ---------- (1 row) |
TD |
||||
compat_display_ref_table |
设置视图中列的显示格式。
SET behavior_compat_options='compat_display_ref_table'; CREATE OR REPLACE VIEW viewtest2 AS SELECT a.c1, c2, a.c3, 0 AS c4 FROM viewtest_tbl a; SELECT pg_get_viewdef('viewtest2'); pg_get_viewdef ----------------------------------------------------- SELECT a.c1, c2, a.c3, 0 AS c4 FROM viewtest_tbl a; (1 row) |
ORA TD |
||||
para_support_set_func |
列存表中控制函数COALESCE()、NVL()、GREATEST()、LEAST()入参是否支持多结果集表达式。
|
ORA TD |
||||
disable_select_truncate_parallel |
控制分区表的truncate等ddl的锁等级。
|
ORA TD MySQL |
||||
bpchar_text_without_rtrim |
Teradata兼容模式下,设置此参数时,控制bpchar到text转换保留右侧空格,如果实际长度不足bpchar指定的长度,对其进行补空格操作,兼容Teradata对bpchar字符串的处理风格。 当前不支持“比较字符串时忽略尾部空格”,拼接后结果如果存在尾部空格,进行比较时会对空格敏感。 例如,设置参数时: td_compatibility_db=# select length('a'::char(10)::text); length -------- 10 (1 row) td_compatibility_db=# select length('a'||'a'::char(10)); length -------- 11 (1 row) |
TD |
||||
convert_empty_str_to_null_td |
Teradata兼容模式下,设置此参数时,控制to_date, to_timestamp和to_number类型转换函数处理空串时,返回null;同时控制to_char函数处理date类型入参时返回的格式。 例如: 未设置此参数时: td_compatibility_db=# select to_number(''); to_number ----------- 0 (1 row) td_compatibility_db=# select to_date(''); ERROR: the format is not correct DETAIL: invalid date length "0", must between 8 and 10. CONTEXT: referenced column: to_date td_compatibility_db=# select to_timestamp(''); to_timestamp ------------------------ 0001-01-01 00:00:00 BC (1 row) td_compatibility_db=# select to_char(date '2020-11-16'); to_char ------------------------ 2020-11-16 00:00:00+08 (1 row) 设置此参数,若to_number, to_date, to_timestamp函数的参数有空串时: td_compatibility_db=# select to_number(''); to_number ----------- (1 row) td_compatibility_db=# select to_date(''); to_date --------- (1 row) td_compatibility_db=# select to_timestamp(''); to_timestamp -------------- (1 row) td_compatibility_db=# select to_char(date '2020-11-16'); to_char ------------ 2020/11/16 (1 row) |
TD |
||||
disable_case_specific |
控制字符类型匹配时是否忽略大小写。仅在Teradata兼容模式下生效。
设置此配置项后会影响的字符类型包括CHAR、TEXT、BPCHAR、VARCHAR、NVARCHAR五种类型,会被影响的操作符包括<、>、=、>=、<=、!=、<>、!=、like、not like、in、not in共12种操作符以及case when、decode 表达式。
注意:
由于该配置项开启后,字符类型前会增加UPPER函数进而会影响估算逻辑,需要使用增强的估算模型。(建议设置:cost_param=16、cost_model_version = 1、join_num_distinct=-20、qual_num_distinct=200) |
TD |
||||
enable_interval_to_text |
控制interval到text类型的隐式转换功能。
|
ORA TD MySQL |
||||
case_insensitive |
MySQL兼容模式下,设置此参数,控制locate,strpos,instr字符串函数入参大小写不敏感。 目前默认未设置该参数,即入参大小写敏感。 例如:
|
MySQL |
||||
inherit_not_null_strict_func |
控制函数原有的strict属性,参数为1个的函数可以传递NOT NULL属性的行为。即:对于func(x),如果func()为strict属性,且x包含NOT NULL约束,则认为func(x)也是包含NOT NULL约束的。 该兼容配置项在某些优化场景,例如:NOT IN优化、COUNT(DISTINCT)优化,会有特定的优化效果,但特定场景可能导致结果错误。 目前默认未设置该参数,保证结果正确,但可能导致性能回退,如果出现问题可设置该参数回退到历史版本行为。 |
ORA TD MySQL |
||||
disable_compat_minmax_expr_mysql |
MySQL兼容模式下,控制greatest/least表达式对null入参的处理方式。 默认兼容MySQL。可通过设置此参数,回退到历史版本行为。
|
MySQL |
||||
disable_compat_substr_mysql |
MySQL兼容模式下,控制substr/substring函数在起始位置pos <= 0时的行为。 默认兼容MySQL。可通过设置此参数,回退到历史版本行为。
|
MySQL |
||||
disable_compat_trim_mysql |
MySQL兼容模式下,控制trim/ltrim/rtrim函数对入参的处理方式。 默认兼容MySQL。可通过设置此参数,回退到历史版本行为。
|
MySQL |
||||
light_object_mtime |
控制pg_object系统表mtime字段是否会记录对象行为的操作。
|
ORA TD MySQL |
||||
disable_including_all_mysql |
MySQL兼容模式下,控制CREATE TABLE ... LIKE语法是否为INCLUDING_ALL模式。 默认不设置此参数,即MySQL兼容模式下,CREATE TABLE ... LIKE语法默认为INCLUDING_ALL模式。 可通过设置此参数,回退到历史版本行为。
|
MySQL |
||||
cte_onetime_inline |
控制非stream计划是否执行inline。
|
ORA TD MySQL |
||||
skip_first_after_mysql |
MySQL兼容模式下,控制是否在ALTER TABLE ADD/MODIFY/CHANGE COLUMN中忽略FIRST/AFTER colname语法。
|
MySQL |
||||
enable_division_by_zero_mysql |
MySQL兼容模式下,除数为0时,控制除法或取余操作是否报错。(该配置项仅8.1.3.110及以上集群版本支持。)
|
MySQL |
||||
normal_session_id |
控制是否生成normal格式的会话ID。
|
ORA TD MySQL |
||||
disable_jsonb_exact_match |
控制操作符匹配规则,在对二元操作符进行模糊匹配时是否考虑jsonb类型。(该参数仅8.2.0及以上集群版本支持)
|
ORA TD MySQL |
||||
merge_into_with_trigger |
控制是否支持对有触发器的表执行MERGE INTO操作。(该参数仅8.1.3.200及以上集群版本支持)
|
ORA TD MySQL |
||||
add_column_default_v_func |
控制alter table add column default expression中expression是否支持volatile类型的函数。(该参数仅8.1.3.200及以上集群版本支持).
|
ORA TD MySQL |
||||
disable_full_group_by_mysql |
MySQL兼容模式下,控制查询中GROUP BY后是否可以不体现任何非聚合函数查询字段。(该参数仅8.2.0.101及以上集群版本支持)
注意:
该参数需结合full_group_by_mode使用,具体请参考full_group_by_mode。 此配置项配置后,若full_group_by_mode为notpadding,对于非GROUP BY后非聚合查询字段需要保证分组后数据一致,否则该列将为随机值。 |
MySQL |
||||
disable_gc_fdw_filter_partial_pushdown |
协同分析外表(类型为gc_fdw)场景下,控制使用过滤条件查询外表数据时过滤条件的下推情况。(该参数仅8.2.1及以上集群版本支持)
|
ORA TD MySQL |
||||
ignore_unshipped_concurrent_update |
并发更新场景下,当前会话的语句不下推时,如果更新的元组被其它会话更新成新元组后,控制当前会话执行UPDATE/DELETE语句时是否忽略处理新的元组。默认不再处理新的元组。(该参数仅8.2.1及以上集群版本支持)
|
ORA TD MySQL |
||||
disable_set_global_var_on_datanode |
控制set_config函数是否可以在DN上设置全局变量。(该参数仅8.2.1及以上集群版本支持)
|
ORA TD MySQL |
||||
deparse_view_with_partition |
当视图对应的表是分区表时,对视图进行DML操作,控制视图定义是否含有partition子句。(该参数仅8.2.1及以上集群版本支持)
|
ORA TD MySQL |
||||
variadic_null_check |
控制variadic参数是否能传入NULL参数的选项,默认不开启。(该参数仅8.2.1.300及以上集群版本支持)
|
ORA TD MySQL |
||||
enable_use_syscol_in_replicate_table |
控制复制表在INSERT、UPDATE、MERGE INTO和DELETE时是否可以采用oid/ctid/tableoid/xc_node_id作为过滤条件、连接条件和having条件。该选项默认不设置。该选项仅8.2.1.200及以上集群版本支持。
|
ORA TD MYSQL |
||||
enable_force_add_batch |
当参数support_batch_bind设置为on且参数enable_fast_query_shipping和enable_light_proxy设置off时,该选项控制GaussDB(DWS)是否接受addbatch模式的U报文。该选项默认不设置。该选项仅8.2.1.200及以上集群版本支持。
|
ORA TD MYSQL |
||||
disable_mergesort_without_material |
控制当前stream片段是否含有物化算子时stream算子采用merge sort。该选项仅8.2.1.100及以上集群版本支持。
|
ORA TD MYSQL |
||||
enable_pushdown_groupingset_subquery |
当子查询中含有grouping set时,该选项控制是否可将外层查询中仅与该子查询相关的条件下推到子查询中。该选项仅8.2.1.100及以上集群版本支持。
|
ORA TD MYSQL |
||||
enable_whole_row_var |
该参数主要涉及两个场景。1. 控制是否允许表或视图出现在SQL表达式中,包括但不限于查询的目标列表、GROUP BY列表等;2. 控制是否允许非表的record出现的SQL表达式。该选项仅8.3.0及以上集群版本支持。
|
ORA TD MYSQL |
||||
enable_unknown_datatype |
控制是否允许创建含有unknown类型列的表。该选项仅8.3.0及以上集群版本支持。
|
ORA TD MYSQL |
||||
alter_distribute_key_by_partition |
控制ALTER TABLE修改分区表分布列时INSERT INTO是否按分区执行。该选项仅8.2.1.210及以上集群版本支持。
|
ORA TD MYSQL |
||||
disable_update_returning_check |
控制是否禁用涉及到多表关联,更新复制表且带returning语句场景。该选项仅8.3.0及以上集群版本支持。
|
ORA TD MYSQL |
||||
check_function_shippable |
控制是否检查自定义plpgsql/SQL函数的属性。该选项仅8.3.0及以上集群版本支持。
例如:设置此参数时,以下场景下会执行报错:
|
ORA TD MYSQL |
||||
enable_full_string_agg |
控制string_agg(a, delimeter) over (partition by b order by c)场景行为,采用窗口内的全量聚合逻辑还是增量聚合逻辑。该参数8.3.0及以上集群版本支持。 不设置此选项时,采用增量聚合逻辑。设置此选项时,采用窗口内的全量聚合逻辑。默认不设置此选项。
|
ORA TD MYSQL |
||||
enable_banker_round |
控制数值类型舍入行为使用四舍五入还是银行家算法。该选项仅8.3.0及以上集群版本支持。 受到参数控制的行为包括:
说明:
银行家算法舍入规则:舍入位后的值大于5时,进位;舍入位后的值小于5时,不进位;舍入位后的值等于5时,如果前一位为偶数则不进位,如果前一位为奇数则进位。
SET behavior_compat_options = enable_banker_round; SELECT 1.5::int1,1.5::int2,1.5::int4,1.5::int8,1.5::numeric(10,0),1.115::money; int1 | int2 | int4 | int8 | numeric | money ------+------+------+------+---------+------- 2 | 2 | 2 | 2 | 2 | $1.12 SELECT 0.5::int1,0.5::int2,0.5::int4,0.5::int8,0.5::numeric(10,0),1.105::money; int1 | int2 | int4 | int8 | numeric | money ------+------+------+------+---------+------- 0 | 0 | 0 | 0 | 0 | $1.10 SELECT round(1.05,1),round(1.15,1),cast('1.05',numeric(10,1)),cast('1.15',numeric(10,1)),to_char(1.05,'9D9'),to_char(1.15,'9D9'); round | round | numeric | numeric | to_char | to_char -------+-------+---------+---------+---------+--------- 1.0 | 1.2 | 1.0 | 1.2 | 1.0 | 1.2
SET behavior_compat_options = ''; SELECT 1.5::int1,1.5::int2,1.5::int4,1.5::int8,1.5::numeric(10,0),1.115::money; int1 | int2 | int4 | int8 | numeric | money ------+------+------+------+---------+------- 2 | 2 | 2 | 2 | 2 | $1.12 SELECT 0.5::int1,0.5::int2,0.5::int4,0.5::int8,0.5::numeric(10,0),1.105::money; int1 | int2 | int4 | int8 | numeric | money ------+------+------+------+---------+------- 1 | 1 | 1 | 1 | 1 | $1.11 SELECT round(1.05,1),round(1.15,1),cast('1.05',numeric(10,1)),cast('1.15',numeric(10,1)),to_char(1.05,'9D9'),to_char(1.15,'9D9'); round | round | numeric | numeric | to_char | to_char -------+-------+---------+---------+---------+--------- 1.1 | 1.2 | 1.1 | 1.2 | 1.1 | 1.2 |
ORA TD MYSQL |
||||
enable_int_division_by_truncate |
控制整数除法行为结果集输出整数还是浮点数,行为兼容PG或者兼容ORA。
|
ORA TD MYSQL |
||||
unsupported_set_function_case |
控制是否支持case when条件中含有返回为多结果集函数。该选项仅8.3.0.100及以上集群版本支持。9.1.0及以上集群版本之后新安装的集群默认开启该参数。
|
ORA TD MYSQL |
||||
enable_change_search_path |
控制在形成通用计划generic_plan后能否修改搜寻路径。该选项仅9.1.0及以上集群版本支持。
|
TD |
||||
enable_varchar_to_nvarchar2 |
控制通过DDL语句创建及更新的varchar字段是否自动切换为nvarchar2字段。该选项仅9.1.0及以上集群版本支持。
|
ORA TD MYSQL |
||||
normalize_negative_zero |
控制ceil(),round()函数在处理float类型特定值时返回-0与否。该参数仅8.1.3.333及以上集群版本支持。
|
ORA TD MySQL |
||||
disable_client_detection_commit |
控制在每次事务提交之前,检测与客户端的连接是否存在。如果不存在,则报错,回滚该事务,防止因断连未感知重复下发导致的数据重复问题。该参数仅8.1.3.333及以上集群版本支持。
|
ORA TD MySQL |
||||
change_illegal_char |
控制gds读取UTF8非法字符的显示问题。该选项仅8.3.0.100及以上集群版本支持。 该选项打开时,gds读取到UTF8不兼容的非法字符从“?”变为显示“�”。 |
MySQL |
||||
row_use_pseudo_name |
控制row相关表达式是否对匿名列生成伪列名。该参数仅9.1.0.100及以上集群版本支持。
|
ORA TD MySQL |