概念
case_sensitive参数用来设置字符串比较是否大小写敏感,用于确定数据库对象及数据是否区分大小写,默认为区分,不可更改。根本目的是为了兼容不同的数据库,从MYSQL和SQLSERVER 迁移过来的系统,建议使用大小写不敏感;从 ORACLE迁移过来的系统,建议使用大小写敏感,以便和原来系统匹配。
大小写敏感的问题,我们知道一共涉及到两类:
第一类是字段内容的比较区分;
第二类是对象名的比较区分。
我们在使用数据库的过程中,最常碰到的是第二类。
对于数据库来说,是希望对开发友好的,所以达梦数据库的策略和Oracle 的策略一样,即:
1.在建立对象的时候,随便写大写还是小写,数据库都处理成大写;
2.在查询的时候,对象名,不论大写还是小写,数据库都看成大写,在数据库中进行查询。
除了上述之外,还有“我就是要用小写,不要给设置成大写的场景”。
于是,数据库必须提供过一种方式,可以用来规避上述这种自动转换为大写,这个规避方式就是为对象名(字段名、表名、存储过程等等)加上双引号, 例如 CREATE TABLE "test";
举例测试
可以通过SELECT SF_GET_CASE_SENSITIVE_FLAG();查询是否大小写敏感库
1表示敏感,0表示不敏感。
- 大小写敏感库测试
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" ; |
执行结果如下:
不加双引号,创建表时会自动将表名和列名自动转换成大写形式,加双引号表名和列名则会保留原形式。create table test和create table "test"是不同的,前者会自动转换成TEST
- 大小写不敏感测试
初始化一个大小写不敏感的实例用作实验
./dminit path=/home/dmdba/dmdbms/ case_sensitive=0 charset=0 db_name=DMTEST instance_name=DMTEST
通过disql连接并执行相同的脚本,结果如下
总结
- 大小写敏感
不加双引号,创建表时会自动将表名和列名自动转换成大写形式,加双引号表名和列名则会保留原形式。create table test和create table "test"是不同的,前者会自动转换成TEST,后者保留原形式test。
大小写不同的两个表是不同对象。
一个表中,允许存在同名但大小写形式不同的字段。
如果不加双引号,SQL语句中表名和对象名会被自动转成大写
对于表中字符数据是严格区分大小写的
- 大小写不敏感
- 无论对不对表名或列名加双引号,表名和列名大小写形式不会发生变化,创建时是大写就是大写,是小写就是小写。
- 不允许存在同名的数据库对象,即使大小写不同也算同名。
- 一个表中,不允许出现相同字段名,大小写不同也算同名。
- 字段字符内容也不区分大小写,无论是大写还是小写都认为是相同的值