Vincent Malgrat の回答を参照してください。バイナリ データを Oracle に格納して処理する場合は、RAW
データ型が最適です。
(アレゲンの答えが暗示しているように、データベースで「処理」する必要のない画像、ビデオ、オーディオ、または圧縮データを保存および取得することを意図している場合、それを「保存」して「取得」しているだけですの場合、BLOB
データ型の方が適切な場合があります。
(注: RAW データ型は 4000 バイトに制限されていますが、BLOB データ型はそうではありません。パフォーマンス上の理由から、定期的に値. 多くのクエリがバイナリデータを参照していない、はるかに長い値の場合、私はBLOB
. 、ブロックに収まる行数など)RAW
BLOB
あなたが提供した情報から、あなたが説明した特定の問題については、RAW
行くべき道のように聞こえます。1000 ビットのシーケンスがあることを指定しますが、それが定数なのか最大長なのか、またはバイナリ データの長い文字列を列に収まるより管理しやすいチャンクに分割したのかどうかはまったく明確ではありません。(実際にバイナリ データの単一の巨大なチャンクを操作している場合は、それを小さな断片の束に「切り刻む」ことや、各断片を別々の行に格納することは避けたいと考えています。すべてを単一の BLOB としてまとめて保存し、単純なストリームとして操作します。
これらすべてが、BLOB と RAW のどちらを使用するかの決定に実際に役立ちます。
それはさておき、1 と 0 の VARCHAR2 表現 (たとえば、「00101010」、実際の情報の各「ビット」が個別の文字として格納され、より効率的に格納されたバイナリ表現、各「8 ビット」 " 1 バイトのストレージを必要とする実情報の...
OracleRAW
データ型では、8 ビットが 1 バイトに格納されます。つまり、RAW(125) は VARCHAR2(1000) に相当するものを格納し、1 行あたり 875 バイト節約できます (SBCS の場合、DBCS を使用している場合の 2 倍以上)。これにより、ストレージ要件が大幅に削減され、ブロック内の行数が増え、パフォーマンスが向上する可能性があります。
現在1と0の文字列として保存されているデータを変換するためにVARCHAR2
、それを行う組み込み関数を知りません。しかし、バイナリ文字列表現を 16 進文字列表現に変換する独自の関数をロールするのはかなり簡単です。その後、組み込みHEXTORAW
関数を使用して に変換できますRAW
。
出発点として使用できる例を次に示します。
(注: この関数は単なる例です。入力文字列の長さが 8 文字の倍数でない場合は効果的に処理されません。また、'1' または '0' 以外の文字を含む文字列値での動作です。適切ではないかもしれません(書かれているように、「0」以外の文字は「1」であるかのように扱われます。しかし、出発点としては十分です)。
create or replace function binstr_to_hexstr
( as_binstr in varchar2 ) return varchar2
is
li_n binary_integer default 0;
ls_hexstr varchar2(16) default '0123456789ABCDEF';
ls_return varchar2(2000) default '';
begin
if ( as_binstr is null ) then
return null;
end if;
ls_return := '';
li_n := 0;
for i in 1 .. length(as_binstr) loop
li_n := li_n*2 + abs(instr('01',substr(as_binstr,i,1))-1);
if mod(i,4) = 0 then
ls_return := ls_return || substr(ls_hexstr,li_n+1,1);
li_n := 0;
end if;
end loop;
return ls_return;
end;
/
SELECT binstr_to_hexstr('00101010') AS hexstr FROM DUAL UNION ALL
SELECT binstr_to_hexstr('00x0 010') FROM DUAL;
HEXSTR
------
2A
2A
注: この関数は、入力文字列の長さが 8 の偶数倍 (つまりMOD(length(as_binstr),8) = 0
) の場合にのみ、期待される結果 (一致する 16 進表現) を返します。それ以外の場合、関数は末尾のビットを「失う」か、奇数の 16 進数を返します。(関数は、入力引数の長さが 8 の倍数でない場合に例外をスローするように変更できます。)
HEXTORAW
およびRAWTOHEX
関数は、TOAD、SQL Developer、SQL*Plus などのクライアント アプリケーションを使用してデータを操作する場合に便利ですRAW
。(HEXTORAW
関数は、関数からの出力を RAW に変換するために使用するものbinstr_to_hexstr
です。)例として:
create or replace function binstr_to_raw
( as_binstr in varchar2 ) return raw
is
begin
return hextoraw(binstr_to_hexstr(as_binstr));
end;
/
Vincent Malgrat が彼の回答で指摘したように、Oracle はRAW データの操作に役立ついくつかのパッケージ (UTL_RAW
および など) を提供しています。UTL_ENCODE
http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_raw.htm