QA@IT
«質問へ戻る

質問を投稿

PostgreSQLのバイナリデータ保存について

お世話になります。

RailsアプリでPostgreSQLを使用し、DBに画像データをバイナリデータとして保存しています。

環境によってDBに保存されるデータの形式が変わってしまいます。

正しいデータ(意図するデータ)

"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x05\xDC\x00\x00\x02X\b\x03\x00\x00\x00Om\xD4\x16\x00\x00\x00PLTED3\x1DoX8xdFc..."`

問題のデータ

"x89504e470d0a1a0a0000000d49484452000005dc0000025808..."

保存処理のコード

コンソールから再現できたのでその際のコードです(irb)。

file = ActionDispatch::Http::UploadedFile.new(tempfile: File.open(Rails.root.to_s + "/public/bg.png"))
image = MiniMagick::Image.read(file)
Master::Image.first.update_attribute(:data, image.to_blob)

上記を実行すると、Master::Image.first.dataに入っているバイナリデータに差異が出ます。

環境の差異

正しいデータとなる環境

ローカルの環境と、AWS上のAmazonLinux(DBとしてRDSを使用)では上手く行きました。

  • ローカルのMacOSX、homebrewにてpostgreSQL, ImageMagickをインストール
    • PostgreSQL 9.3.3 on x86_64-apple-darwin13.0.0, compiled by Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn), 64-bit
  • AWSのRDS
    • postgres(9.3.2)

問題のデータとなる環境

  • CentOS6.4
    • PostgreSQL 9.3.3 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit

VPS上のCentOSで現象を確認後、VMに構築したCentOSでも問題が再現しました。

DBへの保存処理後に違いが出ている(上記のコード例でimage.to_blobの値は正しいデータです)ので、
PostgreSQLの環境差異かと思っているのですが手詰まりになりました。

差異を調査するときに、

  • ImageMagickの違いなのか
  • PostgreSQLのバージョン差異なのか
  • それともgem pgの違いか

見当が付きません。調査すべき手順でも結構ですのでご教授のほどお願い致します。

お世話になります。

RailsアプリでPostgreSQLを使用し、DBに画像データをバイナリデータとして保存しています。

環境によってDBに保存されるデータの形式が変わってしまいます。


## 正しいデータ(意図するデータ)

 `"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x05\xDC\x00\x00\x02X\b\x03\x00\x00\x00Om\xD4\x16\x00\x00\x00`PLTED3\x1DoX8xdFc..."`


## 問題のデータ

`"x89504e470d0a1a0a0000000d49484452000005dc0000025808..."`

### 保存処理のコード

コンソールから再現できたのでその際のコードです(irb)。

``` irb
file = ActionDispatch::Http::UploadedFile.new(tempfile: File.open(Rails.root.to_s + "/public/bg.png"))
image = MiniMagick::Image.read(file)
Master::Image.first.update_attribute(:data, image.to_blob)
```

上記を実行すると、`Master::Image.first.data`に入っているバイナリデータに差異が出ます。

### 環境の差異

#### 正しいデータとなる環境

ローカルの環境と、AWS上のAmazonLinux(DBとしてRDSを使用)では上手く行きました。

- ローカルのMacOSX、homebrewにてpostgreSQL, ImageMagickをインストール
 - PostgreSQL 9.3.3 on x86_64-apple-darwin13.0.0, compiled by Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn), 64-bit
- AWSのRDS
 - postgres(9.3.2) 

#### 問題のデータとなる環境

- CentOS6.4
 - `PostgreSQL 9.3.3 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit`

VPS上のCentOSで現象を確認後、VMに構築したCentOSでも問題が再現しました。

DBへの保存処理後に違いが出ている(上記のコード例でimage.to_blobの値は正しいデータです)ので、
PostgreSQLの環境差異かと思っているのですが手詰まりになりました。

差異を調査するときに、

- ImageMagickの違いなのか
- PostgreSQLのバージョン差異なのか
- それともgem `pg`の違いか

見当が付きません。調査すべき手順でも結構ですのでご教授のほどお願い致します。