达梦数据库⼤⼩写这个参数敏感怎样设置
1.1      现象描述
达梦在安装完软件后,需要初始化数据库实例(其他⼤部分数据库,也是同样的操作)。
但是,达梦在初始化数据库实例前,有⼏个需要特别注意的参数,这⼏个参数⼀定要特别关注,因为如果设置错了,是不能更改的(这些参数,在实例⽣命周期内,⽆法更改——如果要更改,除⾮重新初始化)
这其中⼀个参数,就是【⼤⼩写敏感】
1.2      处理⽅法
parameter数据类型
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';
-- 在敏感的库⾥,不能查出来任何数据
-- 在不敏感的库⾥,能查出整个表中全部的数据参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。