Oracle的raw資料型別

regonly1發表於2009-01-22

這個型別以前沒碰到過,知道昨天有人問我,我才研究了一下。
後來發現原來Oracle資料字典裡面本身就有很多地方用到這個資料型別,如v$process的addr欄位等。
這是一個什麼樣的型別?看了下資料說是用於儲存二進位制格式的資料的,但是這樣的儲存有什麼好處呢?google了好多下,有段說明感覺比較明白易懂:
在網路中的計算機之間傳輸 RAW 資料時,或者使用 Oracle 實用程式將 RAW 資料從一個資料庫移到另一個資料庫時,Oracle 伺服器不執行字符集轉換。儲存實際列值所需要的位元組數大小隨每行大小而異,最多為 2,000 位元組。
可能這樣的資料型別在資料庫效率上會提高,而且對資料由於字符集的不同而導致的不一致的可能性在這邊也排除了。
這個欄位在實際的用途中好像不多。
raw型別的介紹,在此引用了一下網友的blog:
RAW,類似於CHAR,宣告方式RAW(L),L為長度,以位元組為單位,作為資料庫列最大2000,作為變數最大32767位元組。
LONG RAW,類似於LONG,作為資料庫列最大儲存2G位元組的資料,作為變數最大32760位元組
測試:
SQL> create table datatype_test_raw(paddr raw(8));
 
Table created
 
SQL> insert into datatype_test_raw(paddr) values(utl_raw.cast_to_raw('This is a raw type test!'));
 
insert into datatype_test_raw(paddr) values(utl_raw.cast_to_raw('This is a raw type test!'))
 
ORA-01401: inserted value too large for column
 
SQL> alter table datatype_test_raw modify paddr raw(20);
 
Table altered
 
SQL> insert into datatype_test_raw(paddr) values(utl_raw.cast_to_raw('This is a raw type test!'));
 
insert into datatype_test_raw(paddr) values(utl_raw.cast_to_raw('This is a raw type test!'))
 
ORA-01401: inserted value too large for column
 
SQL> insert into datatype_test_raw(paddr) values(utl_raw.cast_to_raw('This is a raw test!'));
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> select * from datatype_test_raw;
 
PADDR
----------------------------------------
54686973206973206120726177207465737421
 
SQL> select utl_raw.cast_to_varchar2(paddr) from datatype_test_raw;
 
UTL_RAW.CAST_TO_VARCHAR2(PADDR
--------------------------------------------------------------------------------
This is a raw test!
 
SQL> insert into datatype_test_raw(paddr) values(utl_raw.cast_to_raw('中文測試'));
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> select utl_raw.cast_to_varchar2(paddr) from datatype_test_raw;
 
UTL_RAW.CAST_TO_VARCHAR2(PADDR
--------------------------------------------------------------------------------
This is a raw test!
中文測試
 
SQL> select paddr, utl_raw.cast_to_varchar2(paddr) from datatype_test_raw;
 
PADDR                           UTL_RAW.CAST_TO_VARCHAR2(PADDR
---------------------------------------- --------------------------------------------------------------------------------
54686973206973206120726177207465737421 This is a raw test!
D6D0CEC4B2E2CAD4 中文測試
 
這裡用到了兩個函式:
utl_raw.cast_to_raw([varchar2]);--將varchar2轉換為raw型別
utl_raw.cast_to_varchar2([raw]);--將raw轉換為varchar2型別
這裡varchar2的字符集一般是GB2312。

另外:
utl_raw包的幾個其他的函式用法:
utl_raw.cast_from_number([number]);
utl_raw.cast_to_number([number]);
位操作:
utl_raw.bit_or();
utl_raw.bit_and();
utl_raw.bit_xor();

另外還有轉換函式:
hextoraw(); --將對應16進位制數轉換為raw
關於raw和utl_raw的介紹到此結束。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-543073/,如需轉載,請註明出處,否則將追究法律責任。

相關文章