达梦大小写敏感参数CASE_SENSITIVE详测及DTS迁移注意事项

操作系统:CentOS7.6

数据库:DM8 -20240703

一、概述

        使用dminit命令创建数据库时,可以设置大小写敏感参数CASE_SENSITIVE,建库成功后参数值不可修改。CASE_SENSITIVE参数对数据库会产生那些影响呢,为了方便比对,我们创建2个库,分别将CASE_SENSITIVE参数设置为1(敏感),0(不敏感),为了方便讨论,我们称之为“敏感库”“不敏感库”。下面我们一起比对一下。

二、创建实验数据库

        1、敏感库

           创建数据库PROD1,实例名TEST1, PORT_NUM=5238, CASE_SENSITIVE=1。

/dm8/dmdbms/bin/dminit PATH=/dm8/data DB_NAME=PROD1 INSTANCE_NAME=TEST1 PORT_NUM=5238 CASE_SENSITIVE=1

        2、不敏感库

        创建数据库PROD2,实例名TEST2, PORT_NUM=5239, CASE_SENSITIVE=0。

/dm8/dmdbms/bin/dminit PATH=/dm8/data DB_NAME=PROD2 INSTANCE_NAME=TEST2 PORT_NUM=5239  CASE_SENSITIVE=0 

        3、启动数据库

        “敏感库”启动

        dmserver path=/dm8/data/PROD1/dm.ini    

        “不敏感库”启动

        dmserver path=/dm8/data/PROD2/dm.ini    

三、字符串 比较

1、敏感库

1)登录敏感库

disql SYSDBA/SYSDBA@127.0.0.1:5238

2)确认参数设置 

select SF_GET_CASE_SENSITIVE_FLAG();

 值是1,代表大小写敏感。

3)字符串比较

select 1 from dual where 'a'='A';

       我们看到,在大小写敏感的数据库中,字符串'a'='A'不成立。

2、不敏感库

1)登录数据库

disql SYSDBA/SYSDBA@127.0.0.1:5239

2)确认参数设置 

select SF_GET_CASE_SENSITIVE_FLAG();

3)字符串比较

select 1 from dual where 'a'='A';

在不敏感的数据库中,字符串'a'='A'成立

三、表名、字段名的大小写敏感

        1、测试方案

        在大小写敏感数据库中,分别创建4张表。例如tb_test,TB_TEST,TB_test,"tb_TEST"。

        这4张表的特点分别是:表tb_test是纯小写表名、表TB_TEST是纯大写表名、表TB_test大小写混合表名、表"tb_TEST"是加双引号的大小写混合表名。

        2、敏感库

        依次创建测试用的4张表

        1)“小写字母”建表tb_test

        

create table tb_test
(c1 int,
c2 varchar2(10));

上面的建表sql中,表名和字段名都是小写。

用SP_TABLEDEF查看表的定义语句:

SP_TABLEDEF('SYSDBA','tb_test');

        我们用小写创建tb_test,用小写表名却查询不到表的定义,这是因为当设置为“大小写敏感”时,系统会将表名转换为大写之后再保存。

        我们把表名改为大写再查询一次

SP_TABLEDEF('SYSDBA','TB_TEST');

        果然,表名和字段名都转换成大写了。

        按这个结果,我们可以预见,接下来,表名是大写字母的TB_TEST,大小写字母混合TB_test是不能创建成功的。

        2)“大写字母”建表TB_TEST

        

create table TB_TEST
(C1 int,
C2 varchar2(10));

提示,TB_TEST已存在,符合预期。

3)“大小写混合”建表TB_test

create table TB_test
(c1 int,
C2 varchar2(10));

提示,TB_TEST已存在,符合预期。

4) “大小写混合且表名加双引号”建表“tb_TEST”

create table "tb_TEST"
("c1" int,
c2 varchar2(10));

建表成功

用SP_TABLEDEF查看表的定义语句:

        表名“tb_TEST”和字段名"c1",建表时用双引号括起,按原大小写 保存到数据字典中。字段c2没有括起,转换为大写后,保存到数据库中。

  查看“tb_TEST”、TB_TEST

INSERT INTO "tb_TEST" VALUES(1,'TEST');
SELECT * FROM "tb_TEST";

库中有两张表“tb_TEST”与TB_TEST

5)小结

        在大小写敏感的数据库中,字段名、表名用双引号括起后是区分大小写的;没有双引号括起的都会转换成大写,不区分大小写。

3、不敏感库

        顺序创建4张表:表tb_test是小写表名、表TB_TEST是纯大写表名、表TB_test大小写混合表名、表"tb_TEST"是加双引号的大小写混合表名。

        我们预期,只有第一张表能创建成功,其他3张表会提示“表已存在”。

        开始测试

 

        在大小写不敏感数据库中,不管是否有双引号括起,表名和字段名完全不区分大小写。系统会把标识符转换为小写保存到数据字典中,或者转换后比对。    

四、测试总结

1、字符串比较

参数配置参数值例子
敏感CASE_SENSITIVE=1'a'='A'不成立
不敏感CASE_SENSITIVE=0'a'='A'不成立

2、表名、字段名的大小写敏感

配置参数值结论
敏感CASE_SENSITIVE=1

1、对象名称加上双引号,区分大小写。例如“tb_TEST”与“tb_test”是2张表

2、不加双印号,对象名称全部转换为大写。例如:TB_TEST、tb_test、TB_test是一张表,相当于双引号括起的"TB_TEST"。

3、字段的敏感规则同上。

不敏感CASE_SENSITIVE=0对象名称完全不区分大小写。例如:TB_TEST、tb_test、TB_test及双引号括起的"tb_TEST"是一张表。

3、技术手册

技术手册中初始化参数CASE_SENSITIVE的说明

五、DTS迁移注意事项

    1、问题

        异构数据库向DM8迁移,使用DTS工具,迁移选项中是否应该勾选“保持对象名大小写”?

2、案例分析    

        案例1

        源数据库中,“字符串比较”是大小写敏感的,表名小写或部分表名小写。这种情况迁移时是否应该勾选“保持对象名大小写”?

        方案:不勾选

        原因:源数据库中“字符串比较”是敏感的,DM8的参数应当配置 为“敏感”。假如勾选了“保持对象名大小写”,我们迁移所有小写对象(模式、表、字段)在DM8上使用时都要加上双引号。

        例如,select * from "db_test3"."tb_test3"能正常查询;select * from db_test3.tb_test3去掉双引号,报找不到对象错误。

        对象名称用双引号括起,虽然能区分对象名称大小写。但是不符合应用系统的书写习惯。也会导致应用系统启动时因找不到对象,无法正常运行。    

        测试如下:

案例2

        源数据库中,“字符串比较”大小写不敏感的,表名有大写也有小写。是否应该勾选“保持对象名大小写”?

        方案:可以勾选、也可以不勾选,都不会影响应用运行。

        原因:源数据库中“字符串比较”是不敏感的,DM8的参数应当配置 为“不敏感”。无论是否勾选“保持对象名大小写”,DM8中查询SQL都不需要在表名上加双引号,符合应用系统SQL的书写习惯。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值