1. 大小写敏感参数是什么?
大小写敏感参数是达梦数据库初始化时的一个全局参数,默认是敏感的,并且设定后不可更改。
|
dminit help initdb V8 db version: 0x7000c License will expire on 2022-03-25 格式: ./dminit KEYWORD=value
例程: ./dminit PATH=/public/dmdb/dmData PAGE_SIZE=16
关键字 说明(默认值) -------------------------------------------------------------------------------- INI_FILE 初始化文件dm.ini存放的路径 PATH 初始数据库存放的路径 CTL_PATH 控制文件路径 LOG_PATH 日志文件路径 EXTENT_SIZE 数据文件使用的簇大小(16),可选值:16, 32, 64,单位:页 PAGE_SIZE 数据页大小(8),可选值:4, 8, 16, 32,单位:K LOG_SIZE 日志文件大小(256),单位为:M,范围为:64M ~ 2G CASE_SENSITIVE 大小敏感(Y),可选值:Y/N,1/0 CHARSET/UNICODE_FLAG 字符集(0),可选值:0[GB18030],1[UTF-8],2[EUC-KR] SEC_PRIV_MODE 权限管理模式(0),可选值:0[TRADITION],1[BMJ],2[EVAL] LENGTH_IN_CHAR VARCHAR 类型长度是否以字符为单位(N),可选值:Y/N,1/0 SYSDBA_PWD 设置SYSDBA密码(SYSDBA) SYSAUDITOR_PWD 设置SYSAUDITOR密码(SYSAUDITOR) DB_NAME 数据库名(DAMENG) INSTANCE_NAME 实例名(DMSERVER) PORT_NUM 监听端口号(5236) BUFFER 系统缓存大小(100),单位M TIME_ZONE 设置时区(+08:00) PAGE_CHECK 页检查模式(0),可选值:0/1/2 EXTERNAL_CIPHER_NAME 设置默认加密算法 EXTERNAL_HASH_NAME 设置默认HASH算法 EXTERNAL_CRYPTO_NAME 设置根密钥加密引擎 RLOG_ENC_FLAG 设置日志文件是否加密(N),可选值:Y/N,1/0 USBKEY_PIN 设置USBKEY PIN PAGE_ENC_SLICE_SIZE 设置页加密分片大小,可选值:0、512、4096,单位:Byte ENCRYPT_NAME 设置全库加密算法 BLANK_PAD_MODE 设置空格填充模式(0),可选值:0/1 SYSTEM_MIRROR_PATH SYSTEM 数据文件镜像路径 MAIN_MIRROR_PATH MAIN 数据文件镜像 ROLL_MIRROR_PATH 回滚文件镜像路径 MAL_FLAG 初始化时设置dm.ini中的MAL_INI(0) ARCH_FLAG 初始化时设置dm.ini中的ARCH_INI(0) MPP_FLAG Mpp 系统内的库初始化时设置dm.ini中的mpp_ini(0) CONTROL 初始化配置文件(配置文件格式见系统管理员手册) AUTO_OVERWRITE 是否覆盖所有同名文件(0) 0:不覆盖 1:部分覆盖 2:完全覆盖 USE_NEW_HASH 是否使用改进的字符类型HASH算法(1) ELOG_PATH 指定初始化过程中生成的日志文件所在路径 AP_PORT_NUM ECS 模式下AP协同工作的监听端口 DFS_FLAG 初始化时设置dm.ini中的DFS_INI(0) DFS_PATH 启用dfs时指定数据文件的缺省路径 DFS_HOST 指定连接分布式系统DFS的服务地址(localhost) DFS_PORT 指定连接分布式系统DFS的服务端口号(3332) DFS_COPY_NUM 指定分布式系统的副本数(3) DFS_DB_NAME 指定分布式系统的中数据库名(默认与DB_NAME一致) SHARE_FLAG 指定分布式系统中该数据库的共享属性(0) REGION_MODE 指定分布式系统中该数据库的系统表空间数据文件的区块策略(0) 0:微区策略 1:宏区策略 HUGE_WITH_DELTA 是否仅支持创建事务型HUGE表(1) 1:是 0:否 RLOG_GEN_FOR_HUGE 是否生成HUGE表REDO日志(0) 1:是 0:否 PSEG_MGR_FLAG 是否仅使用管理段记录事务信息(0) 1:是 0:否 CHAR_FIX_STORAGE CHAR 是否按定长存储(N),可选值:Y/N,1/0 HELP 打印帮助信息 |
查询大小写敏感设置的情况:
|
SELECT CASE_SENSITIVE(); -- 结果为 1 是大小写敏感,结果为 0 是不敏感 |
2. 大小写敏感针对的是对象名还是表中数据?
首先看看对表中内容作比较时大小写敏感的影响。
|
CREATE TABLE TEST_CASE_SENSITIVE(C1 VARCHAR(100)); INSERT INTO TEST_CASE_SENSITIVE VALUES('a'); INSERT INTO TEST_CASE_SENSITIVE VALUES('A'); COMMIT; -- 大小写敏感的情况 SELECT COUNT(*) FROM TEST_CASE_SENSITIVE WHERE C1='a'; -- 结果为1 SELECT COUNT(*) FROM TEST_CASE_SENSITIVE WHERE C1='A'; -- 结果为1 -- 大小写不敏感的情况 SELECT COUNT(*) FROM TEST_CASE_SENSITIVE WHERE C1='a'; -- 结果为2 SELECT COUNT(*) FROM TEST_CASE_SENSITIVE WHERE C1='A'; -- 结果为2 |
再来看看大小写敏感参数对对象名的影响。
|
-- 在大小写敏感的情况下,创建对象时不要对对象名加双引号,大小写对对象名没有影响 CREATE TABLE a(C1 INT); SELECT * FROM a; -- 执行成功 SELECT * FROM A; -- 执行成功 SELECT * FROM "A"; -- 执行成功 SELECT * FROM "a"; -- 执行失败:无效的表或视图名[A] CREATE TABLE "b"(C1 INT); SELECT * FROM b; -- 执行失败:无效的表或视图名[B] SELECT * FROM B; -- 执行失败:无效的表或视图名[B] SELECT * FROM "b"; -- 执行成功 SELECT * FROM "B"; -- 执行失败:无效的表或视图名[B] -- 注意:在达梦管理工具中使用图形界面创建对象时如果用小写就会自动加上双引号,查询的时候必须使用双引号来访问,很多朋友问题注意出在这里,如果在大小写敏感的库里面使用图形界面而不是 SQL 语句来创建对象,一定注意要用大写,用小写就会自动加双引号,强制保持大小写了 -- 在大小写不敏感的情况下,加不加双引号都无所谓,对查询没有影响 CREATE TABLE a(C1 INT); SELECT * FROM a; -- 执行成功 SELECT * FROM A; -- 执行成功 SELECT * FROM "a"; -- 执行成功 SELECT * FROM "A"; -- 执行成功 CREATE TABLE "b"(C1 INT); SELECT * FROM b; -- 执行成功 SELECT * FROM B; -- 执行成功 SELECT * FROM "b"; -- 执行成功 SELECT * FROM "B"; -- 执行成功 |
OTHERS 操作,大小写敏感参数对列名的影响。
|
-- 在大小写敏感的情况下 create table test1(id int,name char(20)); -- 进行 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] -- 在大小写不敏感的情况下 create table test1(id int,name char(20)); - 进行 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');-- 执行成功 update sysdba.test1 set id=100 where ID=1;-- 执行成功 select * from TEST1 where NAME='AN';-- 执行成功 delete from sysdba.test1 where NAME='AN';-- 执行成功 select * from TEST1;-- 执行成功 create table test2("id" int,id int);-- 执行失败,列[id]已存在 |
3. 总结
1) 大小写敏感的数据库中,创建表时:
Ø 如果不对表名或列名添加"",那么表名和列名都自动转换为大写形式
Ø 如果对表名或列名添加"",会固定书写时的大、小写形式,书写时采取的是小写形式,那么就定型为小写形式,其他不添加""的则自动转换为大写形式,无论书写时采取的是大写形式或小写形式
Ø 同名的数据库对象,如果大小写不同,那么则为两个不同的对象,字段同样如此
Ø 一个表中,即使是相同的字段名,只要大小写不同,允许存在同名且不同大小写形式的字段
2) 大小写敏感的数据库中,DML 或 DDL 操作时:
Ø 如果不对表名或列名添加"",那么表名和列名都自动转换为大写形式
Ø 对表进行 DML 操作时,如果没有小写形式的字段,不能采取小写加""的形式指定过滤字段,会被认定为无效的字段
Ø 如果对表名或列名添加"",会固定书写时的大、小写形式,""中是大写形式,则过滤字段就是大写字段,""中是小写字段,则过滤字段就是小写字段
Ø 对其进行 DML 操作时,需要利用""指定表名和字段名,否则默认会认定以大写形式去查询对象
Ø 查询时,''和""界定符中字符串区分大小写,界定符中的字符串若是大写形式,那仅查询这个大写形式的对象,若是或小写形式,那仅查询这个小写形式的对象,DML 操作依旧
3) 大小写不敏感的数据库中,创建表时:
Ø 无论对不对表名或列名添加"",表名和列名的大小写形式不会发生变化,大写形式就是大写形式,小写形式就是小写形式
Ø 不允许存在同名的数据库对象,即使大小写不同,默认也只能存在一个
Ø 一个表中,也不允许相同的字段名,即使大小写不同
Ø 查询时,''和""界定符不区分大小写,界定符中的查询或过滤条件即使是大写或小写,都可以查询到预期的结果集
4) 大小写不敏感的数据库中,DML 或 DDL 操作时:
Ø 无论对不对表名或列名添加"",表名和列名的大小写形式不会发生变化,大写形式就是大写形式,小写形式就是小写形式
Ø 不允许存在同名的数据库对象,即使大小写不同,默认也只能存在一个
Ø 一个表中,也不允许相同的字段名,即使大小写不同
Ø 查询时,''和""界定符不区分大小写,界定符中的查询或过滤条件即使是大写或小写,都可以查询到预期的结果集,进行 DML 操作时依旧