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