注册
参数BLANK_PAD_MODE、SPACE_COMPARE_MODE实战演示
技术分享/ 文章详情 /

参数BLANK_PAD_MODE、SPACE_COMPARE_MODE实战演示

Laity 2023/03/07 1522 2 0

BLANK_PAD_MODE
设置字符串比较时,结尾空格填充模式是否兼容 ORACLE。1:兼容;0:不兼容。缺省值为 0。可选参数。
此参数在数据库创建成功后无法修改,可通过查询V$PARAMETER中的BLANK_PAD_MODE 参数名查看此参数的设置值。
主要作用:字符串尾部空格是否参与比较。
注意:group by分组列无论blank_pad_mode取值如何,它严格处理尾部空格存在问题。

SPACE_COMPARE_MODE
是否在查询语句中比较字符串后缀空格。0:维持原有策略;1:进行比较
注意:这里的原有策略应该是由BLANK_PAD_MODE决定的,请看正文

正文开始

BLANK_PAD_MODE=0

SPACE_COMPARE_MODE=0

select * from v$dm_ini where “V$DM_INI”.PARA_NAME =‘SPACE_COMPARE_MODE’;–0

CREATE TABLE TEST_A(NAME VARCHAR2(10));
INSERT INTO TEST_A VALUES(‘A’);
INSERT INTO TEST_A VALUES('A ');
COMMIT;
select * from TEST_A where name='A ‘; --返回两行
select * from TEST_A where name=‘A’; --返回两行
image.png
select name,count(*) from TEST_A GROUP BY NAME; --返回两行
image.png
**小结:结尾空格不填充、SPACE_COMPARE_MODE=0,表中数据’A’='A ’
**

初始化数据库参数

SPACE_COMPARE_MODE=1

sp_set_para_value(2,‘SPACE_COMPARE_MODE’,1); --重启生效
select * from v$dm_ini where “V$DM_INI”.PARA_NAME =‘SPACE_COMPARE_MODE’;–1

CREATE TABLE TEST_C(NAME VARCHAR2(10));
INSERT INTO TEST_C VALUES(‘A’);
INSERT INTO TEST_C VALUES('A ');
COMMIT;
select * from TEST_C where name='A ‘; --只返回A空格
select * from TEST_C where name=‘A’; --只返回A
image.png
select name,count(*) from TEST_C GROUP BY NAME; --返回两行
image.png
**小结:结尾空格不填充、SPACE_COMPARE_MODE=1,表中数据’A’<>'A ’
**

重新初始化一个库

BLANK_PAD_MODE=1

SPACE_COMPARE_MODE=0

select * from v$dm_ini where “V$DM_INI”.PARA_NAME =‘SPACE_COMPARE_MODE’;–0

CREATE TABLE TEST_A(NAME VARCHAR2(10));
INSERT INTO TEST_A VALUES(‘A’);
INSERT INTO TEST_A VALUES('A ');
COMMIT;
select * from TEST_A where name='A ‘; --只返回A空格
select * from TEST_A where name=‘A’; --只返回A
image.png
select name,count(*) from TEST_A GROUP BY NAME;
image.png
**小结:结尾空格填充、SPACE_COMPARE_MODE=0,表中数据’A’<>'A ’
**

SPACE_COMPARE_MODE=1

sp_set_para_value(2,‘SPACE_COMPARE_MODE’,1); --重启生效
select * from v$dm_ini where “V$DM_INI”.PARA_NAME =‘SPACE_COMPARE_MODE’;–1

CREATE TABLE TEST_B(NAME VARCHAR2(10));
INSERT INTO TEST_B VALUES(‘A’);
INSERT INTO TEST_B VALUES('A ');
COMMIT;

select * from TEST_B where name='A ‘; --只返回A空格
select * from TEST_B where name=‘A’; --只返回A
image.png
select name,count(*) from TEST_B GROUP BY NAME;
image.png
**小结:结尾空格填充、SPACE_COMPARE_MODE=1,表中数据’A’<>'A ’
**

总结:初始化参数BLANK_PAD_MODE和INI参数SPACE_COMPARE_MODE均影响表中数据空格是否参与比较,只是初始化参数BLANK_PAD_MODE优先级更高,group by分组列无论BLANK_PAD_MODE、SPACE_COMPARE_MODE取值如何,它严格处理尾部空格存在问题。
image.png

还有个小问题:

当BLANK_PAD_MODE=0和INI参数SPACE_COMPARE_MODE=0时,select 1 from dual where ‘a’ = 'a '; --无返回

image.png
当BLANK_PAD_MODE=0和INI参数SPACE_COMPARE_MODE=1时,或者当BLANK_PAD_MODE=1和INI参数SPACE_COMPARE_MODE=0/1时,
select 1 from dual where ‘a’ = 'a '; --返回

image.png

和表中数据比较正好相反,为什么呢?
通过测试发现两个字符串的比较,空格是否参与比较是和其所属类型相关的。
当BLANK_PAD_MODE=0和INI参数SPACE_COMPARE_MODE=0时,select 1 from dual where cast(‘a’ as char(1)) = 'a '; --返回

image.png
其他三种情况下:select 1 from dual where cast(‘a’ as varchar(1)) = 'a '; --无返回

image.png
结论:
当BLANK_PAD_MODE=0和INI参数SPACE_COMPARE_MODE=0时,字符串的默认类型是varchar2/varchar,不参与比较
其他三种情况,字符串默认类型是char,参与比较,所以说定长字符串强制比较。

oracle和其他三种情况也是一样的。
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服