GBase8s开启DELIMIDENT=Y的意义
## 为了区分大小写,测试开启: DELIMIDENT=Y
```shell
export DELIMIDENT=y
dbaccess testdb <<!
create table "Tab04"(id int,name varchar(20));
insert into "Tab04" values(1,'T DA XIE');
create table "tab04" (id int,name varchar(20)); -- 这条sql和下面tab04表等价
insert into "tab04" values(1,'t xiao xie');
create table tab04 (id int,name varchar(20)); -- 这条sql会报错,和上面等价,报错310
insert into tab04 values(1,'t xiao xie');
!
export DELIMIDENT=y
dbaccess testdb<<!
select tabname from systables where tabname like '%ab04%'; -- 查询出来的表名正常(1大1小),都看不到引号包裹
!
export DELIMIDENT=y
dbaccess -e testdb<<!
select * from Tab04 ; --这3种写法都是查询小写的表
select * from tab04 ; --这3种写法都是查询小写的表
select * from "tab04" ; --这3种写法都是查询小写的表
select * from "Tab04" ; --只有这1种写法都是查询大写的表
!
unset DELIMIDENT
dbaccess -e testdb<<!
select * from Tab04 ; --查的是小写表
select * from tab04 ; --查的是小写表
select * from "tab04" ; --报错201
select * from "Tab04" ; --报错201
!
```
## 测试结论:
```log
1、 GBase8s默认不区分大小写,大写表名字段名都会认作小写。
如果需要大写表名字段名,需要开启DELIMIDENT=y,同时需要用引号包裹。未包裹都都是视为小写。
2、 如果unset DELIMIDENT,那么此时是不能查询到大写表的,会报201语法错误。
因为此时不支持引号包裹表名的语法,并且你也没有其他方法去查询这个表。
3、 GBase8s并没有完美的,不用引号包裹,就能区分大小写的用法。
这是因为8s本身是不区分大小写的,开启DELIMIDENT=y只是缓解了这一需求,用包裹双引号了实现了大小写区分。
```
## 正确的理解:DELIMIDENT环境变量
```log
DELIMIDENT环境变量:用于指定字符串采用双引号"包裹时,代表:SQL标识符 使用,还是代表 普通字符串 使用。
可以在客户端中设置这个环境变量,可设置为以下三种配置:
y(默认值,适用于OLE DB和.NET)
要求客户端应用程序:
使用单引号'包裹,代表:字符字符串
使用双引号"包裹,代表:SQL标识符(支持更广泛的字符集,大小写敏感)
n(默认值,适用于ESQL/C、JDBC、ODBC)
允许客户端应用程序:
使用单引号'或双引号",代表:字符字符串
禁止使用引号限定SQL标识符(若误用会报错201)
特例:限定SQL标识符的所有者名时可使用单引号
未设置值
要求客户端应用程序遵循其API的默认DELIMIDENT设置(例如ESQL/C底层API默认继承n行为)。
```
评论
热门帖子
- 12025-12-01浏览数:181974
- 22023-05-09浏览数:24027
- 42023-09-25浏览数:17270
- 52020-05-11浏览数:16409