GUC参数说明
dolphin.sql_mode
取值范围:字符串
默认值:'sql_mode_strict,sql_mode_full_group,pipes_as_concat,ansi_quotes,no_zero_date,pad_char_to_full_length,auto_recompile_function,error_for_division_by_zero'
参数说明:参数值为逗号间隔的字符串,仅允许合法字符串设定,不合法情况下,启动后报warning。同样,设置时候,如果新值非法,则报warning并且不修改老值。当前有几种场景会用到sql_mode:
-
sql_mode_strict:严格模式控制openGauss在执行会产生数据变化的SQL时(如INSERT、UPDATE、DELETE等),如何处理无效值或者空值。插入不符合当前列类型的值时,会进行数据转换;分两种场景,insert into table values(…) 和insert into table select … 主要涉及到各种数据类型之间的互相转换,目前涉及的类型有tinyint[unsigned],smallint[unsigned],int[unsigned],bigint[unsigned],float,double,numeric,clob,char和varchar;
-
sql_mode_strict:插入的列值长度超过此列所限定的长度时,赋予该列最大或最小值,涉及的类型有tinyint[unsigned],smallint[unsigned],int[unsigned],bigint[unsigned],float,double,numeric,clob,char和varchar;
-
sql_mode_strict:insert时,属性是非空且没有默认值的列,且没有在insert的列表中,则为其添加默认值;(涉及的类型同上面sql_mode_strict的描述)
-
sql_mode_strict:支持对属性是非空且没有默认值的列显式插入default;(涉及的类型同上面sql_mode_strict的描述)
-
sql_mode_strict:关闭时,支持对属性是非空的列插入NULL值。具体行为受sql_ignore_strategy控制,overwrite_null时插入默认值,ignore_null时忽略该行;且仅在非显式插入单行NULL值生效。(涉及的类型同上面sql_mode_strict的描述)
-
sql_mode_strict:对于不会改变数据的SQL语句,如
SELECT
,在严格模式下处理无效值或者空值时仅产生告警,不会报错。效果等同于没有开启严格模式。 -
sql_mode_full_group:
- 出现在select列表中的列(不使用聚合函数),是否一定要出现在group by子句中。当处在sql_mode_full_group模式(默认模式)下,如果select列表中的列没有使用聚合函数,也没有出现在group by子句,那么会报错,如果不在此模式下,则会执行成功,并在所有符合条件的元组中选取第一个元组。
- 出现在order by中的列,是否一定要出现在distinct中(注意是distinct,不是distinct on)。当处在sql_mode_full_group模式(默认模式)下,不允许没有出现在distinct中的列出现在order by子句中,否则允许。
-
pipes_as_concat:控制 || 当成连接符还是或操作符
-
ansi_quotes:主要是针对出现在各种需要使用双引号表示字符串值的地方。当ansi_quotes打开,就表示此时的双引号中的内容要作为对象引用看待;当ansi_quotes关闭时,表示双引号中的内容要作为字符串的值看待。
-
no_zero_date:控制 '0000-00-00' 是否为合法日期,支持DATE、DATETIME类型
参数 表现 no_zero_date, sql_mode_strict 非法日期,报错(使用update/insert ignore时告警) no_zero_date 非法日期,告警 sql_mode_strict 合法日期,无告警 -- 合法日期,无告警 -
pad_char_to_full_length:控制char类型查询时是否删除尾部空格。
-
auto_recompile_function:控制严格模式下,在执行会产生数据变化的SQL时(如INSERT、UPDATE、DELETE等),如果SQL中包含用户自定义的存储过程或函数,是否自动对存储过程或函数进行重编译,自动重编译能够让opengauss正确处理存储过程或函数中的无效值,但是对存储过程或函数的执行性能会带来一定的影响。
-
error_for_division_by_zero:控制除数为0时是否报错(包含
/
,mod
,div
等除法含义的操作符),最终除0的表现还受严格模式的控制。参数 表现 error_for_division_by_zero, sql_mode_strict 除数为0,在SELECT场景下告警,其余场景报错 error_for_division_by_zero 除数为0,告警 sql_mode_strict 除数为0,无报错,无告警 -- 除数为0,无报错,无告警 -
block_return_multi_results: 控制在使用CALL语法调用存储过程时,存储过程中可以使用select语句进行查询并返回查询语句的结果。当不设置此参数时,存储过程中的查询语在执行时会报错,开启参数后,可以正常执行并立刻返回此查询语句的结果集,不等待存储过程执行完毕。开启后,使用CALL语法调用存储过程时,限制出参必须为用户自定义变量的格式。
-
treat_bxconst_as_binary: 控制b''、x''字符串在词法分析时的默认类型。当设置此参数时,将b''、x''数据作为binary类型进行存储和使用。当不设置此参数时,将b''、x''数据作为bit类型进行存储和使用。
语句 不设置treat_bxconst_as_binary表现 设置treat_bxconst_as_binary表现 Mysql表现 select b'110010' 50 '2' 2 select conv(b'110010', 16, 10) 50 2 2 select b'110010' + 1; 51 3 51 create table t_bit(a bit(16));
insert into t_bit values(b'11001000110010');
select conv(a, 16, 10) from t_bit;12850 34 12850 -
not_escape_zero_in_binary:对于binary类型是否取消将\0字符转义成\000字符输出,该参数只影响JDBC的输出结果,具体表现如下所示:
select cast('2024' as binary(10)) --开启not_escape_zero_in_binary时候的输出结果结果如下: 32303234000000000000 --关闭not_escape_zero_in_binary时候的输出结果结果如下: 323032345C3030305C3030305C3030305C3030305C3030305C303030
该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。