RAWは可変長データ型であり、異なる文字セットを持つデータベース間、または異なる文字セットを持つサーバーとクライアント間で、文字セット変換を必要とせずにバイナリデータストリームを転送することができます。本記事では、RAWデータ型の構文、パラメータ、使用方法について説明します。
RAW データ型は、画像や音声などのバイナリデータやバイト列を格納するために使用できます。
RAWデータ型のSQL構文は次のとおりです:
RAW(length)
ここで、パラメータ length はバイト単位の長さを表します。データベースのテーブル列として使用する場合、このパラメータは最大2000バイトのデータを格納できます。PL変数として使用する場合、このパラメータは最大32767バイトのデータを格納できます。
使用方法
暗黙変換ルール
データベースが RAW 型データを文字型(CHAR、VARCHAR2 など)に暗黙的に変換する必要がある場合、変換後の各文字は RAW 型データの連続する4ビットで表される16進数(0~9 および A~F または a~f)に対応します。例えば、RAW 型データとして格納されるバイナリビットが 11001011(8ビット、つまり1バイト)の場合、変換後は文字型データ 'CB'(2バイト)になります。
データベースが文字型データを RAW 型に暗黙的に変換する場合、文字列内の各文字が表す16進数を4ビットに変換します。例えば、文字列 'AB' は 0XAB (10101011) に変換されます。
注意
入力されたいずれかの文字が16進数(0~9 および A~F または a~f)でない場合、エラーが発生します。文字数が奇数の場合、RAW 型データの先頭に0を追加し、RAW 型の長さが整数バイトになるようにします。例えば、文字列 'ABC' を RAW 型に変換すると、0x0ABC に変換されます。ここで、0x0A が1バイトを占め、0xBC が1バイトを占めます。
明示的変換方法
SQL関数 RAWTOHEX() と HEXTORAW() は、上記の暗黙的変換と同等の明示的変換を実行します。PLシステムパッケージUTL_RAWとUTL_I18Nに含まれる関数を使用することで、RAW と文字データ間の他のタイプへの変換も可能です。
SQL関数 HEXTORAW() は、文字列内のデータを16進数に変換します。SQL関数 UTL_RAW.CAST_TO_RAW([VARCHAR2]) は、文字列内の各文字のASCIIコードを RAW 型のフィールドに格納します。例えば、051 を 303531 に変換します。
SQL関数 RAWTOHEX() を暗黙的に呼び出すことで、16進数文字列で表される RAW 型を文字列型(VARCHAR)に変換できます。これは、16進数データの文字列表現です。
RAW データ型関連の関数は以下の表のとおりです。
関数 |
説明 |
|---|---|
| HEXTORAW() | hextoraw を使用すると、文字列内のデータが16進数文字列に変換されます。文字列の各2文字が結果 RAW の1バイトを表します。 |
| RAWTOHEX(rawvalue) | RAW 型の値 rawvalue を対応する16進数表現の文字列に変換します。 rawvalue の各バイトは2バイトの文字列に変換されます。 |
| UTL_RAW.CAST_TO_RAW([VARCHAR2]) | データの格納内容は変更せず、データ型のみを変更して VARCHAR2 を RAW 型に変換します。 |
| UTL_RAW.CAST_TO_VARCHAR2([RAW]) | データの格納内容は変更せず、データ型のみを変更して RAW 型を VARCHAR2 型に変換します。 |
| UTL_RAW.BIT_OR() UTL_RAW.BIT_AND() UTL_RAW.BIT_XOR() | ビット演算。 |
例
test_rawテーブルにRAW型データを宣言し、テーブルにそれぞれ1件のデータを挿入します。obclient> CREATE TABLE test_raw (col1 RAW(10)); Query OK, 0 rows affected obclient> INSERT INTO test_raw VALUES (UTL_RAW.CAST_TO_RAW('1234567890')); Query OK, 1 row affected obclient> SELECT UTL_RAW.CAST_TO_VARCHAR2(col1) FROM test_raw; +--------------------------------+ | UTL_RAW.CAST_TO_VARCHAR2(COL1) | +--------------------------------+ | 1234567890 | +--------------------------------+ 1 row in setraw_test01テーブルに2件のデータを挿入し、関数を使用して変換します。obclient> CREATE TABLE raw_test01 (id NUMBER, raw_date RAW(10)); Query OK, 0 rows affected obclient> INSERT INTO raw_test01 VALUES (1, HEXTORAW('ff')); Query OK, 1 row affected obclient> INSERT INTO raw_test01 VALUES (2, UTL_RAW.CAST_TO_RAW('051')); Query OK, 1 row affected obclient> SELECT * FROM raw_test01; +------+----------+ | ID | RAW_DATE | +------+----------+ | 1 | FF | | 2 | 303531 | +------+----------+ 2 rows in set