VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

vastbase_sql_mode

功能描述

Vastbase在MySQL兼容模式下,支持使用GUC参数vastbase_sql_mode控制B兼容下的语法校验规则。

该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。

默认值

ONLY_FULL_GROUP_BY,ANSI_QUOTES,pipes_as_concat,pad_char_to_full_length

注意事项

  • 该功能仅在数据库兼容模式为MySQL时支持(即数据库初始化时指定DBCOMPATIBILITY='B')。
  • 仅在MySQL兼容模式下校验此参数。在其他兼容模式下修改此参数值并不会报错,但修改不会生效。
  • 若将此参数取值设为空字符串,则表示不启用任何相关特性。
  • 参数值由若干个配置项用逗号隔开构成,例如:set vastbase_sql_mode='only_full_group_by,sql_mode_strict';

取值范围

字符串,仅允许合法字符串设定。参数值由若干个配置项用逗号隔开构成。

表1 vastbase_sql_mode取值范围

取值 说明 用法参考
ONLY_FULL_GROUP_BY 应用于下列两种场景:
  • 出现在select列表中的列,一定要出现在group by子句中。
  • 出现在order by中的列,一定要出现在select distinct中。
  • SELECT
    ANSI_QUOTES 主要是针对出现在各种需要使用双引号表示字符串值的地方。
  • 当ansi_quotes打开,就表示此时的双引号中的内容要作为对象引用看待。
  • 当ansi_quotes关闭时,表示双引号中的内容要作为字符串的值看待。
  • 双引号解释为标识符
    SQL_MODE_STRICT 在为字段设置UNSIGNED属性后,限制插入的列值正负和长度。涉及的类型有tinyint、smallint、int、integer、bigint、mediumint。 COLUMN定义支持UNSIGNED属性
    pipes_as_concat 控制||被当成连接符还是或操作符。
  • 当pipes_as_concat打开,表示||被当成连接符。
  • 当pipes_as_concat关闭,表示||被当成操作符。
  • 参考示例1。
    pad_char_to_full_length 控制char类型查询时是否删除尾部空格。
  • 当pad_char_to_full_length打开,就表示char类型查询时尾部空格不会被删除。
  • 当pad_char_to_full_length关闭,就表示char类型查询时尾部空格会被删除。
  • 参考示例2。
    no_zero_date 控制 '0000-00-00' 是否为合法日期,支持DATE、DATETIME类型。取值及表现如下所示:
  • no_zero_date, sql_mode_strict:非法日期,报错(使用update/insert ignore时告警)
  • no_zero_date:非法日期,告警
  • sql_mode_strict:合法日期,无告警
  • –:合法日期,无告警
  • 参考示例3。

    示例

    示例1: pipes_as_concat选项效果展示。

    1、创建测试表。

    create table test1(a int,b int);
    

    2、设置GUC参数vastbase_sql_mode = ''

    SET vastbase_sql_mode='';
    

    3、向表中插入数据。

    insert into test1 values(1||2,2);
    

    4、查询test1表数据。

    select * from test1;
    

    返回结果为:

     a | b
    ---+---
     1 | 2
    (1 row)
    

    5、设置GUC参数vastbase_sql_mode = 'pipes_as_concat',并查询结果。

    set vastbase_sql_mode = 'pipes_as_concat';
    show vastbase_sql_mode;
    

    返回结果为:

    vastbase_sql_mode
    -------------------
     pipes_as_concat
    (1 row)
    

    6、向表中插入数据。

    insert into test1 values(1||2,2);
    

    7、查询test1表数据。

    select * from test1;
    

    如下所示,由于vastbase_sql_mode参数包含pipes_as_concat选项,因此|| 的功能从或运算改为字符串拼接:

     a  | b
    ----+---
      1 | 2
     12 | 2
    (2 rows)
    

    示例2: pad_char_to_full_length选项效果展示。

    1、创建测试表。

    create table t1(x char(5),y varchar(5));
    

    2、向表格中插入数据(char存储5个字符,而varchar存储4个字符)。

    insert into t1 values('数据库  ','数据库 ');
    

    3、设置GUC参数vastbase_sql_mode = ''

    SET vastbase_sql_mode='';
    

    4、查询表中存储数据的长度。

    select x,char_length(x),y,char_length(y) from t1;
    

    如下所示,char类型数据会把尾部空格删除,而varchar不会:

        x     | char_length |    y    | char_length
    ----------+-------------+---------+-------------
     数据库   |           3 | 数据库  |           4
    (1 row)
    

    5、设置GUC参数vastbase_sql_mode = 'pad_char_to_full_length',并查询结果。

    set vastbase_sql_mode = 'pad_char_to_full_length';
    show vastbase_sql_mode;
    

    返回结果为:

        vastbase_sql_mode
    -------------------------
     pad_char_to_full_length
    (1 row)
    

    6、再次查询表中存储数据的长度。

    select x,char_length(x),y,char_length(y) from t1;
    

    如下所示,由于vastbase_sql_mode参数包含pad_char_to_full_length选项,因此char类型数据尾部空格不会被自动删除:

        x     | char_length |    y    | char_length
    ----------+-------------+---------+-------------
     数据库   |           5 | 数据库  |           4
    (1 row)
    

    示例3: no_zero_date选项效果展示。

    1、设置GUC参数vastbase_sql_mode = 'no_zero_date',并查询结果。

    set vastbase_sql_mode = 'no_zero_date';
    show vastbase_sql_mode;
    

    返回结果为:

     vastbase_sql_mode
    -------------------
     no_zero_date
    (1 row)
    

    2、创建测试表。

    CREATE TABLE my_table_1160646 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    date_column DATE
    );
    

    3、插入数据。

    INSERT INTO my_table_1160646 (date_column) VALUES ('2022-01-01');
    INSERT INTO my_table_1160646 (date_column) VALUES ('0000-00-00');
    

    由于设置了vastbase_sql_mode = 'no_zero_date',因此'0000-00-00'为非法日期,插入成功但发出告警,返回结果如下:

    INSERT 0 1
    
    WARNING:  date/time field value out of range: "0000-00-00"
    LINE 1: ...NSERT INTO my_table_1160646 (date_column) VALUES ('0000-00-0...
                                                                 ^
    CONTEXT:  referenced column: date_column
    INSERT 0 1
    

    4、设置GUC参数vastbase_sql_mode = 'sql_mode_strict',并查询结果。

    set vastbase_sql_mode = 'sql_mode_strict';
    show vastbase_sql_mode;
    

    返回结果为:

    vastbase_sql_mode
    -------------------
     sql_mode_strict
    (1 row)
    

    5、再次插入日期'0000-00-00'。

    INSERT INTO my_table_1160646 (date_column) VALUES ('0000-00-00');
    

    插入成功,返回结果如下:

    INSERT 0 1
    

    6、查询表内容。

    select * from my_table_1160646;
    

    返回结果为:

     id | date_column
    ----+-------------
      1 | 2022-01-01
      2 | 0000-00-00
      3 | 0000-00-00
    (3 rows)