所以,我有一个名为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()变得强制使用,否则显示空结果。为什么?
答案 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