达梦数据库字符大小写敏感与字符大小写不敏感情况下的对比

休闲思考
0 72

csroad
csroad 举报
06月10日 11:48

一、检查数据库实例大小写敏感信息

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操作时依旧。