このトピックでは、バイナリ型の定義と構文について説明します。
名前 | ストレージサイズ | 説明 |
バイナリー | バイナリ文字列の長さと同じです。 | 固定長Nバイトのバイナリ文字列。 N: 1 ~ 8300の有効値。 |
BLOB | バイナリ文字列の長さに、バイナリ文字列の長さが127バイト未満の場合は1バイトを加えた値、バイナリ文字列の長さが127バイト以上の場合は4バイトを加えた値。 | 可変長のバイナリ文字列。 |
VARBINARY | バイナリ文字列の長さと同じです。 | 最大長がNバイトの可変長バイナリ文字列。 N: 1 ~ 8300の有効値。 |
BYTEA | 1バイトまたは4バイトにバイナリ文字列の実際の長さを加えたもの。 | 可変長のバイナリ文字列。 |
バイナリ文字列は、オクテットまたはバイトのシーケンスです。 バイナリ文字列は、2つの方法で文字列と区別される。 第1に、バイナリストリングは、値ゼロのオクテットおよび他の印刷不可能なオクテットを格納することができる。 ほとんどの場合、印刷不可能なオクテットは、10進数の範囲32〜126の外側のオクテットを示す。 文字列は値ゼロのオクテットを格納できません。 また、データベースの選択された文字セットのエンコーディングに基づいて無効なオクテット値とオクテット値のシーケンスを格納することはできません。 第2に、バイナリ文字列に対する演算は、実際のバイトを処理する。 ロケールの設定によって文字列の処理が異なります。 つまり、バイナリ文字列は、プログラマが生バイトと見なすデータを格納するのに適していますが、文字列はテキストを格納するのに適しています。
BYTEAタイプは、入力と出力に16進形式とエスケープ形式の2つの形式をサポートします。 両方のフォーマットは入力時に常に受け入れられます。 bytea_outputパラメーターは、出力形式を指定します。 デフォルトの出力形式はhexです。
SQL標準では、BLOBまたはbinary LARGE OBJECTと呼ばれる別のバイナリ文字列型を定義します。 BLOB入力形式はBYTEAとは異なりますが、それらが提供する関数と演算子はほとんど同じです。
BYTEAのHexフォーマット
16進形式は、バイナリデータを1バイトあたり2つの16進数字としてエンコードし、最上位ニブルを最初にします。 文字列全体の前には、エスケープ形式でエンコードされた文字列と文字列を区別するシーケンス \xがあります。 一部のシナリオでは、最初のバックスラッシュ (\) を2倍にしてエスケープする必要がある場合があります。 入力の場合、16進数は大文字または小文字にすることができます。 空白文字は、数字ペア間で許可され、数字ペア内または \xシーケンスでは許可されません。 hex形式は、さまざまな外部アプリケーションおよびプロトコルと互換性があり、エスケープ形式よりも高速な変換を提供します。 したがって、16進フォーマットが好ましい。
例:
select '\xDEADBEEF';エスケープ形式のBYTEA
エスケープ形式は、BYTEAタイプの従来の形式です。 エスケープフォーマットは、ASCII文字のシーケンスとしてバイナリ文字列を表し、ASCII文字として表すことができないバイトを特殊なエスケープシーケンスに変換します。 アプリケーションの観点から、文字としてバイトを表すことが意味をなす場合、この表現は便利であり得る。 しかし、実際には、この機構は、バイナリ文字列と文字列との区別を曖昧にし、特殊なエスケープ機構を処理することが困難であるため、ほとんどの場合混乱を招く。 したがって、エスケープ形式は、ほとんどの新しいアプリケーションに適用されない可能性があります。
エスケープ形式でBYTEA値を入力する場合、特定の値のオクテットをエスケープする必要があります。 すべてのオクテット値をエスケープすることができます。 ほとんどの場合、オクテットをエスケープするには、オクテットを3桁の8進値に変換し、その値の前にバックスラッシュ (\) を付けます。 バックスラッシュ (オクテット10進値92) は、二重バックスラッシュによって表すことができる。
文字通り逃げたオクテットのBYTEA
10進オクテット値 | 説明 | エスケープされた入力表現 | 例 | 六角表現 |
0 | ゼロオクテット |
|
|
|
39 | 一重引用符 |
|
|
|
92 | バックスラッシュ |
|
|
|
0から31および127から255 | 印刷不可能なオクテット |
|
|
|
印刷できないオクテットをエスケープするための要件は、ロケール設定によって異なります。 場合によっては、それらをエスケープしないままにすることができます。
このルールはSQL文のすべての文字列定数に適用できるため、単一引用符 (') を2倍にする必要があります。 汎用文字列リテラルパーサーは、最も外側の単一引用符を使用し、単一引用符のペアを1つのデータ文字に減らします。 BYTEA入力関数は、単一の引用符を共通のデータ文字として認識します。 ただし、BYTEA入力関数はバックスラッシュを特殊文字として認識します。
場合によっては、一般的な文字列リテラルパーサーもバックスラッシュのペアを1つのデータ文字に減らすため、バックスラッシュを2倍にする必要があります。 上記の表は例を示しています。
デフォルトでは、BYTEAオクテットはhex形式で生成されます。 bytea_outputパラメーターの値をescapeに変更すると、印刷できないオクテットは同等の3桁の8進値に変換され、値の前に1つのバックスラッシュが表示されます。 ほとんどの印刷可能なオクテットは、クライアント文字セットの標準表現形式で生成されます。 次のサンプルコードに例を示します。
set bytea_output = 'escape';
'abc \153\154\155 \052\251\124 'を選択::bytea;
bytea
----------------
abc klm *\251T 10進値92 (バックスラッシュ) のオクテットは、出力で2倍になります。
BYTEAの出力エスケープオクテット
10進オクテット値 | 説明 | エスケープされた出力表現 | 例 | 出力結果 |
92 | バックスラッシュ |
|
|
|
0から31および127から255 | 印刷不可能なオクテット |
|
|
|
32から126 | 印刷可能なオクテット | クライアント文字セット表現 |
|
|
使用するフロントエンドに基づいて、エスケープ文字列とエスケープされていないBYTEA文字列を処理するためにさらに多くのことを行う必要があります。 たとえば、ラインフィードとキャリッジリターンをインターフェイスで自動的に変換してもエスケープする必要がある場合があります。
BINARYおよびVARBINARY
BINARYデータは、Nバイトの固定長を有するバイナリ値である。 N: 1 ~ 8300の有効値。
BINARYデータはNバイトの記憶を必要とする。 列の最大サイズを満たすために、末尾のゼロがBINARYデータに追加されます。
VARBINARYデータは、最大長がNバイトのバイナリ値である。 N: 1 ~ 4194304の有効値。
例
テーブルbvar (col1 BINARY (10) 、col2 VARBINARY (10)) を作成します。テーブルt (col1 BINARY(10) 、COL2 VARBINARY(10)) を作成します。t値に挿入する (「0x4D795」、「0x39274D」) 。* をtから選択します。
col1 | col2
----------- --------------
0x4D795 | 0x39274D
(1行) BLOB
BLOB型は、非構造化バイナリラージオブジェクトの格納に使用されます。 BLOBデータのサイズは最大16 MBです。
の最大文字数を定義する必要はありません。 BLOB 同じ方法で列のデータの最大文字数を定義するVARBINARY データまたは他の可変長型のデータ。 次のサンプルコードは、BLOB列を定義する方法の例を示しています。
テーブルblob_contentを作成する (
id番号プライマリキー、
blob_column BLOB ); 次の関数を使用して、BLOBデータに対して操作を実行できます。
空のBLOBデータを初期化するには、EMPTY_BLOB関数を使用します。 BLOBデータをテーブルに直接挿入して、BLOBデータを初期化することもできます。
バイナリ値をBLOB型の値に変換するには、TO_LOBまたはTO_BLOB関数を使用します。