金仓Oracle兼容模式大小写敏感、字段有大小写

报错原因(金仓Oracle兼容模式大小写敏感)

你建表时字段用双引号 定义:"C_IsValid",金仓 Oracle 模式下:

  1. 带双引号创建的标识符严格区分大小写
  1. 不加双引号写 a.C_IsValid,数据库会自动转小写 a.c_isvalid,匹配不到字段,直接报列不存在;
  1. 提示也明确告诉你:应该引用 "a.C_IsValid"。

错误 SQL

|-------------------------------------------------------|
| sql SELECT * FROM t_channel a WHERE a.C_IsValid = 1; |

数据库自动转小写识别为 a.c_isvalid,和真实字段 "C_IsValid" 大小写不匹配。

正确写法(两种任选)

方式 1:给字段加上双引号(推荐,完全匹配建表大小写)

|--------------------------------------------------------------------------|
| sql SELECT * FROM "pobo_sms_new"."t_channel" a WHERE a."C_IsValid" = 1; |

方式 2:查询时表 + 字段全部双引号包裹(规范写法)

|--------------------------------------------------------------------------|
| sql SELECT * FROM "pobo_sms_new"."t_channel" a WHERE a."C_IsValid" = 1; |

根源说明

  1. 建表语句使用 "C_IsValid" 双引号字段名 → 标识符大小写固定
  1. 不加双引号的标识符,金仓 / Oracle 会统一转为小写;
  1. MySQL 反引号不区分大小写,迁移到金仓 Oracle 模式很容易踩这个坑。

长期规避方案(推荐重建表,去掉双引号)

如果不需要大小写区分,重新建表时删除所有双引号,字段名正常写,查询不用加引号:

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql DROP TABLE IF EXISTS "pobo_sms_new"."t_channel"; CREATE TABLE "pobo_sms_new"."t_channel" ( C_ID bigint GENERATED BY DEFAULT AS IDENTITY COMMENT '自增主键', C_OrgID integer NOT NULL DEFAULT 0, C_ChannelName character varying(32 char) NOT NULL, C_Username character varying(32 char) NULL, C_Password character varying(1024 char) NULL, C_Url character varying(255 char) NULL, C_priority bigint NOT NULL DEFAULT 0, C_IsValid smallint NOT NULL DEFAULT 1, C_packageName character varying(50 char) NULL, C_report integer NULL DEFAULT 0, seque integer NULL, CONSTRAINT "PRIMARY_idx2" PRIMARY KEY ("C_ID") ); |

重建后,下面不带双引号的 SQL 就能正常执行:

|----------------------------------------------------------------------|
| sql SELECT * FROM "pobo_sms_new".t_channel a WHERE a.C_IsValid = 1; |