CASE_SENSITIVE、BLANK_PAD_MODE、PAGE_SIZE 均为数据库初始化参数,在创建数据库时通过 dminit 工具指定,创建后不可修改。如需修改,只能重新初始化数据库。
CASE_SENSITIVE 控制标识符(表名、字段名等)是否区分大小写。取值:Y/y/1 表示敏感,N/n/0 表示不敏感,默认值为 Y。
实验环境:实例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 不匹配。
关键结论:
test 和 TEST 都能查到 TEST 表"test" 无法查到 TEST 表实验环境:实例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;
均成功返回数据。
关键结论:
TEST、test、TEst 均可查到 test 表BLANK_PAD_MODE 设置字符串比较时,结尾空格填充模式。取值:1 表示兼容 Oracle(不忽略结尾空格),0 表示不兼容(忽略结尾空格),默认值为 0。此参数只对 VARCHAR 类型生效,对 CHAR 类型无效。
实验环境:实例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 ' 被视为相同,两个查询都返回两行。
实验环境:实例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 是数据文件使用的页大小,可以为 4KB、8KB、16KB 或 32KB,默认 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 大小不同的影响? | 页越大,单行记录长度上限越大、数据文件最小大小越大,但空间利用率可能下降 |
| 三个参数的共同点? | 均在初始化时设定,创建后无法修改,需重建实例才能变更 |
文章
阅读量
获赞
