Oracle 11g hextoraw sql查询结果

时间:2017-05-22 20:17:20

标签: sql oracle

所以,我有一个名为mams_folder的表,主键是mams_folder_id

现在,它的类型是原始的。我用十六进制字符串表示键。 以下查询在sql developer上运行。

现在,我运行这些查询:

select * from mams_folder f where f.mams_folder_id= hextoraw('EEA12100F39D100384D2080020F03012'); //Works fine

select * from mams_folder f where f.mams_folder_id= 'EEA12100F39D100384D2080020F03012';//Surprisingly works fine too. Why ?

select * from mams_folder f where f.mams_folder_id= hextoraw('5426deaf924642bb9a38dc0b5be87ed6'); //Works fine as expected

select * from mams_folder f where f.mams_folder_id= '5426deaf924642bb9a38dc0b5be87ed6'; //Returns no rows as expected

两者都是有效的主键。 '5426deaf924642bb9a38dc0b5be87ed6'被新插入数据库中。

为什么db返回第二个查询的答案但是为最后一个返回null? 是否必须对db缓存执行某些操作?

更新:

好的,我开始知道如果我使用大写十六进制字符串中的主键,那么即使不使用hextoraw(),查询也能正常工作(我们可以在上面看到)。但是,当使用较小的情况时,hextoraw()变得强制使用,否则显示空结果。为什么?

1 个答案:

答案 0 :(得分:0)

我相信你所看到的内容源于隐式/显式类型转换机制,当通过文字或hextoraw插入然后根据文字进行预测时。

正式十六进制是0123456789ABCDEF(大写),基数16,尽管有工具(在Oracle和其他地方)都可以识别包含0123456789abcdefABCDEF(不区分大小写)的字符串作为十六进制。

HEXTORAW不区分大小写并接受小写十六进制。但返回的raw值将为正式十六进制。

例如,运行以下命令:

SELECT HEXTORAW('5426deaf924642bb9a38dc0b5be87ed6') AS HEX FROM DUAL;

提供正式的大写十六进制

HEX                               
5426DEAF924642BB9A38DC0B5BE87ED6  

以下内容当然会失败,因为它包含非十六进制字符g

SELECT HEXTORAW('5426geaf924642bb9a38dc0b5be87ed6') FROM DUAL;
ORA-01465: invalid hex number

将上述文字插入原始字段时隐式转换。 RAW需要十六进制。

对于针对mams_folder表的查询,我认为使用小写文字谓词的查询找不到匹配项,因为在使用字符串文字进行谓词时,随后的类型转换将比较RAW和{{1尝试将正式的十六进制字符与小写字母字符匹配。 (它不会将提供的文字转换为VARCHAR2,而是将十六进制与文字进行比较)

由于raw在转换过程中将任何输入字符串转换为正式十六进制,因此它最终会得到与普通文字不同的比较,即使它正在比较HEXTORAW而不是{{1 }}。

因此,将转换后的(大写)char与小写文字匹配的简单谓词将导致不匹配。但是,当将大写字母与raw进行比较时,用于比较的正式十六进制恰好匹配大写字符串文字并且谓词已完成。

以下是一个例子:

RAW

然后添加测试数据。一个项目作为大写文字添加,一个作为小写文字添加,依赖于oracle隐式执行任何所需的类型转换

RAW

然后只是查询事情看起来如何。尚未涉及CREATE TABLE mams_folder (mams_folder_id RAW(32));

INSERT INTO mams_folder VALUES ('EEA12100F39D100384D2080020F03012');
INSERT INTO mams_folder VALUES ('5426deaf924642bb9a38dc0b5be87ed6');

请注意插入的文字hextoraw的打印值。

现在转换比较原始文字和大写文字匹配。

在此查询中:

SELECT * FROM MAMS_FOLDER;

MAMS_FOLDER_ID                    
EEA12100F39D100384D2080020F03012  
5426DEAF924642BB9A38DC0B5BE87ED6  

我们可以看到第一行将转换后的raw与文字匹配。

'5426deaf924642bb9a38dc0b5be87ed6'

通过隐式比较将SELECT MAMS_FOLDER_ID, 'EEA12100F39D100384D2080020F03012' AS TARGET FROM MAMS_FOLDER; 中的正式十六进制与文字进行匹配而不是将文字转换为MAMS_FOLDER_ID TARGET EEA12100F39D100384D2080020F03012 EEA12100F39D100384D2080020F03012 5426DEAF924642BB9A38DC0B5BE87ED6 EEA12100F39D100384D2080020F03012 RAW也可以在谓词中正常工作。 / p>

raw