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

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

原创 小柒 2025-06-13
373

案例背景

某省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模式下,磐维数据库默认是对象名称(如表名、视图名、列名等)不区分大小写的,数据库都会将其存储为小写。

48267648998dbda96bcc767647dff9f

如果源端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数据库特性。

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

评论