控制双引号内标识符的大小写解析
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