GBase 8s:DELIMIDENT 如何控制大小写敏感性
发布: (2026年5月4日 GMT+8 18:22)
3 分钟阅读
原文: Dev.to
Source: Dev.to
DELIMIDENT 演示
设置环境变量 DELIMIDENT=y 并执行以下语句:
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));
INSERT INTO "tab04" VALUES(1, 't xiao xie');
-- 不使用双引号,会与小写表冲突(错误 310)
CREATE TABLE tab04 (id INT, name VARCHAR(20)); -- 失败
!
在系统目录中验证表
SELECT tabname FROM systables WHERE tabname LIKE '%ab04%';
-- 返回:tab04 和 Tab04(显示时没有引号,但可区分)
DELIMIDENT=y 时的查询行为
未加引号或使用小写引号的引用都会解析为小写表 tab04:
SELECT * FROM Tab04; -- → tab04
SELECT * FROM tab04; -- → tab04
SELECT * FROM "tab04"; -- → tab04
只有完全匹配的大写双引号名称才能访问大写表:
SELECT * FROM "Tab04"; -- → Tab04
取消 DELIMIDENT 后
unset DELIMIDENT
dbaccess -e testdb <<!
SELECT * FROM Tab04; -- → tab04(仍然可用)
SELECT * FROM tab04; -- → tab04
SELECT * FROM "tab04"; -- 错误 201
SELECT * FROM "Tab04"; -- 错误 201
!
取消 DELIMIDENT 后,使用双引号包裹标识符会非法,使大写表不可访问。
DELIMIDENT 配置
| 值 | 描述 |
|---|---|
| y(OLE DB、.NET 的默认) | 单引号 '...' 表示字符串字面量;双引号 "..." 表示 SQL 标识符,且区分大小写。 |
| n(ESQL/C、JDBC、ODBC 的默认) | 单引号和双引号都表示字符串字面量。双引号标识符不被允许(错误 201)。例外情况:单引号可用于限定所有者名称。 |
| 未设置 | 行为遵循驱动的默认设置(例如 ESQL/C 默认 n)。 |
推荐做法
GBase 8s 没有提供在不使用双引号的情况下实现区分大小写标识符的方式。请使用 DELIMIDENT=y,并始终按创建时的大小写精确书写标识符。这可以确保行为可预期,避免在 GBase 环境中出现静默的数据访问错误。