QA@IT

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

5165 PV

お世話になります。

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の違いか

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

回答

ウォッチ

この質問への回答やコメントをメールでお知らせします。