[11/15開催: PostgreSQL Conference Japan 2019 参加受付中] 
他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

8.4. バイナリ列データ型

byteaデータ型はバイナリ列の保存を可能にします。 表 8.6を参照してください。

表8.6 バイナリ列データ型

型名格納サイズ説明
bytea1または4バイトと実際のバイナリ列の長さ可変長のバイナリ列

バイナリ列はオクテット(またはバイト)の連続です。 バイナリ列は2つの点で文字列と区別されます。 1点目は、バイナリ列はゼロの値のオクテットと他の表示できないオクテット(通常10進数表記で32から126の範囲外のオクテット)を保存できるということです。 文字列ではゼロというオクテットは使用できません。 また、データベースで選択している文字セット符号化方式で無効なオクテット値やオクテット値の並びも使用できません。 2点目は、バイナリ列を演算すると実際のバイトが処理されるのに対して、文字列の処理はロケール設定に従うということです。 まとめると、バイナリ列はプログラマがバイト列そのものと考えるものを格納するのに適し、文字列はテキストを格納するのに適しています。

bytea型は入出力用に2つの書式をサポートします。 PostgreSQLの歴史的なエスケープ書式とhexです。 入力ではこれらの両方とも常に受け入れられます。 出力書式はbytea_output設定パラメータに依存し、デフォルトではhexです。 (hex書式はPostgreSQL 9.0から導入されたものであることに注意してください。 以前のバージョンや一部のツールではこれを理解しません。)

標準SQLは、BLOBまたはBINARY LARGE OBJECTという、異なるバイナリ列型を定義します。 入力書式はbyteaと異なりますが、提供される関数および演算子はほぼ同じです。

8.4.1. byteaのhex書式

hex書式ではバイナリデータの各バイトを上位4ビット、下位4ビットの順で2桁の16進数に符号化します。 (エスケープ書式と区別するために)文字列全体は\xという並びの後に付けられます。 一部の文脈では、先頭のバックスラッシュを二重にしてエスケープさせる必要があるかもしれません(以下を参照 4.1.2.1)。 これはエスケープ書式でバックスラッシュを二重にしなければならない場合と同じで、詳細は以下に示します。 入力する16進数の桁は大文字でも小文字でも構いません。 数字のペアの間に空白文字を入れることができます。 (しかし桁の組み合わせの間や先頭の\xの間には入れることはできません。) hex書式は外部のアプリケーションおよびプロトコルの間で広く互換性を持ち、また、エスケープ書式と比べ変換が高速になる傾向があります。 このため使用が好まれます。

SELECT '\xDEADBEEF';

8.4.2. byteaのエスケープ書式

エスケープ書式はbytea型用の伝統的なPostgreSQLの書式です。 これは、バイナリ列をASCII文字の並びとして表現しASCII文字として表現できないバイトは特殊なエスケープシーケンスとして表現するという方式を取ります。 アプリケーションの見地から文字として表現されたバイトが有意であれば、この表現は簡便です。 しかし現実にはバイナリ列と文字列の間の区別があいまいになりますので、通常は混乱します。 また選択されたこのエスケープ機構自体が多少非効率的です。 このためこの書式はおそらくほとんどの新しいアプリケーションでは避けるべきでしょう。

エスケープ書式でbytea値を入力する際に、特定の値のオクテットをエスケープする必要があります。 なお、すべてのオクテットの値をエスケープすることができます。 一般的にあるオクテットをエスケープするには、それをその3桁の8進数に変換し、バックスラッシュを前に付けます。 他にもバックスラッシュ自体(10進数表記のオクテットで92)を二重のバックスラッシュとして表現することができます。 表 8.7には、エスケープする必要がある文字と、その適用可能な代替エスケープシーケンスを示しています。

表8.7 オクテットをエスケープしたbyteaリテラル

10進オクテット値説明エスケープされた入力表現出力表現
0ゼロオクテット'\000'SELECT '\000'::bytea;\x00
39単一引用符''''もしくは'\047'SELECT ''''::bytea;\x27
92バックスラッシュ'\\'もしくは'\\134'SELECT '\\'::bytea;\x5c
0から31まで、および127から255まで表示できないオクテット'\xxx' (8進数)SELECT '\001'::bytea;\x01

実際には、表示できないオクテットに対するエスケープ要求はロケールの設定に依存して異なります。 ロケールの設定によっては、エスケープをしないで済むこともあります。

表 8.7で示したように、シングルクォートが二重に必要な理由は、SQLコマンド中のあらゆる文字列に当てはまるためです。 一般的な文字列パーサは最も外側のシングルクォートを消費し、一つの文字データのシングルクォートのペアを減らします。 byteaを入力する関数で単純なデータ文字を扱うために単に一つのシングルクォートを入力するケースが見られます。 しかし、byteaを入力する関数はバックスラッシュを特別なものとして扱うため、この関数で実装された表 8.7では異なる動作が見られます。

一般的な文字列パーサは一つの文字データのバックスラッシュのペアを減らすため、文脈によってはバックスラッシュは上記に見られるように、重ねる必要があります。 4.1.2.1も参照ください。

Byteaオクテットはデフォルトではhexフォーマットで出力されます。 bytea_outputescapeに変えると、表示できないオクテットは先頭にバックスラッシュがついた3桁のオクテットの値に変換されます。 ほとんどの表示可能なオクテットはクライアントキャラクタセットの標準的な表示で出力されます。例:

SET bytea_output = 'escape';

SELECT 'abc \153\154\155 \052\251\124'::bytea;
     bytea
----------------
 abc klm *\251T

10進数で92(バックスラッシュ)を持つオクテットは出力時に二重になります。 詳細は表 8.8を参照してください。

表8.8 bytea出力のエスケープされたオクテット

10進オクテット値説明エスケープされた出力表現出力結果
92バックスラッシュ\\SELECT '\134'::bytea;\\
0から31および127から255表示できないオクテット\xxx(8進数)SELECT '\001'::bytea;\001
32から126表示できるオクテットクライアント文字セットにおける表現SELECT '\176'::bytea;~

使用するPostgreSQLのフロントエンドによっては、bytea文字列をエスケープまたはアンエスケープする際に、追加的な作業が必要になることがあります。 例えば、使用するインタフェースが改行文字や復帰文字を自動的に翻訳してしまう場合、これらの文字もエスケープしなければならないかもしれません。