[英]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
表的查詢,我相信帶有小寫文字謂詞的查詢找不到匹配項,因為在使用字符串文字作為謂詞時,隨后的類型轉換將比較RAW
和VARCHAR2
,從而嘗試將形式十六進制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
中的形式十六進制與文字進行匹配,而不是將文字轉換為raw
, UPPER
在謂詞中也可以正常工作。
SELECT * FROM MAMS_FOLDER F WHERE F.MAMS_FOLDER_ID = UPPER('5426DEAF924642BB9A38DC0B5BE87ED6');
MAMS_FOLDER_ID
5426DEAF924642BB9A38DC0B5BE87ED6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.