一、检查数据库实例大小写敏感信息
1 获得大小写敏感信息
SELECT SF_GET_CASE_SENSITIVE_FLAG();
--1为大小写敏感,0为大小写不敏感
1
2
二、初始化数据库实例为大小写敏感库
sp_create_system_packages(1);
SELECT SF_GET_CASE_SENSITIVE_FLAG();
--1
1
2
3
2.1、DDL操作
create table test3(ID int,name char(20));
select dbms_metadata.get_ddl('TABLE','test3','SYSDBA') from dual;
--未找到对象或不允许查询系统定义的内部索引
select dbms_metadata.get_ddl('TABLE','TEST3','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."TEST3"
(
"ID" INT,
"NAME" CHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
1
2
3
4
5
6
7
8
9
10
create table test6(id int,"name" char(20));
select dbms_metadata.get_ddl('TABLE','TEST6','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."TEST6"
(
"ID" INT,
"name" CHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
create table "test1"(id int);
create table test1("id" int);
create table test2("id" int,id int);
1
2
3
4
5
6
7
8
9
10
11
12
select dbms_metadata.get_ddl('TABLE','test1','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."test1"
(
"ID" INT) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
1
2
3
4
5
6
select dbms_metadata.get_ddl('TABLE','TEST1','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."TEST1"
(
"id" INT) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
1
2
3
4
5
6
select dbms_metadata.get_ddl('TABLE','TEST2','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."TEST2"
(
"id" INT,
"ID" INT) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
1
2
3
4
5
6
7
总结:
大小写敏感的数据库中:
创建表时:
①如果不对表名或列名添加"",那么表名和列名都自动转换为大写形式;
②如果对表名或列名添加"",会固定书写时的大、小写形式,书写时采取的是小写形式,那么就定型为小写形式,其他不添加""的则自动转换为大写形式,无论书写时采取的是大写形式或小写形式。
③同名的数据库对象,如果大小写不同,那么则为两个不同的对象,字段同样如此;
④一个表中,即使是相同的字段名,只要大小写不同,允许存在同名且不同大小写形式的字段。
2.2、OTHERS操作
–创建
drop table test1;
create table test1(id int,name char(20));
1
2
--导出元数据
select dbms_metadata.get_ddl('TABLE','TEST1','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."TEST1"
(
"ID" INT,
"NAME" CHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
1
2
3
4
5
6
7
8
--进行DML操作
insert into sysdba.test1 values(1,'an');
update sysdba.test1 set id=100 where id=1;
delete from sysdba.test1 where id=100;
commit;
--4条语句执行成功
1
2
3
4
5
6
insert into sysdba.test1("id","name") values(1,'an');
--无效的列名[id]
update sysdba.test1 set id=100 where "id"=1;
--无效的列名[id]
delete from sysdba.test1 where "id"=100;
--无效的列名[id]
1
2
3
4
5
6
SUMMARY:
大小写敏感的数据库中:
DML或DSL操作时:
①如果不对表名或列名添加"",那么表名和列名都自动转换为大写形式;
②对表进行DML操作时,如果没有小写形式的字段,不能采取小写加"“的形式指定过滤字段,会被认定为无效的字段;
③如果对表名或列名添加”",会固定书写时的大、小写形式,"“中是大写形式,则过滤字段就是大写字段,”“中是小写字段,则过滤字段就是小写字段;
④对其进行DML操作时,需要利用”“指定表名和字段名,否则默认会认定以大写形式去查询对象。
⑤查询时,’'和”"界定符中字符串区分大小写,界定符中的字符串若是大写形式,那仅查询这个大写形式的对象,若是或小写形式,那仅查询这个小写形式的对象,DML操作依旧。
三、数据库为大小写不敏感库
sp_create_system_packages(1);
SELECT SF_GET_CASE_SENSITIVE_FLAG();
--0
1
2
3
3.1、DDL操作
create table test3(ID int,name char(20));
select dbms_metadata.get_ddl('TABLE','test3','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."test3"
(
"ID" INT,
"name" CHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
select dbms_metadata.get_ddl('TABLE','TEST3','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."test3"
(
"ID" INT,
"name" CHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
create table test6(id int,"name" char(20));
select dbms_metadata.get_ddl('TABLE','TEST6','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."test6"
(
"id" INT,
"name" CHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
create table "test1"(id int);
--执行成功
create table test1("id" int);
--执行失败 对象[test1]已存在
create table TEST1("id" int);
--对象[test1]已存在
create table test2("id" int,id int);
--执行失败 列[id]已存在
select dbms_metadata.get_ddl('TABLE','test1','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."test1"
(
"id" INT) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
select dbms_metadata.get_ddl('TABLE','TEST1','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."test1"
(
"id" INT) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
SUMMARY:
大小写不敏感的数据库中:
创建表时:
①无论对不对表名或列名添加"",表名和列名的大小写形式不会发生变化,大写形式就是大写形式,小写形式就是小写形式;
②不允许存在同名的数据库对象,即使大小写不同,默认也只能存在一个;
③一个表中,也不允许相同的字段名,即使大小写不同;
④查询时,’'和""界定符不区分大小写,界定符中的查询或过滤条件即使是大写或小写,都可以查询到预期的结果集。
3.2、OTHERS操作
--创建
drop table test1;
create table test1(id int,name char(20));
--导出元数据
select dbms_metadata.get_ddl('TABLE','TEST1','SYSDBA') from dual;
/*
CREATE TABLE "SYSDBA"."test1"
(
"id" INT,
"name" CHAR(20)) STORAGE(ON "MAIN", CLUSTERBTR) ;
*/
--进行DML操作
insert into sysdba.test1 values(1,'an');
update sysdba.test1 set id=100 where id=1;
delete from sysdba.test1 where id=100;
commit;
--4条语句执行成功
insert into sysdba.test1("id","name") values(1,'an');
--执行成功
update sysdba.test1 set id=100 where ID=1;
--执行成功
select * from TEST1 where NAME='AN';
/*
id name
100 an
*/
delete from sysdba.test1 where NAME='AN';
--执行成功
select * from TEST1;
--null
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SUMMARY:
大小写不敏感的数据库中:
DML或DDL操作时:
①无论对不对表名或列名添加"",表名和列名的大小写形式不会发生变化,大写形式就是大写形式,小写形式就是小写形式;
②不允许存在同名的数据库对象,即使大小写不同,默认也只能存在一个;
③一个表中,也不允许相同的字段名,即使大小写不同;
④查询时,’'和""界定符不区分大小写,界定符中的查询或过滤条件即使是大写或小写,都可以查询到预期的结果集,进行DML操作时依旧。