操作系统: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的书写习惯。