案例背景
某省GCM系统业务替换
环境描述
OS:bclinux-euler 21.10
数据库版本:S3.1.1_B01
兼容模式:A
数据库架构:集中式主备
描述
在Oracle中,对象名称(如表名、视图名、列名等)的大小写敏感取决于数据库的创建方式以及数据库的模式。Oracle 支持两种主要的数据库模式:Oracle 传统模式(Oracle Traditional Mode)和 Oracle 大小写敏感模式(Oracle Case Sensitive Mode)。当Oracle是11.x、10.x或更早的版本,数据库通常是传统模式;当Oracle 12C开始,默认是大小写敏感模式,但在某些配置下仍然可以使用传统模式。当然,Oracle在绝大部分应用场景下,都是使用传统模式,对象名不区分大小写,总是存储为大写。
Oracle 传统模式
- 对象名称在数据库中默认是大写的,在创建时使用小写或混合大小写,Oracle 会自动将其转换为大写。
例如:
CREATE TABLE mytable (id NUMBER);
创建表时使用 mytable、MyTable 、MYTABLE,Oracle 都会将其存储为 MYTABLE。
- 在创建对象时,通过双引号可以区分大小写。
例如:
CREATE TABLE “mytable” (id NUMBER);
CREATE TABLE “MyTable” (id NUMBER);
CREATE TABLE “MYTable” (id NUMBER);
创建表通过有双引号后,Oracle 会分别将其存储为保留双引号内形式。
Oracle 大小写敏感模式
在 Oracle 大小写敏感模式中,对象名称在数据库中是大小写敏感的,在使用前,必须严格区分大小写来引用这些对象。
要切换到大小写敏感模式,通常需要在创建数据库时指定 DB_CASE_SENSITIVE 参数,或者在初始化参数文件中设置 compatible 参数为早期版本(如 11.2.0.2.0)。
- DB_CASE_SENSITIVE参数必须在创建数据库时通过CREATE DATABASE语句指定,或在初始化参数文件(如spfile或pfile)中设置。
- 数据库创建后,该参数无法动态修改,若需切换大小写敏感模式,必须重建数据库。
问题
场景一:通过DTP工具在迁移表对象过程中(Oracle->panweidb),发现源端Oracle对象名称存在大小写敏感,导致迁移失败。
场景二:在SQL中,列名或列别名的大小写显示问题测试验证。
无双引号 别名:自动转为小写
例如:SELECT col_name AS my_col,显示为my_col,与 oracle 行为不一致。
For oracle:
For panwei:
有双引号 全大写、大小写、混合别名:保留双引号内形式
例如: SELECT col_name AS “my_col” ,显示为my_col,与 oracle 行为一致。
例如: SELECT col_name AS “MY_COL” ,显示为MY_COL,与 oracle 行为一致。
例如: SELECT col_name AS “My_Col” ,显示为My_Col,与 oracle 行为一致。
For oracle:
For panwei:
分析
场景一:通过DTP工具在迁移表对象过程中(Oracle->panweidb),发现源端Oracle对象名称存在大小写敏感,导致迁移失败。
在磐维数据库中,在A模式(兼容oracle模式)下,数据库参数lower_case_table_names、lower_case_column_names等不能使用该特性,只有在B模式(兼容MySQL模式)下,该参数控制表名的大小写敏感特性。在A模式下,磐维数据库默认是对象名称(如表名、视图名、列名等)不区分大小写的,数据库都会将其存储为小写。
如果源端Oracle数据库区分大小写,在DTP工具迁移任务配置可以选择区分大小写(即通过增加””的方式),这样就能保证磐维目标库对象名称(如表名、视图名等)区分大小写。
场景二:在SQL中,列名或列别名的大小写显示问题测试验证。
在磐维数据库中,在A模式(兼容oracle模式)下,数据库内核参数result_case_mode、uppercase_attribute_name、enable_ignore_ident_case等对别名等字段大小写影响。
result_case_mode(仅a模式支持)
可选值:lower(默认)、upper
参数说明: 用于控制返回字段名的大小写。
【须知】
该功能仅在数据库兼容模式为 Oracle 时能够使用(即创建 DB 时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。
该参数只影响返回字段名的大小写形式,不影响 PanWeiDB 原有的大小写匹
配逻辑。
该参数在 postgresql.conf 文件中配置无效,仅支持在会话中配置。
取值范围: 枚举类型
lower:参数初始化取值,未使用引号指定的字段名及别名返回纯小写形式,
否则返回引号指定形式。
upper:未使用引号指定的字段名及别名返回纯大写形式,否则返回引号指
定形式。
uppercase_attribute_name(仅a模式支持)
可选值:off(默认)、on
参数说明:设置列名以大写形式返回给客户端。
取值范围:布尔型
on:表示开启列名以大写形式返回够客户端
off:表示关闭列名以大写形式返回够客户端
enable_ignore_ident_case
可选值:off(默认)、on
参数说明:为了对Oracle的大小写解析特性进行兼容,用于控制双引号内标识符的大小写解析逻辑。
取值范围:布尔型
on:语法解析阶段,表名、字段名等标识符会置为小写。
off:语法解析阶段,不对大小写进行处理,根据原始逻辑进行解析。
无双引号别名:自动转为小写,受参数result_case_mode控制,默认lower,在未使用引号下,统一控制返回字段名的小写,当会话级设成upper,统一控制返回字段名的大写。
有双引号的全大写、大小写、混合别名,受参数enable_ignore_ident_casee控制,默认off,在使用引号下,统一控制返回字段名的保留双引号内形式,当设成on,统一控制返回字段名的小写。
补充:PanWeiDB JDBC参数介绍
在 PanWeiDB 的 JDBC 驱动中,resultCaseMode 参数用于指定查询结果中字段名的大小写敏感性处理方式。PanWeiDB V2.0.0 JDBC 版本已增加 db_compatibility 连接参数属性,建议使用 2.0 及以上版本的驱动。通过设置不同的db_compatibility参数,可以调整数据库的兼容性,以满足不同数据库系统的需求。例如,当设置为oracle时,可以使得PanWeiDB的行为更接近Oracle数据库,从而在使用兼容Oracle的应用时减少兼容性问题。
db_compatibility
该参数主要用于设置返回的对象名大小写以及一些兼容特性。可选值:postgresql (默认)、 oracle 和 mysql 。
postgresql:这是默认值,表示返回的对象名大小写处理方式与PostgreSQL一致。
oracle:表示返回的对象名大小写处理方式与Oracle数据库一致。
mysql:表示返回的对象名大小写处理方式与MySQL数据库一致。
resultCaseMode
可选值:lower(默认)、upper
作用:设置当前连接的 result_case_mode 内核参数
upper: 将所有结果集中的列名转换为大写。
lower: 将所有结果集中的列名转换为小写。
总结
在ORACLE迁移磐维数据库过程中,面对数据库的对象名称(如表名、视图名、列名等)的大小写敏感的场景,及时合理使用数据库内核参数和JDBC相关参数,避免业务后知后觉,提前规避,更好的兼容Oracle数据库特性。




