本節ではバイナリ文字列、すなわちbytea型の値を調べたり操作するための関数と演算子について説明します。
これらの多くは前節で説明されているテキスト文字列関数と、目的と構文という意味で同じです。
SQLでは、引数の区切りにカンマではなくキーワードを使う文字列関数を、いくつか定義しています。
詳細は表 9.11を参照してください。
またPostgreSQLは、これらの関数に対して通常の関数呼び出し構文を使用するバージョンを提供します(表 9.12を参照してください)。
表9.11 SQLバイナリ文字列関数と演算子
関数/演算子
説明
例
|
|---|
bytea || bytea
→ bytea
2つのバイナリ文字列を結合します。
'\x123456'::bytea || '\x789a00bcde'::bytea
→ \x123456789a00bcde
|
bit_length ( bytea )
→ integer
文字列中のビット数を返します(octet_lengthの8倍)。
bit_length('\x123456'::bytea)
→ 24
|
btrim ( bytes bytea,
bytesremoved bytea )
→ bytea
bytesからbytesremovedに現れるバイトのみを含む最長の文字列を先頭と末尾から取り除きます。
btrim('\x1234567890'::bytea, '\x9012'::bytea)
→ \x345678
|
ltrim ( bytes bytea,
bytesremoved bytea )
→ bytea
bytesの先頭からbytesremovedに現れるバイトだけを含む最長の文字列を削除します。
ltrim('\x1234567890'::bytea, '\x9012'::bytea)
→ \x34567890
|
octet_length ( bytea )
→ integer
バイナリ文字列中のバイト数を返します。
octet_length('\x123456'::bytea)
→ 3
|
overlay ( bytes bytea PLACING newsubstring bytea FROM start integer [ FOR count integer ] )
→ bytea
bytesのstart番目のバイトからcountバイトをnewsubstringで置き換えます。
countを省略するとnewsubstringの長さがデフォルトになります。
overlay('\x1234567890'::bytea placing '\002\003'::bytea from 2 for 3)
→ \x12020390
|
position ( substring bytea IN bytes bytea )
→ integer
bytes中のsubstringで指定する最初の文字列開始位置を返します。その文字列が存在しなければ0を返します。
position('\x5678'::bytea in '\x1234567890'::bytea)
→ 3
|
rtrim ( bytes bytea,
bytesremoved bytea )
→ bytea
bytesからbytesremovedに現れるバイトのみを含む最長の文字列を末尾から取り除きます。
rtrim('\x1234567890'::bytea, '\x9012'::bytea)
→ \x12345678
|
substring ( bytes bytea [ FROM start integer ] [ FOR count integer ] )
→ bytea
startが指定されていればstart番目の文字で始まるbytesの部分文字列を返します。
countが指定されていればcount数の文字で停止します。
少なくともstartかcountのどちらかを指定してください。
substring('\x1234567890'::bytea from 3 for 2)
→ \x5678
|
trim ( [ LEADING | TRAILING | BOTH ]
bytesremoved bytea FROM
bytes bytea )
→ bytea
bytesからbytesremovedに現れるバイトのみを含む最長の文字列を先頭、末尾、あるいはその両方(BOTHがデフォルト)から取り除きます。
trim('\x9012'::bytea from '\x1234567890'::bytea)
→ \x345678
|
trim ( [ LEADING | TRAILING | BOTH ] [ FROM ]
bytes bytea,
bytesremoved bytea )
→ bytea
これはtrim()の非標準構文です。
trim(both from '\x1234567890'::bytea, '\x9012'::bytea)
→ \x345678
|
この他、表 9.12に列挙するバイナリ文字列操作関数が使えます。
そのいくつかは、表 9.11で列挙した標準SQLの文字列関数を実装するため、内部的に使用されます。
表9.12 その他のバイナリ文字列関数
関数
説明
例
|
|---|
bit_count ( bytes bytea )
→ bigint
バイナリ文字列中のセットされているビットの数を返します(「popcount」としても知られています)。
bit_count('\x1234567890'::bytea)
→ 15
|
crc32 ( bytea )
→ bigint
バイナリ文字列のCRC-32値を計算します。
crc32('abc'::bytea)
→ 891568578
|
crc32c ( bytea )
→ bigint
バイナリ文字列のCRC-32C値を計算します。
crc32c('abc'::bytea)
→ 910901175
|
get_bit ( bytes bytea,
n bigint )
→ integer
バイナリ文字列のn番目のビットを取り出します。
get_bit('\x1234567890'::bytea, 30)
→ 1
|
get_byte ( bytes bytea,
n integer )
→ integer
バイナリ文字列のn番目のバイトを取り出します。
get_byte('\x1234567890'::bytea, 4)
→ 144
|
length ( bytea )
→ integer
バイナリ文字列のバイト数を返します。
length('\x1234567890'::bytea)
→ 5
|
length ( bytes bytea,
encoding name )
→ integer
与えられたencodingのテキストであると見なしてバイナリ文字列中の文字数を返します。
length('jose'::bytea, 'UTF8')
→ 4
|
md5 ( bytea )
→ text
バイナリ文字列のMD5ハッシュ計算し、16進数で結果を返します。
md5('Th\000omas'::bytea)
→ 8ab2d3c9689aaf18b4958c334c82d8b1
|
reverse ( bytea )
→ bytea
バイナリ文字列のバイトの順序を反転します。
reverse('\xabcd'::bytea)
→ \xcdab
|
set_bit ( bytes bytea,
n bigint,
newvalue integer )
→ bytea
バイナリ文字列のn番目のビットをnewvalueにします。
set_bit('\x1234567890'::bytea, 30, 0)
→ \x1234563890
|
set_byte ( bytes bytea,
n integer,
newvalue integer )
→ bytea
バイナリ文字列のn番目のバイトをnewvalueにします。
set_byte('\x1234567890'::bytea, 4, 64)
→ \x1234567840
|
sha224 ( bytea )
→ bytea
バイナリ文字列のSHA-224 ハッシュを計算します。
sha224('abc'::bytea)
→ \x23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
|
sha256 ( bytea )
→ bytea
バイナリ文字列のSHA-256 ハッシュを計算します。
sha256('abc'::bytea)
→ \xba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
|
sha384 ( bytea )
→ bytea
バイナリ文字列のSHA-384 ハッシュを計算します。
sha384('abc'::bytea)
→ \xcb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7
|
sha512 ( bytea )
→ bytea
バイナリ文字列のSHA-512 ハッシュを計算します。
sha512('abc'::bytea)
→ \xddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
|
substr ( bytes bytea, start integer [, count integer ] )
→ bytea
start番目の文字で始まるbytesの部分文字列を取り出します。
countが指定されていればcount数バイトを取り出します。
(substring(bytes from start for count)と同じです。)
substr('\x1234567890'::bytea, 3, 2)
→ \x5678
|
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 テキスト/バイナリ文字列変換関数
関数
説明
例
|
|---|
convert ( bytes bytea,
src_encoding name,
dest_encoding name )
→ bytea
文字符号化方式src_encodingのバイナリ文字列で表現したテキストを文字符号化方式dest_encodingのバイナリ文字列に変換します。(利用可能な変換は23.3.4を参照してください。)
convert('text_in_utf8', 'UTF8', 'LATIN1')
→ \x746578745f696e5f75746638
|
convert_from ( bytes bytea,
src_encoding name )
→ text
文字符号化方式src_encodingのバイナリ文字列で表現したテキストをデータベース文字符号化方式のテキストに変換します。(利用可能な変換は23.3.4を参照してください。)
convert_from('text_in_utf8', 'UTF8')
→ text_in_utf8
|
convert_to ( string text,
dest_encoding name )
→ bytea
text文字列(データベース文字符号化方式で表現)を文字符号化方式dest_encodingのバイナリ文字列に変換します。(利用可能な変換は23.3.4を参照してください。)
convert_to('some_text', 'UTF8')
→ \x736f6d655f74657874
|
encode ( bytes bytea,
format text )
→ text
バイナリデータをテキスト表現形式に符号化します。サポートされているformat値は、base64、escape、hexです。
encode('123\000\001', 'base64')
→ MTIzAAE=
|
decode ( string text,
format text )
→ bytea
テキスト表現からバイナリデータに復号します。
format値はencodeと同じです。
decode('MTIzAAE=', 'base64')
→ \x3132330001
|
encodeとdecode関数は以下のテキスト形式をサポートしています。
- base64
#
base64形式はRFC 2045 6.8節のものです。
RFCに従い、符号化された行は76文字に分割されます。
しかし、MIME CRLF行端指示子ではなくて単に改行が行端として使われます。
decode関数はキャリッジ・リターン、改行、空白、タブ文字を無視します。
行端パディング文字が不正な場合を含み、decodeに不正なbase64のデータが与えられるとエラーが生じます。
- escape
#
escape形式はゼロバイトとハイビットがセットされたバイトを8進エスケープシーケンス(\nnn)に変換し、バックスラッシュを二重化します。
他のバイト値は文字通りに表現されます。
バックスラッシュの後が二番目のバックスラッシュあるいは3つの8進数のどちらでもなければ、decode関数はエラーを生じます。他のバイト値はそのまま受け付けます。
- hex
#
hex形式はデータの各々の4ビットを、それぞれのバイトの上位桁を最初にして、0からfの16進数で表現します。
encode関数はa-fの16進数を小文字で出力します。
最小のデータ単位は8ビットなので、encodeが返す文字数は常に偶数です。
decode関数はa-fの文字が大文字でも小文字でも受け付けます。
decode関数は、奇数の文字数を含み、不正な16進データを与えられるとエラーが生じます。
さらに、bytea型から整数値にキャストすることも整数値からbytea型にキャストすることも可能です。
整数値をbyteaにキャストすると、整数型の幅に応じて、2、4、または8バイトで生成されます。
結果は整数の2の補数表現で、最上位バイトが先頭になります。
いくつかの例を示します。
1234::smallint::bytea \x04d2
cast(1234 as bytea) \x000004d2
cast(-1234 as bytea) \xfffffb2e
'\x8000'::bytea::smallint -32768
'\x8000'::bytea::integer 32768
byteaを整数にキャストする場合、byteaの長さが整数型の幅を超えるとエラーが発生します。
9.21内の集約関数string_aggと33.4内のラージオブジェクト関数も参照してください。