DB2 on Cloud模式名含末尾空格的两类技术问题咨询
DB2 on Cloud模式名带空格及查询兼容问题解答
用户在DB2 on Cloud中遇到以下情况:通过db2look或DBeaver生成的DDL显示模式名带有末尾空格,DDL代码如下:
CREATE TABLE "DBS_AA "."TABLE1" ( "ID" INTEGER NOT NULL , "DATE" DATE )
但以下三种写法的SELECT语句均能正常执行:
SELECT * FROM "DBS_AA "."TABLE1" SELECT * FROM "DBS_AA"."TABLE1" SELECT * FROM DBS_AA.TABLE1
针对用户提出的两个问题,解答如下:
问题1:模式名末尾为何会存在空格
模式名末尾出现空格,通常是以下场景导致:
- 带引号创建模式:管理员执行创建模式的语句时使用了双引号包裹的限定标识符(比如
CREATE SCHEMA "DBS_AA "),DB2对带双引号的标识符会严格保留所有输入字符,包括末尾空格;如果是不带引号的语句创建,DB2会自动修剪首尾空格,不会留下空格。 - 工具/脚本操作失误:数据迁移脚本、自动化部署工具在处理模式名字符串时未做空格修剪,或者可视化工具创建对象时输入校验不足,导致空格被带入模式名。
- 迁移遗留问题:若数据库是从其他系统迁移而来,源系统中的模式名本身带有空格,迁移过程中直接保留了原始标识符格式。
问题2:为何不同写法的SELECT语句都能生效
这是DB2的标识符匹配规则导致的:
- 不带双引号的标识符:DB2会自动将其转换为大写,同时修剪首尾空白字符,再去匹配系统目录中的对象。因此
DBS_AA.TABLE1会被处理为无空格的大写标识符,最终能匹配到带空格的模式名。 - 带双引号的标识符:虽然DB2会保留限定标识符的原始字符,但在对象匹配阶段会忽略末尾的空格。因此
"DBS_AA"和"DBS_AA "会被视为同一个模式,对应的查询语句自然能正常执行。
内容的提问来源于stack exchange,提问作者GML-VS
相关产品推荐
相关产品推荐

