注册
详解 DM 数据库字符串大小写敏感
专栏/金的探索记录/ 文章详情 /

详解 DM 数据库字符串大小写敏感

2021/03/09 8069 6 1
摘要 结合例子和总结帮助大家更好的理解字符串大小写敏感的问题,以便在学习和工作中更好地使用。

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

SELECT SF_GET_CASE_SENSITIVE_FLAG();
    --1 为大小写敏感,0 为大小写不敏感

场景一:初始化数据库实例为大小写敏感库

sp_create_system_packages(1);
SELECT SF_GET_CASE_SENSITIVE_FLAG();
    --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);
*/
----------------------------------
create table test6(id int,"name" chat(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);
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);
*/
select dbms_metadata.get_ddl('TABLE','TEST2','SYSDBA')from dual;
/*
CREATE TABLE "SYSDBA"."TEST2"
(
"id" INT,
"id" INT) STORAGE(ON "MAIN",CLUSTERBTR);
*/

总结

大小写敏感的数据库中,创建表时:

  • 如果不对表名或列名添加"",那么表名和列名都自动转换为大写形式;
  • 如果对表名或列名添加"“,会固定书写时的大、小写形式,书写时采取的是小写形式,那么就定型为小写形式,其他不添加”"的则自动转换为大写形式,无论书写时采取的是大写形式或小写形式。
  • 同名的数据库对象,如果大小写不同,那么则为两个不同的对象,字段同样如此;
  • 一个表中,即使是相同的字段名,只要大小写不同,允许存在同名且不同大小写形式的字段。

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');
    --无效的列名[id]
update sysdba.test1 set id=100 where "id"=1;
    --无效的列名[id]
delete from sysdba.test1 where "id"=100;
    --无效的列名[id]

总结

大小写敏感的数据库中,DML 或 DDL 操作时:

  • 如果不对表名或列名添加"",那么表名和列名都自动转换为大写形式;
  • 对表进行 DML 操作时,如果没有小写形式的字段,不能采取小写加""的形式指定过滤字段,会被认定为无效的字段;
  • 如果对表名或列名添加"“,会固定书写时的大、小写形式,”“中是大写形式,则过滤字段就是大写字段,”"中是小写字段,则过滤字段就是小写字段;
  • 对其进行 DML 操作时,需要利用""指定表名和字段名,否则默认会认定以大写形式去查询对象。
  • 查询时,''和""界定符中字符串区分大小写,界定符中的字符串若是大写形式,那仅查询这个大写形式的对象,若是或小写形式,那仅查询这个小写形式的对象,DML 操作依旧。

场景二:数据库为大小写不敏感库

sp_create_system_packages(1);
SELECT SF_GET_CASE_SENSITIVE_FLAG();
    --0

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"."test3"("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);
*/

总结

大小写不敏感的数据库中,创建表时:

  • 无论对不对表名或列名添加"",表名和列名的大小写形式不会发生变化,大写形式就是大写形式,小写形式就是小写形式;
  • 不允许存在同名的数据库对象,即使大小写不同,默认也只能存在一个;
  • 一个表中,也不允许相同的字段名,即使大小写不同;
  • 查询时,''和""界定符不区分大小写,界定符中的查询或过滤条件即使是大写或小写,都可以查询到预期的结果集。

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 ehere 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

总结

大小写不敏感的数据库中,DML 或 DDL 操作时:

  • 无论对不对表名或列名添加"",表名和列名的大小写形式不会发生变化,大写形式就是大写形式,小写形式就是小写形式;
  • 不允许存在同名的数据库对象,即使大小写不同,默认也只能存在一个;
  • 一个表中,也不允许相同的字段名,即使大小写不同;
  • 查询时,''和""界定符不区分大小写,界定符中的查询或过滤条件即使是大写或小写,都可以查询到预期的结果集,进行 DML 操作时依旧。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服