簡體   English   中英

Oracle 11g hextoraw sql查詢結果

[英]Oracle 11g hextoraw sql query results

因此,我有一個名為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? 它是否需要對數據庫緩存進行某些操作?

更新:

好的,我知道如果我在大寫十六進制字符串中使用主鍵,那么即使不使用hextoraw(),查詢也可以正常工作(如我們在上面看到的)。 但是,如果使用小寫字母,則必須使用hextoraw(),否則將顯示空結果。 為什么呢

我相信您看到的內容是通過按字面值或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表的查詢,我相信帶有小寫文字謂詞的查詢找不到匹配項,因為在使用字符串文字作為謂詞時,隨后的類型轉換將比較RAWVARCHAR2 ,從而嘗試將形式十六進制char與小寫文字進行匹配焦炭。 (它不會將提供的文字轉換為raw ,而是將十六進制與文字進行比較)

由於HEXTORAW在轉換過程中將任何輸入字符串轉換為形式的十六進制,因此即使是比較char而不是raw ,其結果也仍然不同於普通文字。

因此,將轉換后的(大寫) RAW與小寫字母文字相匹配的簡單謂詞將不會導致匹配。 但是,當將大寫文字與RAW進行比較時,比較中使用的形式十六進制恰好匹配大寫字符串文字,並且謂詞已實現。

這是一個例子:

CREATE TABLE mams_folder (mams_folder_id RAW(32));

然后添加測試數據。 一項添加為大寫字母,另一項添加為小寫字母,依靠oracle隱式地進行任何所需的類型轉換

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

然后只是查詢以查看最初的外觀。 尚未涉及hextoraw

SELECT * FROM MAMS_FOLDER;

MAMS_FOLDER_ID                    
EEA12100F39D100384D2080020F03012  
5426DEAF924642BB9A38DC0B5BE87ED6  

注意插入的文字'5426deaf924642bb9a38dc0b5be87ed6'的打印值。

現在,該轉換將原始和大寫文字匹配進行比較。

在此查詢中:

SELECT MAMS_FOLDER_ID, 'EEA12100F39D100384D2080020F03012' AS TARGET FROM MAMS_FOLDER;

我們可以看到第一行將轉換后的raw與文字匹配。

MAMS_FOLDER_ID                    TARGET                            
EEA12100F39D100384D2080020F03012  EEA12100F39D100384D2080020F03012  
5426DEAF924642BB9A38DC0B5BE87ED6  EEA12100F39D100384D2080020F03012  

通過隱式比較,可以將RAW中的形式十六進制與文字進行匹配,而不是將文字轉換為rawUPPER在謂詞中也可以正常工作。

SELECT * FROM MAMS_FOLDER F WHERE F.MAMS_FOLDER_ID = UPPER('5426DEAF924642BB9A38DC0B5BE87ED6');

MAMS_FOLDER_ID                    
5426DEAF924642BB9A38DC0B5BE87ED6  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM