概念

case_sensitive参数用来设置字符串比较是否大小写敏感,用于确定数据库对象及数据是否区分大小写,默认为区分,不可更改。根本目的是为了兼容不同的数据库,从MYSQL和SQLSERVER 迁移过来的系统,建议使用大小写不敏感;从 ORACLE迁移过来的系统,建议使用大小写敏感,以便和原来系统匹配。

大小写敏感的问题,我们知道一共涉及到两类:

第一类是字段内容的比较区分;

第二类是对象名的比较区分。

我们在使用数据库的过程中,最常碰到的是第二类。

对于数据库来说,是希望对开发友好的,所以达梦数据库的策略和Oracle 的策略一样,即:

1.在建立对象的时候,随便写大写还是小写,数据库都处理成大写;

2.在查询的时候,对象名,不论大写还是小写,数据库都看成大写,在数据库中进行查询。

除了上述之外,还有“我就是要用小写,不要给设置成大写的场景”。

于是,数据库必须提供过一种方式,可以用来规避上述这种自动转换为大写,这个规避方式就是为对象名(字段名、表名、存储过程等等)加上双引号, 例如 CREATE TABLE "test";

举例测试

可以通过SELECT SF_GET_CASE_SENSITIVE_FLAG();查询是否大小写敏感库

1表示敏感,0表示不敏感。

docker已经部署达梦数据库后大小写不敏感设置 达梦数据库区分大小写_dba

 

  1. 大小写敏感库测试

create table test(name varchar);

insert into test values('aaa');

insert into test values('AAA');

insert into TEST(NAme) values('bbb');

create table Test(name varchar);

create table TEST(name varchar);

select dbms_metadata.get_ddl('TABLE','test','SYSDBA')from dual;

select dbms_metadata.get_ddl('TABLE','TEST','SYSDBA')from dual;

create table "test" ("name" varchar ,NAME varchar);

select * from test where name='AAa';

select * from test where name='AAA';

insert into "test" values('xiaoshu','XIAOSHU');

select * from "test" ;

执行结果如下:

docker已经部署达梦数据库后大小写不敏感设置 达梦数据库区分大小写_数据库架构_02

 

docker已经部署达梦数据库后大小写不敏感设置 达梦数据库区分大小写_表名_03

 

 

docker已经部署达梦数据库后大小写不敏感设置 达梦数据库区分大小写_表名_04

 

不加双引号,创建表时会自动将表名和列名自动转换成大写形式,加双引号表名和列名则会保留原形式。create table test和create table "test"是不同的,前者会自动转换成TEST

  1. 大小写不敏感测试

初始化一个大小写不敏感的实例用作实验

./dminit path=/home/dmdba/dmdbms/ case_sensitive=0 charset=0 db_name=DMTEST instance_name=DMTEST

通过disql连接并执行相同的脚本,结果如下

docker已经部署达梦数据库后大小写不敏感设置 达梦数据库区分大小写_数据库架构_05

 

 

总结

  1. 大小写敏感

不加双引号,创建表时会自动将表名和列名自动转换成大写形式,加双引号表名和列名则会保留原形式。create table test和create table "test"是不同的,前者会自动转换成TEST,后者保留原形式test。

大小写不同的两个表是不同对象。

一个表中,允许存在同名但大小写形式不同的字段。

如果不加双引号,SQL语句中表名和对象名会被自动转成大写

对于表中字符数据是严格区分大小写的

  1. 大小写不敏感
  2. 无论对不对表名或列名加双引号,表名和列名大小写形式不会发生变化,创建时是大写就是大写,是小写就是小写。
  3. 不允许存在同名的数据库对象,即使大小写不同也算同名。
  4. 一个表中,不允许出现相同字段名,大小写不同也算同名。
  5. 字段字符内容也不区分大小写,无论是大写还是小写都认为是相同的值