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 环境中出现静默的数据访问错误。

0 浏览
Back to Blog

相关文章

阅读更多 »