質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

9359閲覧

Postgreのbytea型とvarchar型の違いが判らない

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2018/08/11 05:32

bytea型とvarchar型の説明がわかりません。
Postgreのサイトを参考にしました。

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

この2点を初心者にわかりやすく説明してくださる方はいませんか。まったく、ピンときません。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

引用の続きに、

まとめると、バイナリ列はプログラマが"バイト列そのもの"と考えるものを格納するのに適し、文字列はテキストを格納するのに適しています。

とあり、ここに要約されています。

逆説的に説明すると、
文字型は文字としてしか扱うことが出来ないから、

文字列ではゼロというオクテットは使用できません。

(ゼロというオクテット→バイナリでの0)

また、データベースで選択している文字セット符号化方式で無効なオクテット値やオクテット値の並びも使用できません。

(utf8やsjis等の文字コードで許されている範囲ものしか格納できない※代入しようとするとエラーになる)

文字列の処理はロケール設定に従うということ

(バイナリとして演算しようとしても、型のエラーとなりできない)

というような事です。

投稿2018/08/11 07:27

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/11 07:33

回答ありがとうございます。少しわかりました。 しかし、varchar型にゼロをインサートできました。 バイナリでの0が使用できない意味がわかりません。
sazi

2018/08/11 07:46 編集

そのゼロとはどういう値ですか? 単に0とすると暗黙に文字に変換されます。 やるなら、decode('0', 'escape') として代入してみて下さい。
退会済みユーザー

退会済みユーザー

2018/08/11 07:57 編集

A5M2上で insert into exampletable values(0::bytea);実行 「cannot cast to integer to bytea」とエラーですが、 insert into test_tablee values(1::bytea);も同様でした。 次に、insert into test_tablee values('\000');とすると、 \000 と表示されました。
退会済みユーザー

退会済みユーザー

2018/08/11 07:56

A5M2上で insert into test_tablee values(decode('0', 'escape')); を実行しました。 すると \x30 としてセルに表示されました。
sazi

2018/08/11 08:02 編集

ゼロオクテットは、E'\000'::byteaと表すようです。※decode('0', 'escape') は忘れて下さい。 ゼロオクテットを文字型に代入すると暗黙で型変換が行われ文字で格納されるようです。 多分、文字として管理しやすいようにする為な気がしますが。
sazi

2018/08/11 08:04

エラーとする代わりに文字に変換しているようなので、どうやってもゼロオクテットでの格納はできないと思われます。
退会済みユーザー

退会済みユーザー

2018/08/11 08:10

親切に調べてくださりありがとうございます。 insert into testtesttest values(E'\000'::bytea); はセルに文字列として\x00と設定されました。しかし、 insert into testtesttest values(E'\001'::bytea); のように1というオクテットは\x01と設定されました。 ゼロと同じ扱いです。つまり、暗黙的に文字列に変換されています。 とすると、「文字列ではゼロというオクテットは使用できません。 」 とありますが、ゼロ以外のオクテットも設定できないようです。 postgresのドキュメントが間違えているのでしょうか? バージョンの違いでしょうか? それとも僕はどかかで理解していないのでしょうか?
sazi

2018/08/11 08:15 編集

「ゼロ以外のオクテットも設定できないようです。」これは >データベースで選択している文字セット符号化方式で無効なオクテット値やオクテット値の並びも使用できません。 ですね。ゼロというオクテットもこちらに含まれてはいます。
guest

0

投稿2018/08/11 06:34

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問