暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

磐维数据库_A模式下大小写敏感相关参数介绍及实战

原创 磐维数据库 2025-06-30
462

案例背景

某省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,与oracl行为一致。

             例如: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数据库特性。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论