VastbaseG100

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

Menu

控制双引号内标识符的大小写解析

enable_ignore_ident_case

参数说明: 为了对Oracle的大小写解析特性进行兼容,Vastbase提供了参数enable_ignore_ident_case用于控制双引号内标识符的大小写解析逻辑。

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

取值范围: 布尔型

  • on:语法解析阶段,表名、字段名等标识符会被置为小写。

  • off:语法解析阶段,不对大小写进行处理,根据原始逻辑进行解析。

默认值: off

  • 当enable_ignore_ident_case=on时,其作用效果与result_case_mode = upper的作用效果存在冲突,不建议这样使用。

  • 支持的版本:

    • V2.2 Build 10(Patch No.14)及以上补丁版本。

    • V2.2 Build 15及以上版本。

  • 下表对比展示了enable_ignore_ident_case参数的效果:

    数据库类型双引号输入解析
    Oracle小写小写
    大写大写
    Vastbase
    (enable_ignore_ident_case=on)
    小写小写
    大写小写
    Vastbase
    (enable_ignore_ident_case=off)
    小写小写
    大写大写

示例1

  • enable_ignore_ident_case为off时(默认):

    1、创建测试表并插入数据。表名、字段名使用小写字母,无双引号。

    create table name(id int, col text);
    insert into name values(1001,'vastbase');
    

    2、使用大写字母进行查询,对比是否使用双引号的区别。

    select ID,COL from NAME;        --大写字母,无双引号
    select "ID","COL" from "NAME";  --大写字母,有双引号
    

    无双引号时,查询成功:

    id    |   col
    ------+----------
    1001  | vastbase
    (1 row)
    

    使用带双引号的大写字母,查询失败。报错信息如下:

    ERROR:  relation "NAME" does not exist on node1
    LINE 1: select "ID","COL" from "NAME";
                                ^
    
  • enable_ignore_ident_case为on时:

    set enable_ignore_ident_case = on;
    

    1、创建测试表并插入数据。表名、字段名使用小写字母,无双引号。

    create table book(id int, author text);
    insert into book values(10976458,'MoYan');
    

    2、使用大写字母进行查询,对比是否使用双引号的区别。

    select ID,AUTHOR from BOOK;        --大写字母,无双引号
    select "ID","AUTHOR" from "BOOK";  --大写字母,有双引号
    

    开启参数后,标识符即使被双引号包裹,但仍被解析为小写字母,能够成功查询。上述两条查询语句的返回结果依次为:

        id    | author
    ----------+--------
    10976458  | MoYan
    (1 row)
    
        id    | author
    ----------+--------
    10976458  | MoYan
    (1 row)
    

    注意,若在开启参数前,已在数据库中创建了名为“BOOK”的表(解析为大写),那么开启参数后,则无法使用“BOOK”去匹配该表(解析为小写),为了避免此类情况的发生,请注意设置参数的时机。参考示例2

示例2

1、当参数enable_ignore_ident_case为off时(默认):

set enable_ignore_ident_case=off;
show enable_ignore_ident_case;

2、创建测试表并插入数据。表名使用双引号包围的大写字母。

create table "BOOK"(id int, name text);

3、向测试表插入数据并查看测试表内容,需使用双引号包围的大写字母。

insert into "BOOK" values(1001,'TheLittlePrince');
select * from "BOOK";

能够正常插入和查询,返回结果如下:

  id  |      name
------+-----------------
 1001 | TheLittlePrince
(1 row)

4、此时设置参数enable_ignore_ident_case为on:

set enable_ignore_ident_case=on;

5、再次向测试表插入数据时,以下写法均无法匹配之前创建的”BOOK”表:

insert into "BOOK" values (1003,'HarryPotter');
insert into BOOK values (1003,'HarryPotter');
insert into book values (1003,'HarryPotter');

均得到如下报错信息:

ERROR:  relation "book" does not exist on node1