注册
达梦数据库初始化参数 CASE_SENSITIVE、BLANK_PAD_MODE、PAGE_SIZE 的影响
技术分享/ 文章详情 /

达梦数据库初始化参数 CASE_SENSITIVE、BLANK_PAD_MODE、PAGE_SIZE 的影响

何处惹尘埃 2026/08/07 160 0 0

问题9:初始化参数 CASE_SENSITIVE、BLANK_PAD_MODE、PAGE_SIZE 的影响

一、重要说明

CASE_SENSITIVEBLANK_PAD_MODEPAGE_SIZE 均为数据库初始化参数,在创建数据库时通过 dminit 工具指定,创建后不可修改。如需修改,只能重新初始化数据库。

二、CASE_SENSITIVE(大小写敏感)参数

参数说明

CASE_SENSITIVE 控制标识符(表名、字段名等)是否区分大小写。取值:Y/y/1 表示敏感,N/n/0 表示不敏感,默认值为 Y

2.1 大小写敏感时的表现(CASE_SENSITIVE=1)

实验环境:实例1(端口 5240,CASE_SENSITIVE=1

-- 创建小写表名(不带引号) CREATE TABLE test(id INT); INSERT INTO test VALUES (1); -- 查看系统表:表名被自动转换为大写 SELECT TABLE_NAME FROM USER_TABLES;

输出

行号  TABLE_NAME
----- ----------
1     TEST
2     ##HISTOGRAMS_TABLE

说明:不带双引号创建的表名 test 被系统自动转换为大写 TEST

-- 使用大写表名查询(成功) SELECT * FROM TEST;

输出

行号  ID
----- --
1     1
-- 使用双引号小写表名查询(失败) SELECT * FROM "test";

报错

[-2106]:无效的表或视图名[test]

说明:带双引号的标识符严格匹配大小写,因此 "test" 与实际的 TEST 不匹配。

关键结论

  • 不带双引号创建的表名会自动转为大写存储
  • 不带双引号查询时,系统自动将标识符转为大写进行匹配,因此 testTEST 都能查到 TEST
  • 带双引号查询时,严格匹配大小写,"test" 无法查到 TEST

2.2 大小写不敏感时的表现(CASE_SENSITIVE=0)

实验环境:实例2(端口 5241,CASE_SENSITIVE=0

-- 创建小写表名 CREATE TABLE test(id INT); INSERT INTO test VALUES (1); -- 查看系统表:表名保持小写 SELECT TABLE_NAME FROM USER_TABLES;

输出

行号  TABLE_NAME
----- ----------
1     test
2     ##HISTOGRAMS_TABLE
-- 大写查询(成功) SELECT * FROM TEST; SELECT * FROM test; SELECT * FROM TEst;

均成功返回数据。

关键结论

  • 表名按创建时的大小写存储
  • 查询时大小写不敏感,TESTtestTEst 均可查到 test

三、BLANK_PAD_MODE(空格填充模式)参数

参数说明

BLANK_PAD_MODE 设置字符串比较时,结尾空格填充模式。取值:1 表示兼容 Oracle(不忽略结尾空格),0 表示不兼容(忽略结尾空格),默认值为 0。此参数只对 VARCHAR 类型生效,对 CHAR 类型无效。

3.1 BLANK_PAD_MODE=0 时(忽略尾部空格)

实验环境:实例1(端口 5240,BLANK_PAD_MODE=0

CREATE TABLE t1(c1 VARCHAR(10)); INSERT INTO t1 VALUES ('ABC'), ('ABC '); COMMIT; -- 查询条件为 'ABC' SELECT * FROM t1 WHERE c1 = 'ABC';

输出

行号  C1
----- ----
1     ABC
2     ABC 
-- 查询条件为 'ABC ' SELECT * FROM t1 WHERE c1 = 'ABC ';

输出

行号  C1
----- ----
1     ABC
2     ABC 

结论BLANK_PAD_MODE=0 时,VARCHAR 比较忽略尾部空格,'ABC''ABC ' 被视为相同,两个查询都返回两行。

3.2 BLANK_PAD_MODE=1 时(不忽略尾部空格)

实验环境:实例2(端口 5241,BLANK_PAD_MODE=1

CREATE TABLE t1(c1 VARCHAR(10)); INSERT INTO t1 VALUES ('ABC'), ('ABC '); COMMIT; -- 查询条件为 'ABC' SELECT * FROM t1 WHERE c1 = 'ABC';

输出

行号  c1
----- ---
1     ABC
-- 查询条件为 'ABC ' SELECT * FROM t1 WHERE c1 = 'ABC ';

输出

行号  c1
----- ----
1     ABC 

结论BLANK_PAD_MODE=1 时,VARCHAR 比较不忽略尾部空格,'ABC''ABC ' 被视为不同,分别返回对应的行。

四、PAGE_SIZE(页大小)参数

参数说明

PAGE_SIZE 是数据文件使用的页大小,可以为 4KB8KB16KB32KB,默认 8KB。选择的页大小越大,支持的元组长度也越大,但空间利用率可能下降。

不同页大小的影响

页大小 VARCHAR 字段最大长度(字节) 单行总长度上限(字节) 数据文件最小大小(MB)
4KB 1938 2047 16
8KB 3878 4095 32
16KB 8000 8195 64
32KB 8188 16176 128

实操验证

-- 查看当前页大小 SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE';

输出

行号  PARA_NAME        PARA_VALUE
----- ---------------- ----------
1     GLOBAL_PAGE_SIZE 8192

说明:当前 8KB 页大小,单行总长度上限为 4095 字节。

五、三个参数对比总结

参数 CASE_SENSITIVE BLANK_PAD_MODE PAGE_SIZE
作用范围 标识符大小写敏感 字符串尾部空格比较 数据页大小
取值 0=不敏感,1=敏感 0=忽略空格,1=兼容Oracle 4/8/16/32(KB)
默认值 1(敏感) 0(忽略空格) 8KB
是否可修改 否,需重建实例 否,需重建实例 否,需重建实例
影响对象 表名、字段名、字符串比较 VARCHAR 类型字符串比较 字符字段最大长度、行记录上限、数据文件大小

六、清理测试实例

pkill -f "dmserver.*5240" pkill -f "dmserver.*5241" rm -rf /home/dmdba/dmdata/case_sensitive rm -rf /home/dmdba/dmdata/case_insensitive

七、完整操作命令清单

# 1. 查看当前实例参数 disql SYSDBA/Dameng123@localhost:5239 SELECT CASE_SENSITIVE(); SELECT NAME, VALUE, FILE_VALUE FROM V$PARAMETER WHERE NAME = 'BLANK_PAD_MODE'; SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE'; exit; # 2. 创建两个测试实例 cd /home/dmdba/dmdbms/bin ./dminit path=/home/dmdba/dmdata/case_sensitive db_name=CSDB instance_name=CSSVR port_num=5240 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Audit123 CASE_SENSITIVE=1 BLANK_PAD_MODE=0 PAGE_SIZE=8 ./dminit path=/home/dmdba/dmdata/case_insensitive db_name=CISDB instance_name=CISSVR port_num=5241 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Audit123 CASE_SENSITIVE=0 BLANK_PAD_MODE=1 PAGE_SIZE=8 # 3. 启动实例 nohup ./dmserver /home/dmdba/dmdata/case_sensitive/CSDB/dm.ini > /home/dmdba/dmdata/case_sensitive/dm.log 2>&1 & nohup ./dmserver /home/dmdba/dmdata/case_insensitive/CISDB/dm.ini > /home/dmdba/dmdata/case_insensitive/dm.log 2>&1 & # 4. 验证参数 disql SYSDBA/Dameng123@localhost:5240 -e "SELECT CASE_SENSITIVE();" disql SYSDBA/Dameng123@localhost:5241 -e "SELECT CASE_SENSITIVE();" # 5. CASE_SENSITIVE 实验(实例1,敏感) disql SYSDBA/Dameng123@localhost:5240 CREATE TABLE test(id INT); INSERT INTO test VALUES (1); SELECT TABLE_NAME FROM USER_TABLES; SELECT * FROM TEST; SELECT * FROM "test"; DROP TABLE TEST; # 6. CASE_SENSITIVE 实验(实例2,不敏感) disql SYSDBA/Dameng123@localhost:5241 CREATE TABLE test(id INT); INSERT INTO test VALUES (1); SELECT TABLE_NAME FROM USER_TABLES; SELECT * FROM TEST; SELECT * FROM test; DROP TABLE test; # 7. BLANK_PAD_MODE 实验(实例1,MODE=0) CREATE TABLE t1(c1 VARCHAR(10)); INSERT INTO t1 VALUES ('ABC'), ('ABC '); SELECT * FROM t1 WHERE c1 = 'ABC'; SELECT * FROM t1 WHERE c1 = 'ABC '; DROP TABLE t1; # 8. BLANK_PAD_MODE 实验(实例2,MODE=1) CREATE TABLE t1(c1 VARCHAR(10)); INSERT INTO t1 VALUES ('ABC'), ('ABC '); SELECT * FROM t1 WHERE c1 = 'ABC'; SELECT * FROM t1 WHERE c1 = 'ABC '; DROP TABLE t1; # 9. 清理实例 pkill -f "dmserver.*5240" pkill -f "dmserver.*5241" rm -rf /home/dmdba/dmdata/case_sensitive rm -rf /home/dmdba/dmdata/case_insensitive

八、总结

问题 答案
CASE_SENSITIVE 为 0 和 1 的影响? 1:标识符自动转大写,字符串比较区分大小写;0:标识符保持原样,字符串比较不区分大小写
BLANK_PAD_MODE 为 0 和 1 的影响? 0:VARCHAR 比较忽略尾部空格;1:VARCHAR 比较保留尾部空格,与 Oracle 兼容
page_size 大小不同的影响? 页越大,单行记录长度上限越大、数据文件最小大小越大,但空间利用率可能下降
三个参数的共同点? 均在初始化时设定,创建后无法修改,需重建实例才能变更
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服