本節ではバイナリ文字列、すなわちbytea型の値を調べたり操作するための関数と演算子について説明します。
これらの多くは前節で説明されているテキスト文字列関数と、目的と構文という意味で同じです。
SQLでは、引数の区切りにカンマではなくキーワードを使う文字列関数を、いくつか定義しています。 詳細は表 9.11を参照してください。 またPostgreSQLは、これらの関数に対して通常の関数呼び出し構文を使用するバージョンを提供します(表 9.12を参照してください)。
表9.11 SQLバイナリ文字列関数と演算子
この他、表 9.12に列挙するバイナリ文字列操作関数が使えます。 そのいくつかは、表 9.11で列挙した標準SQLの文字列関数を実装するため、内部的に使用されます。
表9.12 その他のバイナリ文字列関数
関数 説明 例 |
|---|
バイナリ文字列中のセットされているビットの数を返します(「popcount」としても知られています)。
|
|
バイナリ文字列のn番目のビットを取り出します。
|
バイナリ文字列のn番目のバイトを取り出します。
|
|
バイナリ文字列のバイト数を返します。
|
与えられた
|
|
|
バイナリ文字列のMD5ハッシュ計算し、16進数で結果を返します。
|
|
バイナリ文字列のn番目のビットを
|
バイナリ文字列のn番目のバイトを
|
|
バイナリ文字列のSHA-224 ハッシュを計算します。
|
|
バイナリ文字列のSHA-256 ハッシュを計算します。
|
|
バイナリ文字列のSHA-384 ハッシュを計算します。
|
|
バイナリ文字列のSHA-512 ハッシュを計算します。
|
|
get_byteとset_byteはバイナリ文字列の先頭バイトを0バイトとして数えます。
get_bitとset_bitは各バイト内で右からビットを数えます。例えばビット0は先頭バイトの最下位ビットとなり、ビット15は第二バイトの最上位ビットとなります。
歴史的な理由により、md5は16進のエンコード値をtext型で返すのに対し、SHA-2関数はbyteaを返します。
両者の間の変換を行うには、関数encodeとdecodeを使ってください。
たとえば、16進のエンコードのテキスト表現を得るには、encode(sha256('abc'),'hex')、byteaを得るにはdecode(md5('abc'), 'hex')としてください。
異なる文字集合(文字符号化方式)間で文字列を変換する関数と、テキスト形式の任意のバイナリデータを表現する関数を表 9.13で示します。
引数あるいは結果のtext型はデータベースのデフォルト文字符号化方式で表現され、bytea型の引数あるいは結果は別の引数で指定する文字符号化方式名で表現されます。
表9.13 テキスト/バイナリ文字列変換関数
関数 説明 例 |
|---|
文字符号化方式
|
文字符号化方式
|
|
バイナリデータをテキスト表現形式に符号化します。サポートされている
|
テキスト表現からバイナリデータに復号します。
|
encodeとdecode関数は以下のテキスト形式をサポートしています。
base64形式はRFC 2045 6.8節のものです。
RFCに従い、符号化された行は76文字に分割されます。
しかし、MIME CRLF行端指示子ではなくて単に改行が行端として使われます。
decode関数はキャリッジ・リターン、改行、空白、タブ文字を無視します。
行端文字が不正な場合を含み、decodeに不正なbase64のデータが与えられるとエラーが生じます。
escape形式はゼロバイトとハイビットがセットされたバイトを8進エスケープシーケンス(\nnn)に変換し、バックスラッシュを二重化します。
他のバイト値は文字通りに表現されます。
バックスラッシュの後が二番目のバックスラッシュあるいは3つの8進数のどちらでもなければ、decode関数はエラーを生じます。他のバイト値はそのまま受け付けます。
hex形式はデータの各々の4ビットを、それぞれのバイトの上位桁を最初にして、0からfの16進数で表現します。
encode関数はa-fの16進数を小文字で出力します。
最小のデータ単位は8ビットなので、encodeが返す文字数は常に偶数です。
decode関数はa-fの文字が大文字でも小文字でも受け付けます。
decode関数は、奇数の文字数を含み、不正な16進データを与えられるとエラーが生じます。