1.1 现象描述
达梦在安装完软件后,需要初始化数据库实例(其他大部分数据库,也是同样的操作)。
但是,达梦在初始化数据库实例前,有几个需要特别注意的参数,这几个参数一定要特别关注,因为如果设置错了,是不能更改的(这些参数,在实例生命周期内,无法更改——如果要更改,除非重新初始化)
这其中一个参数,就是【大小写敏感】
1.2 处理方法
1.2.1 什么是大小写敏感?
大小写敏感,也就是字面意思,表示数据库对于字符串的比较,是否区分大小写(即为是否敏感)。
这个“是否区分”,是三个方面的:
1. 对象名(表名、存储过程、序列等其他对象)或者字段名(也就是列名)
2. 字段内容
3. 其他字符串内容(比如用户输入的字符串类型的条件值,如where col ='xxxxxx' ,字符串类型的条件值,说的就是这个'xxxxxx' )
也就是说,如果设置为敏感,上面三项内容,都不区分大小写,也就是Abc 就是ABC ,跟进一步来说,也就是在进行字符串比较时(不管这个字符串是对象名、字段名还是字段内容),如果他们之间,不考虑大小写,是完全一样的,数据库则判定他们相等(他们是一样的)。
1.2.2 如何设置这个参数?
如何设置,分为两种情况,第一种情况是,通过图形化界面安装,即通过图形化界面工具初始化数据库实例的时候(dbca 工具初始化实例);第二种情况是,通过交互式无图形化界面安装,即通过命令行工具初始化数据库实例的时候(dminit 工具初始化实例)。
1. 图形化dbca 工具初始化实例,在下面这个步骤:
上图说明了:
1. 在初始化过程中,哪个界面可以设置“字符串比较大小写敏感”
2. 且通过图示可以看出(默认情况下),“字符串比较大小写敏感”的 默认值为“勾选”(即为1 ),标识对于大小写是敏感的,即区分大小写(对于大小写不一样的同内容字符串,判定为 不一样)。
2. 命令行dminit 工具初始化实例,通过下面这个参数指定:
上图说明了:
1. 这个参数通过 case_sensitive 进行设置
2. 改参数默认值为Y (即为1 ),也就是敏感(区分大小写)
3. 如果要设置为不敏感,通过红色标识字示例的那样,在dminit 时,添加参数设置【case_sensitive=n 】或者【case_sensitive=0 】即可(参数名字大写或者小写都可以)。
1.2.3 我们从不同的数据库迁移到达梦时,如何选择这个参数的设置值?
两条基本原则:
1. 我们通过前面,已经知道这个参数是干嘛的了,那么第一条原则就是按需选择:【按需设置】
2. 第二条原则是,我们不懂这个参数什么含义,或者说我们知道这个参数什么含义,但是还是不知道针对源库如何设置,那么就用这个建议:【原先使用Oracle 的,迁移到达梦时,选择敏感(即为默认值);原先使用Sqlerver 、Mysql 的,迁移到达梦时,选择不敏感( 注意:不是默认值哦)】,当然,如果是其他数据库的类型的话,还是得自己根据实际含义和业务需求判断,到底把这个参数设置成0 还是1 。
1.2.4 一般情况下,我们如何考虑大小写敏感的问题?大小写敏感的一个常见问题?
1.2.4.1 概述
大小写敏感的问题,我们知道一共涉及到两类:第一类是字段内容的比较区分(变量或者等号右边的值,也归入这类吧),第二类是对象名的比较区分。
我们在使用数据库的过程中,最常碰到的是第二类。
1.2.4.2 两个注意事项
在一般的情况下,字段内容是应用自行管理的,应用自己也好控制,但是对于字段名,作为开发,可能非常头疼。这里有两个基本知识,我们一定需要知道,对于数据库来说,是希望对开发友好的,所以达梦数据库的策略和Oracle 的策略一样:
即:
1. 在建立对象的时候,随便写大写还是小写,数据库都处理成大写
2. 在查询的时候,对象名,不论写成大写还是小写,数据库都看成大写,在数据库中进行查询
通过上述两个处理方式,作为开发,我们就可以“随便写大写还是小写”了。
备注:有时候,规范的应用代码里,写的全是驼峰命令法,我们往往也会用这个“自动转换”的方式,就是虽然怎么写对象名,都不会错——避免驼峰的时候,驼错一个字母,都找不到对象了(报错无效的列名、无效的表名或者无效的对象名等,各种无效的XX ——数据库中找不到))。
二
在“一”的场景下,往往不能满足特殊用户,或者一些“我就是要用小写,你不能给我设置成大写的场景”。于是,数据库必须提供过一种方式,可以用来规避上述这种转换(我们把“一”中的那种处理,描述成一种自动转换)。
这个规避方式就是:为对象名(字段名、表名、存储过程等等)加上双引号。
备注:所以有一点是明确的,如果我们 要想用“一”中的 自动转换,不考虑大小写,就 一定不要给字段或者对象名 加上双引号。
1.2.4.3 举三个例子:
Create table test1(v1 int); 和 select v1 from test1;
在数据库中处理的是:
CREATE TABLE TEST1(V1 INT); 和 SELECT V1 FROM TEST1;
-- 查询语句是正确的,不会报错
create table test1(v1 int); 和 select "v1" from test1;
在数据库中处理的是:
CREATE TABLE TEST1(V1 INT); 和 SELECT v1 FROM TEST1;
-- 查询语句会报错:无效的列名v1 ,因为这里的列名是 V1 。
create table test1("v1" int); 和 select v1 from test1;
在数据库中处理的是:
CREATE TABLE TEST1(v1 INT); 和 SELECT V1 FROM TEST1;
-- 查询语句会报错:无效的列名V1 ,因为这里的列名是 v1 。
当然,下面的这些,查询语句也都是正确的,不会报错:
Create table test1( V1 int); 和 select v1 from test1;
在数据库中处理的是:
CREATE TABLE TEST1(V1 INT); 和 SELECT V1 FROM TEST1;
-- 查询语句是正确的,不会报错
Create table test1(v1 int); 和 select V1 from test1;
在数据库中处理的是:
CREATE TABLE TEST1(V1 INT); 和 SELECT V1 FROM TEST1;
-- 查询语句是正确的,不会报错
1.2.4.4 总结:
总的来说,对于字段或者对象名的问题,①要么全部(建立或者查询时), 都不加双引号(建议这种方式,这个也不要建立和查询时,名字大小写完全对应),②要么,全部都加双引号,且必须保证建立和查询时,双引号里面的内容,完全一致。
当然,有时候我们就是都加了双引号,或者部分加了,部分没加,大小写对不上怎么办?
——不要忘了,我们还有“大小写是否敏感”这个设置。设置成不敏感,这个“对不上”,就是对的上了。只是要注意,这个还会影响字段内容的判断。
1.2.4.5 备注:什么叫做影响字段内容的判断?
Create table test1(v1 varchar(200));
insert into test1 values('a');
insert into test1 values('A');
insert into test1 values('b');
select * from test1 where v1='A';
-- 在敏感的库里,只能查出一条数据
-- 在不敏感的库里,能查出两条数据
select * from test1 where v1='a';
-- 在敏感的库里,只能查出一条数据
-- 在不敏感的库里,能查出两条数据
select * from test1 where 'A'='a';
-- 在敏感的库里,不能查出来任何数据
-- 在不敏感的库里,能查出整个表中全部的数据
参考:
https://blog.csdn.net/fengxiaozhenjay/article/details/101457237